├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── dictionaries │ └── cenxiaozhong.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── queue │ │ └── sample │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── queue │ │ │ └── sample │ │ │ └── MainActivity.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── queue │ └── sample │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── queue │ │ └── library │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── queue │ │ └── library │ │ ├── BlockingRunnable.java │ │ ├── DispatchPairExchanger.java │ │ ├── DispatchThread.java │ │ ├── GlobalQueue.java │ │ ├── SameThreadExchanger.java │ │ └── ThreadConfig.java │ └── test │ └── java │ └── com │ └── queue │ └── library │ └── ExampleUnitTest.java ├── package-lock.json └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.war 15 | *.nar 16 | *.ear 17 | *.zip 18 | *.tar.gz 19 | *.rar 20 | 21 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 22 | hs_err_pid* 23 | *.iml 24 | .gradle 25 | /local.properties 26 | /.idea/caches 27 | /.idea/libraries 28 | /.idea/modules.xml 29 | /.idea/workspace.xml 30 | /.idea/navEditor.xml 31 | /.idea/assetWizardSettings.xml 32 | .DS_Store 33 | /build 34 | /captures 35 | .externalNativeBuild 36 | .cxx 37 | package.json 38 | node_modules -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | xmlns:android 11 | 12 | ^$ 13 | 14 | 15 | 16 |
17 |
18 | 19 | 20 | 21 | xmlns:.* 22 | 23 | ^$ 24 | 25 | 26 | BY_NAME 27 | 28 |
29 |
30 | 31 | 32 | 33 | .*:id 34 | 35 | http://schemas.android.com/apk/res/android 36 | 37 | 38 | 39 |
40 |
41 | 42 | 43 | 44 | .*:name 45 | 46 | http://schemas.android.com/apk/res/android 47 | 48 | 49 | 50 |
51 |
52 | 53 | 54 | 55 | name 56 | 57 | ^$ 58 | 59 | 60 | 61 |
62 |
63 | 64 | 65 | 66 | style 67 | 68 | ^$ 69 | 70 | 71 | 72 |
73 |
74 | 75 | 76 | 77 | .* 78 | 79 | ^$ 80 | 81 | 82 | BY_NAME 83 | 84 |
85 |
86 | 87 | 88 | 89 | .* 90 | 91 | http://schemas.android.com/apk/res/android 92 | 93 | 94 | ANDROID_ATTRIBUTE_ORDER 95 | 96 |
97 |
98 | 99 | 100 | 101 | .* 102 | 103 | .* 104 | 105 | 106 | BY_NAME 107 | 108 |
109 |
110 |
111 |
112 |
113 |
-------------------------------------------------------------------------------- /.idea/dictionaries/cenxiaozhong.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 36 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 41 | 42 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | Android > Lint > Correctness 86 | 87 | 88 | Android > Lint > Performance 89 | 90 | 91 | Android > Lint > Security 92 | 93 | 94 | Compiler issuesJava 95 | 96 | 97 | GPath inspectionsGroovy 98 | 99 | 100 | Groovy 101 | 102 | 103 | Internationalization issuesJava 104 | 105 | 106 | JSON 107 | 108 | 109 | Java 110 | 111 | 112 | Performance issuesJava 113 | 114 | 115 | Properties Files 116 | 117 | 118 | Properties FilesJava 119 | 120 | 121 | 122 | 123 | Android 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 135 | 136 | 137 | 138 | 139 | 1.8 140 | 141 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 157 | 158 | 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## 拓展了Android OS MessageQueue 3 | 4 | ### Dispatch Queue是一个扩展Android MessageQueue的超高性能队列,类似协程支持同步返回,同时也支持异步执行,可包装主线程,灵活调度 5 | 6 | 7 | ## 引入 8 | 9 | * Gradle 10 | 11 | 12 | ```gradle 13 | implementation 'com.github.Justson:dispatch-queue:v1.0.5' 14 | ``` 15 | 16 | 17 | ## 特性 18 | 19 | * 线程可以配对交换元素在同步点 20 | * 线程空闲后执行task 21 | * 阻塞执行 22 | * 线程之间交叉执行 23 | 24 | 25 | ## 控制线程执行顺序 26 | 27 | ``` 28 | final StringBuffer output = new StringBuffer(); 29 | AsyncTask.execute(() -> { 30 | output.append(1).append(", "); 31 | GlobalQueue.getMainQueue().postRunnableBlocking(() -> { 32 | // do you work , in the main-Thread 33 | output.append(2).append(", "); 34 | 35 | }); 36 | output.append(3).append(", "); 37 | 38 | // invoke in the main-Thread and return a string data 39 | String message = GlobalQueue.getMainQueue().call(() -> { 40 | output.append(4).append(", "); 41 | return "hello world"; 42 | }); 43 | output.append(5).append(" data ").append(message); 44 | System.out.println(output.toString()); 45 | // output the order "1 2 3 4 5" 46 | }); 47 | ``` 48 | 49 | ```java 50 | output the order :1, 2, 3, 4, 5 51 | ``` 52 | 53 | 54 | 55 | ## 创建 DispatchThread 56 | 57 | ``` 58 | DispatchThread messageDispatch = DispatchThread.create("message"); 59 | 60 | messageDispatch.postRunnable(() -> { 61 | // do you work , work in message thread 62 | }); 63 | 64 | System.out.println("1"); 65 | messageDispatch.postRunnableScissors(() -> { 66 | System.out.println("2"); 67 | }); 68 | System.out.println("3"); 69 | // output 1 2 3 70 | 71 | // from message thread get a number, it will blocking until working finish. 72 | int i = messageDispatch.call(() -> 1); 73 | ``` 74 | 75 | 76 | 77 | ## 线程空闲执行 78 | 79 | ``` 80 | messageDispatch.postRunnableInIdleRunning(() -> { 81 | // do your work , when the message thread idle will callback this runable 82 | }); 83 | ``` 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.queue.sample" 9 | minSdkVersion 16 10 | targetSdkVersion 29 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 | } 16 | 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | compileOptions { 24 | sourceCompatibility = 1.8 25 | targetCompatibility = 1.8 26 | } 27 | 28 | } 29 | 30 | dependencies { 31 | implementation fileTree(dir: 'libs', include: ['*.jar']) 32 | 33 | implementation 'androidx.appcompat:appcompat:1.1.0' 34 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 35 | testImplementation 'junit:junit:4.12' 36 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 37 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 38 | implementation project(path: ':library') 39 | // implementation 'com.github.Justson:dispatch-queue:v1.0.4' 40 | } 41 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/queue/sample/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.queue.sample; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.queue.sample", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/queue/sample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.queue.sample; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.queue.library.DispatchThread; 6 | import com.queue.library.DispatchThread; 7 | 8 | import androidx.appcompat.app.AppCompatActivity; 9 | 10 | public class MainActivity extends AppCompatActivity { 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_main); 16 | 17 | 18 | // /** 19 | // * use a 20 | // */ 21 | // final StringBuffer output = new StringBuffer(); 22 | // AsyncTask.execute(() -> { 23 | // output.append(1).append("-").append(Thread.currentThread().getName()).append(", "); 24 | // GlobalQueue.getMainQueue().postRunnableBlocking(() -> { 25 | // // do you work , in the main-Thread 26 | // output.append(2).append("-").append(Thread.currentThread().getName()).append(", "); 27 | // 28 | // }); 29 | // output.append(3).append("-").append(Thread.currentThread().getName()).append(", "); 30 | // 31 | // // invoke in the main-Thread and return a string data 32 | // String message = GlobalQueue.getMainQueue().call(() -> { 33 | // output.append(4).append("-").append(Thread.currentThread().getName()).append(", "); 34 | // return "hello world"; 35 | // }); 36 | // output.append(5).append("-").append(Thread.currentThread().getName()).append(" data ").append(message); 37 | // System.out.println(output.toString()); 38 | // // output the order "1 2 3 4" 39 | // }); 40 | 41 | // final StringBuffer output = new StringBuffer(); 42 | // AsyncTask.execute(() -> { 43 | // output.append(1).append(", "); 44 | // GlobalQueue.getMainQueue().postRunnableBlocking(() -> { 45 | // // do you work , in the main-Thread 46 | // output.append(2).append(", "); 47 | // 48 | // }); 49 | // output.append(3).append(", "); 50 | // 51 | // // invoke in the main-Thread and return a string data 52 | // String message = GlobalQueue.getMainQueue().call(() -> { 53 | // output.append(4).append(", "); 54 | // return "hello world"; 55 | // }); 56 | // output.append(5).append(" data ").append(message); 57 | // System.out.println(output.toString()); 58 | // // output the order "1 2 3 4" 59 | // }); 60 | 61 | DispatchThread.create(); 62 | 63 | /** 64 | * use b 65 | */ 66 | DispatchThread messageDispatch = DispatchThread.create("message"); 67 | 68 | messageDispatch.postRunnable(() -> { 69 | // do you work , work in message thread 70 | }); 71 | 72 | System.out.println("1"); 73 | messageDispatch.postRunnableScissors(() -> { 74 | System.out.println("2"); 75 | }); 76 | System.out.println("3"); 77 | // output 1 2 3 78 | 79 | // from message thread get a number, it will blocking until working finish. 80 | int i = messageDispatch.call(() -> 1); 81 | 82 | 83 | messageDispatch.postRunnableInIdleRunning(() -> { 84 | // do your work , when the message thread idle will callback this runable 85 | }); 86 | } 87 | 88 | 89 | } 90 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Queue 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/com/queue/sample/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.queue.sample; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | maven { url 'https://jitpack.io' } 7 | google() 8 | jcenter() 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:3.6.3' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | maven { url 'https://jitpack.io' } 21 | google() 22 | jcenter() 23 | } 24 | } 25 | 26 | task clean(type: Delete) { 27 | delete rootProject.buildDir 28 | } 29 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | 21 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Jul 11 22:33:09 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /library/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.3" 6 | 7 | defaultConfig { 8 | minSdkVersion 16 9 | targetSdkVersion 29 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 14 | consumerProguardFiles 'consumer-rules.pro' 15 | } 16 | 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | 29 | testImplementation 'junit:junit:4.12' 30 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 31 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 32 | } 33 | -------------------------------------------------------------------------------- /library/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Justson/dispatch-queue/82e9c449fbabe5e2aa7ba755115b2d470d0b8d22/library/consumer-rules.pro -------------------------------------------------------------------------------- /library/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /library/src/androidTest/java/com/queue/library/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.queue.library; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.queue.library.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /library/src/main/java/com/queue/library/BlockingRunnable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) Justson(https://github.com/Justson/Queue) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.queue.library; 17 | 18 | import android.os.Handler; 19 | import android.os.SystemClock; 20 | 21 | /** 22 | * @author cenxiaozhong 23 | * @date 2019/2/15 24 | * @since 1.0.0 25 | */ 26 | 27 | public final class BlockingRunnable implements Runnable { 28 | private final Runnable mTask; 29 | private boolean mDone; 30 | 31 | public BlockingRunnable(Runnable task) { 32 | mTask = task; 33 | } 34 | 35 | @Override 36 | public void run() { 37 | try { 38 | mTask.run(); 39 | } finally { 40 | synchronized (this) { 41 | mDone = true; 42 | notifyAll(); 43 | } 44 | } 45 | } 46 | 47 | public boolean postAndWait(Handler handler, long timeout) { 48 | if (!handler.post(this)) { 49 | return false; 50 | } 51 | 52 | synchronized (this) { 53 | if (timeout > 0) { 54 | final long expirationTime = SystemClock.uptimeMillis() + timeout; 55 | while (!mDone) { 56 | long delay = expirationTime - SystemClock.uptimeMillis(); 57 | if (delay <= 0) { 58 | return false; 59 | } 60 | try { 61 | wait(delay); 62 | } catch (InterruptedException ex) { 63 | } 64 | } 65 | } else { 66 | while (!mDone) { 67 | try { 68 | wait(); 69 | } catch (InterruptedException ignored) { 70 | } 71 | } 72 | } 73 | } 74 | return true; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /library/src/main/java/com/queue/library/DispatchPairExchanger.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) Justson(https://github.com/Justson/Queue) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.queue.library; 17 | 18 | import java.util.concurrent.Exchanger; 19 | import java.util.concurrent.TimeUnit; 20 | import java.util.concurrent.TimeoutException; 21 | 22 | /** 23 | * @author cenxiaozhong 24 | * @date 2019/2/15 25 | * @since 1.0.0 26 | */ 27 | public class DispatchPairExchanger extends Exchanger { 28 | private final long mThreadId; 29 | private final String mThreadName; 30 | 31 | public DispatchPairExchanger() { 32 | mThreadId = Thread.currentThread().getId(); 33 | mThreadName = Thread.currentThread().getName(); 34 | } 35 | 36 | V exchange0(V x) throws InterruptedException { 37 | return super.exchange(x); 38 | } 39 | 40 | V exchange0(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { 41 | return super.exchange(x, timeout, unit); 42 | } 43 | 44 | @Override 45 | public V exchange(V x) throws InterruptedException { 46 | long id = Thread.currentThread().getId(); 47 | if (id != mThreadId) { 48 | throw new RuntimeException("you must call exchange in the thread id:" + id + " thread name:" + mThreadName); 49 | } 50 | return super.exchange(x); 51 | } 52 | 53 | @Override 54 | public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { 55 | long id = Thread.currentThread().getId(); 56 | if (id != mThreadId) { 57 | throw new RuntimeException("you must call exchange in the thread id:" + id + " thread name:" + mThreadName); 58 | } 59 | return super.exchange(x, timeout, unit); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /library/src/main/java/com/queue/library/DispatchThread.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) Justson(https://github.com/Justson/Queue) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.queue.library; 17 | 18 | import android.os.Build; 19 | import android.os.Handler; 20 | import android.os.HandlerThread; 21 | import android.os.Looper; 22 | import android.os.Message; 23 | import android.os.MessageQueue; 24 | import android.os.Process; 25 | 26 | import java.lang.reflect.Field; 27 | import java.util.concurrent.Callable; 28 | import java.util.concurrent.Exchanger; 29 | import java.util.concurrent.Executor; 30 | import java.util.concurrent.TimeUnit; 31 | import java.util.concurrent.TimeoutException; 32 | 33 | /** 34 | * @author cenxiaozhong 35 | * @date 2019/2/15 36 | * @since 1.0.0 37 | */ 38 | public class DispatchThread implements Executor { 39 | 40 | private static final String TAG = DispatchThread.class.getSimpleName(); 41 | private final Handler handler; 42 | private final Looper mLooper; 43 | private long ms = 5000L; 44 | private static final Object T_OBJECT = new Object(); 45 | private MessageQueue mMessageQueue; 46 | 47 | private final SameThreadExchanger exchanger = new SameThreadExchanger<>(); 48 | private static final ThreadLocal> EXCHANGER_THREAD_LOCAL = new ThreadLocal>() { 49 | @Override 50 | protected Exchanger initialValue() { 51 | return new DispatchPairExchanger<>(); 52 | } 53 | }; 54 | 55 | public static DispatchThread create() { 56 | return create("DispatchThread-" + ThreadConfig.getUniqueThreadId()); 57 | } 58 | 59 | public static DispatchThread create(String name) { 60 | return create(name, Process.THREAD_PRIORITY_DEFAULT); 61 | } 62 | 63 | public static DispatchThread create(String name, int priority) { 64 | HandlerThread handlerThread = new HandlerThread(name, priority); 65 | handlerThread.start(); 66 | Looper looper = handlerThread.getLooper(); 67 | return new DispatchThread(looper); 68 | } 69 | 70 | private static T requireNonNull(T obj) { 71 | if (obj == null) 72 | throw new NullPointerException(); 73 | return obj; 74 | } 75 | 76 | /** 77 | * Only allow invoke in looper prepare thread 78 | */ 79 | public DispatchThread() { 80 | this(requireNonNull(Looper.myLooper())); 81 | } 82 | 83 | public DispatchThread(Looper looper) { 84 | requireNonNull(looper); 85 | this.mLooper = looper; 86 | this.handler = new Handler(looper); 87 | } 88 | 89 | public void sendMessage(Message msg) { 90 | this.sendMessage(msg, 0); 91 | } 92 | 93 | public void sendMessage(Message msg, int delay) { 94 | if (delay <= 0) { 95 | handler.sendMessage(msg); 96 | } else { 97 | handler.sendMessageDelayed(msg, delay); 98 | } 99 | } 100 | 101 | public void cancelRunnable(Runnable runnable) { 102 | handler.removeCallbacks(runnable); 103 | } 104 | 105 | public Exchanger exchange(final Callable callable) { 106 | try { 107 | if (Looper.myLooper() == getLooper()) { 108 | T t = null; 109 | try { 110 | t = callable.call(); 111 | } catch (Exception e) { 112 | e.printStackTrace(); 113 | } 114 | exchanger.setV(t); 115 | return (Exchanger) exchanger; 116 | } 117 | final DispatchPairExchanger exchanger = (DispatchPairExchanger) EXCHANGER_THREAD_LOCAL.get(); 118 | handler.post(new Runnable() { 119 | @Override 120 | public void run() { 121 | T t = null; 122 | try { 123 | t = callable.call(); 124 | } catch (Exception e) { 125 | e.printStackTrace(); 126 | } 127 | try { 128 | if (ms < 0) { 129 | exchanger.exchange0(t); 130 | } else { 131 | exchanger.exchange0(t, ms, TimeUnit.MILLISECONDS); 132 | } 133 | } catch (Exception e) { 134 | e.printStackTrace(); 135 | } 136 | } 137 | }); 138 | return exchanger; 139 | } catch (Exception e) { 140 | e.printStackTrace(); 141 | } 142 | throw new UnknownError("UnknownError exchange error "); 143 | } 144 | 145 | public T call(Callable callable) { 146 | try { 147 | return call(callable, -1L); 148 | } catch (TimeoutException e) { 149 | e.printStackTrace(); 150 | } 151 | throw new UnknownError("UnknownError exchange error "); 152 | } 153 | 154 | public T call(Callable callable, long timeout) throws TimeoutException { 155 | Exchanger exchanger = exchange(callable); 156 | try { 157 | if (timeout < 0) { 158 | return exchanger.exchange((T) T_OBJECT); 159 | } else { 160 | return exchanger.exchange((T) T_OBJECT, timeout, TimeUnit.MILLISECONDS); 161 | } 162 | } catch (InterruptedException e) { 163 | e.printStackTrace(); 164 | } 165 | return null; 166 | } 167 | 168 | public void postRunnableBlocking(final Runnable runnable) { 169 | call(new Callable() { 170 | @Override 171 | public Void call() throws Exception { 172 | runnable.run(); 173 | return null; 174 | } 175 | }); 176 | } 177 | 178 | 179 | public void postRunnableScissors(final Runnable runnable) { 180 | this.postRunnableScissors(runnable, -1L); 181 | } 182 | 183 | public void postRunnableScissors(final Runnable runnable, long timeout) { 184 | if (Looper.myLooper() == getLooper()) { 185 | runnable.run(); 186 | return; 187 | } 188 | new BlockingRunnable(runnable).postAndWait(handler, timeout); 189 | } 190 | 191 | public void postRunnable(Runnable runnable) { 192 | postRunnable(runnable, 0); 193 | } 194 | 195 | public void postRunnable(Runnable runnable, long delay) { 196 | if (delay <= 0) { 197 | handler.post(runnable); 198 | } else { 199 | handler.postDelayed(runnable, delay); 200 | } 201 | } 202 | 203 | 204 | public void postRunnableImmediately(Runnable runnable) { 205 | if (Looper.myLooper() == getLooper()) { 206 | runnable.run(); 207 | return; 208 | } 209 | postAtFont(runnable); 210 | } 211 | 212 | 213 | public void post(Runnable runnable) { 214 | if (Looper.myLooper() == getLooper()) { 215 | runnable.run(); 216 | return; 217 | } 218 | postRunnable(runnable); 219 | } 220 | 221 | public void postAtFont(Runnable runnable) { 222 | handler.postAtFrontOfQueue(runnable); 223 | } 224 | 225 | public void cleanupQueue() { 226 | handler.removeCallbacksAndMessages(null); 227 | } 228 | 229 | public Handler getHandler() { 230 | return this.handler; 231 | } 232 | 233 | public Looper getLooper() { 234 | return mLooper; 235 | } 236 | 237 | public boolean addIdleHandler(MessageQueue.IdleHandler idleHandler) { 238 | MessageQueue messageQueue = getMessageQueue(); 239 | if (messageQueue == null) { 240 | return false; 241 | } 242 | messageQueue.addIdleHandler(idleHandler); 243 | return true; 244 | } 245 | 246 | public boolean postRunnableInIdleRunning(final Runnable runnable) { 247 | MessageQueue messageQueue = getMessageQueue(); 248 | if (messageQueue == null) { 249 | return false; 250 | } 251 | messageQueue.addIdleHandler(new MessageQueue.IdleHandler() { 252 | @Override 253 | public boolean queueIdle() { 254 | runnable.run(); 255 | return false; 256 | } 257 | }); 258 | return true; 259 | } 260 | 261 | synchronized MessageQueue getMessageQueue() { 262 | if (null != this.mMessageQueue) { 263 | return this.mMessageQueue; 264 | } 265 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 266 | this.mMessageQueue = mLooper.getQueue(); 267 | return this.mMessageQueue; 268 | } 269 | Class clazz = mLooper.getClass(); 270 | try { 271 | Field field = clazz.getDeclaredField("mQueue"); 272 | field.setAccessible(true); 273 | Object mQueue = field.get(mLooper); 274 | if (mQueue instanceof MessageQueue) { 275 | this.mMessageQueue = (MessageQueue) mQueue; 276 | } 277 | } catch (NoSuchFieldException e) { 278 | e.printStackTrace(); 279 | } catch (IllegalAccessException e) { 280 | e.printStackTrace(); 281 | } 282 | return this.mMessageQueue; 283 | } 284 | 285 | public boolean quit() { 286 | Looper looper = getLooper(); 287 | if (looper != null) { 288 | looper.quit(); 289 | return true; 290 | } 291 | return false; 292 | } 293 | 294 | @Override 295 | public void execute(Runnable command) { 296 | postRunnable(command); 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /library/src/main/java/com/queue/library/GlobalQueue.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) Justson(https://github.com/Justson/Queue) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.queue.library; 17 | 18 | import android.os.Looper; 19 | 20 | /** 21 | * @author cenxiaozhong 22 | * @date 2020/7/5 23 | * @since 1.0.0 24 | */ 25 | public final class GlobalQueue { 26 | private static volatile DispatchThread mMainQueue = null; 27 | 28 | public static DispatchThread getMainQueue() { 29 | if (mMainQueue == null) { 30 | synchronized (GlobalQueue.class) { 31 | if (mMainQueue == null) { 32 | mMainQueue = new DispatchThread(Looper.getMainLooper()); 33 | } 34 | } 35 | } 36 | return mMainQueue; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /library/src/main/java/com/queue/library/SameThreadExchanger.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) Justson(https://github.com/Justson/Queue) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.queue.library; 17 | 18 | import java.util.concurrent.Exchanger; 19 | import java.util.concurrent.TimeUnit; 20 | 21 | /** 22 | * @author cenxiaozhong 23 | * @date 2019/2/15 24 | * @since 1.0.0 25 | */ 26 | public class SameThreadExchanger extends Exchanger { 27 | 28 | private V v; 29 | 30 | public SameThreadExchanger() { 31 | } 32 | 33 | void setV(V v) { 34 | this.v = v; 35 | } 36 | 37 | @Override 38 | public V exchange(V x, long timeout, TimeUnit unit) { 39 | return exchange(v); 40 | } 41 | 42 | @Override 43 | public V exchange(V x) { 44 | try { 45 | V v = this.v; 46 | return v; 47 | } finally { 48 | this.v = null; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /library/src/main/java/com/queue/library/ThreadConfig.java: -------------------------------------------------------------------------------- 1 | package com.queue.library; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | 5 | /** 6 | * @author xiaozhongcen 7 | * @date 20-8-7 8 | * @since 1.0.0 9 | */ 10 | public final class ThreadConfig { 11 | 12 | private final static AtomicInteger THREAD_ID_GENERATOR = new AtomicInteger(1); 13 | 14 | public static int getUniqueThreadId() { 15 | return THREAD_ID_GENERATOR.getAndIncrement(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /library/src/test/java/com/queue/library/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.queue.library; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "queue", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "optional": true, 13 | "requires": { 14 | "@babel/highlight": "7.10.4" 15 | } 16 | }, 17 | "@babel/helper-validator-identifier": { 18 | "version": "7.10.4", 19 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 20 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 21 | "dev": true, 22 | "optional": true 23 | }, 24 | "@babel/highlight": { 25 | "version": "7.10.4", 26 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 27 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 28 | "dev": true, 29 | "optional": true, 30 | "requires": { 31 | "@babel/helper-validator-identifier": "7.10.4", 32 | "chalk": "2.4.2", 33 | "js-tokens": "4.0.0" 34 | } 35 | }, 36 | "@commitlint/execute-rule": { 37 | "version": "9.0.1", 38 | "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-9.0.1.tgz", 39 | "integrity": "sha512-fxnLadXs59qOBE9dInfQjQ4DmbGToQ0NjfqqmN6N8qS+KsCecO6N0mMUrC95et9xTeimFRr+0l9UMfmRVHNS/w==", 40 | "dev": true, 41 | "optional": true 42 | }, 43 | "@commitlint/load": { 44 | "version": "9.0.1", 45 | "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-9.0.1.tgz", 46 | "integrity": "sha512-6ix/pUjVAggmDLTcnpyk0bgY3H9UBBTsEeFvTkHV+WQ6LNIxsQk8SwEOEZzWHUqt0pxqMQeiUgYeSZsSw2+uiw==", 47 | "dev": true, 48 | "optional": true, 49 | "requires": { 50 | "@commitlint/execute-rule": "9.0.1", 51 | "@commitlint/resolve-extends": "9.0.1", 52 | "@commitlint/types": "9.0.1", 53 | "chalk": "3.0.0", 54 | "cosmiconfig": "6.0.0", 55 | "lodash": "4.17.19", 56 | "resolve-from": "5.0.0" 57 | }, 58 | "dependencies": { 59 | "chalk": { 60 | "version": "3.0.0", 61 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 62 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 63 | "dev": true, 64 | "optional": true, 65 | "requires": { 66 | "ansi-styles": "4.2.1", 67 | "supports-color": "7.1.0" 68 | } 69 | } 70 | } 71 | }, 72 | "@commitlint/resolve-extends": { 73 | "version": "9.0.1", 74 | "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-9.0.1.tgz", 75 | "integrity": "sha512-o6Lya2ILg1tEfWatS5x8w4ImvDzwb1whxsr2c/cxVCFqLF4hxHHHniZ0NJ+HFhYa1kBsYeKlD1qn9fHX5Y1+PQ==", 76 | "dev": true, 77 | "optional": true, 78 | "requires": { 79 | "import-fresh": "3.2.1", 80 | "lodash": "4.17.19", 81 | "resolve-from": "5.0.0", 82 | "resolve-global": "1.0.0" 83 | } 84 | }, 85 | "@commitlint/types": { 86 | "version": "9.0.1", 87 | "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-9.0.1.tgz", 88 | "integrity": "sha512-wo2rHprtDzTHf4tiSxavktJ52ntiwmg7eHNGFLH38G1of8OfGVwOc1sVbpM4jN/HK/rCMhYOi6xzoPqsv0537A==", 89 | "dev": true, 90 | "optional": true 91 | }, 92 | "@types/color-name": { 93 | "version": "1.1.1", 94 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 95 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 96 | "dev": true, 97 | "optional": true 98 | }, 99 | "@types/parse-json": { 100 | "version": "4.0.0", 101 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 102 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", 103 | "dev": true, 104 | "optional": true 105 | }, 106 | "ansi-escapes": { 107 | "version": "3.2.0", 108 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 109 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 110 | "dev": true 111 | }, 112 | "ansi-regex": { 113 | "version": "3.0.0", 114 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 115 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 116 | "dev": true 117 | }, 118 | "ansi-styles": { 119 | "version": "4.2.1", 120 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 121 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 122 | "dev": true, 123 | "optional": true, 124 | "requires": { 125 | "@types/color-name": "1.1.1", 126 | "color-convert": "2.0.1" 127 | } 128 | }, 129 | "arr-diff": { 130 | "version": "4.0.0", 131 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 132 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 133 | "dev": true 134 | }, 135 | "arr-flatten": { 136 | "version": "1.1.0", 137 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 138 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 139 | "dev": true 140 | }, 141 | "arr-union": { 142 | "version": "3.1.0", 143 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 144 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 145 | "dev": true 146 | }, 147 | "array-unique": { 148 | "version": "0.3.2", 149 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 150 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 151 | "dev": true 152 | }, 153 | "assign-symbols": { 154 | "version": "1.0.0", 155 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 156 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 157 | "dev": true 158 | }, 159 | "atob": { 160 | "version": "2.1.2", 161 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 162 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", 163 | "dev": true 164 | }, 165 | "balanced-match": { 166 | "version": "1.0.0", 167 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 168 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 169 | "dev": true 170 | }, 171 | "base": { 172 | "version": "0.11.2", 173 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 174 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 175 | "dev": true, 176 | "requires": { 177 | "cache-base": "1.0.1", 178 | "class-utils": "0.3.6", 179 | "component-emitter": "1.3.0", 180 | "define-property": "1.0.0", 181 | "isobject": "3.0.1", 182 | "mixin-deep": "1.3.2", 183 | "pascalcase": "0.1.1" 184 | }, 185 | "dependencies": { 186 | "define-property": { 187 | "version": "1.0.0", 188 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 189 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 190 | "dev": true, 191 | "requires": { 192 | "is-descriptor": "1.0.2" 193 | } 194 | }, 195 | "is-accessor-descriptor": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 198 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 199 | "dev": true, 200 | "requires": { 201 | "kind-of": "6.0.3" 202 | } 203 | }, 204 | "is-data-descriptor": { 205 | "version": "1.0.0", 206 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 207 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 208 | "dev": true, 209 | "requires": { 210 | "kind-of": "6.0.3" 211 | } 212 | }, 213 | "is-descriptor": { 214 | "version": "1.0.2", 215 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 216 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 217 | "dev": true, 218 | "requires": { 219 | "is-accessor-descriptor": "1.0.0", 220 | "is-data-descriptor": "1.0.0", 221 | "kind-of": "6.0.3" 222 | } 223 | } 224 | } 225 | }, 226 | "brace-expansion": { 227 | "version": "1.1.11", 228 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 229 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 230 | "dev": true, 231 | "requires": { 232 | "balanced-match": "1.0.0", 233 | "concat-map": "0.0.1" 234 | } 235 | }, 236 | "braces": { 237 | "version": "2.3.2", 238 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 239 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 240 | "dev": true, 241 | "requires": { 242 | "arr-flatten": "1.1.0", 243 | "array-unique": "0.3.2", 244 | "extend-shallow": "2.0.1", 245 | "fill-range": "4.0.0", 246 | "isobject": "3.0.1", 247 | "repeat-element": "1.1.3", 248 | "snapdragon": "0.8.2", 249 | "snapdragon-node": "2.1.1", 250 | "split-string": "3.1.0", 251 | "to-regex": "3.0.2" 252 | }, 253 | "dependencies": { 254 | "extend-shallow": { 255 | "version": "2.0.1", 256 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 257 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 258 | "dev": true, 259 | "requires": { 260 | "is-extendable": "0.1.1" 261 | } 262 | } 263 | } 264 | }, 265 | "cache-base": { 266 | "version": "1.0.1", 267 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 268 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 269 | "dev": true, 270 | "requires": { 271 | "collection-visit": "1.0.0", 272 | "component-emitter": "1.3.0", 273 | "get-value": "2.0.6", 274 | "has-value": "1.0.0", 275 | "isobject": "3.0.1", 276 | "set-value": "2.0.1", 277 | "to-object-path": "0.3.0", 278 | "union-value": "1.0.1", 279 | "unset-value": "1.0.0" 280 | } 281 | }, 282 | "cachedir": { 283 | "version": "2.2.0", 284 | "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", 285 | "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", 286 | "dev": true 287 | }, 288 | "callsites": { 289 | "version": "3.1.0", 290 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 291 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 292 | "dev": true 293 | }, 294 | "chalk": { 295 | "version": "2.4.2", 296 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 297 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 298 | "dev": true, 299 | "requires": { 300 | "ansi-styles": "3.2.1", 301 | "escape-string-regexp": "1.0.5", 302 | "supports-color": "5.5.0" 303 | }, 304 | "dependencies": { 305 | "ansi-styles": { 306 | "version": "3.2.1", 307 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 308 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 309 | "dev": true, 310 | "requires": { 311 | "color-convert": "1.9.3" 312 | } 313 | }, 314 | "color-convert": { 315 | "version": "1.9.3", 316 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 317 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 318 | "dev": true, 319 | "requires": { 320 | "color-name": "1.1.3" 321 | } 322 | }, 323 | "color-name": { 324 | "version": "1.1.3", 325 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 326 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 327 | "dev": true 328 | }, 329 | "has-flag": { 330 | "version": "3.0.0", 331 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 332 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 333 | "dev": true 334 | }, 335 | "supports-color": { 336 | "version": "5.5.0", 337 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 338 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 339 | "dev": true, 340 | "requires": { 341 | "has-flag": "3.0.0" 342 | } 343 | } 344 | } 345 | }, 346 | "chardet": { 347 | "version": "0.7.0", 348 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 349 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 350 | "dev": true 351 | }, 352 | "class-utils": { 353 | "version": "0.3.6", 354 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 355 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 356 | "dev": true, 357 | "requires": { 358 | "arr-union": "3.1.0", 359 | "define-property": "0.2.5", 360 | "isobject": "3.0.1", 361 | "static-extend": "0.1.2" 362 | }, 363 | "dependencies": { 364 | "define-property": { 365 | "version": "0.2.5", 366 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 367 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 368 | "dev": true, 369 | "requires": { 370 | "is-descriptor": "0.1.6" 371 | } 372 | } 373 | } 374 | }, 375 | "cli-cursor": { 376 | "version": "2.1.0", 377 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 378 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 379 | "dev": true, 380 | "requires": { 381 | "restore-cursor": "2.0.0" 382 | } 383 | }, 384 | "cli-width": { 385 | "version": "2.2.1", 386 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 387 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 388 | "dev": true 389 | }, 390 | "collection-visit": { 391 | "version": "1.0.0", 392 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 393 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 394 | "dev": true, 395 | "requires": { 396 | "map-visit": "1.0.0", 397 | "object-visit": "1.0.1" 398 | } 399 | }, 400 | "color-convert": { 401 | "version": "2.0.1", 402 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 403 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 404 | "dev": true, 405 | "optional": true, 406 | "requires": { 407 | "color-name": "1.1.4" 408 | } 409 | }, 410 | "color-name": { 411 | "version": "1.1.4", 412 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 413 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 414 | "dev": true, 415 | "optional": true 416 | }, 417 | "commitizen": { 418 | "version": "4.1.2", 419 | "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.1.2.tgz", 420 | "integrity": "sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ==", 421 | "dev": true, 422 | "requires": { 423 | "cachedir": "2.2.0", 424 | "cz-conventional-changelog": "3.2.0", 425 | "dedent": "0.7.0", 426 | "detect-indent": "6.0.0", 427 | "find-node-modules": "2.0.0", 428 | "find-root": "1.1.0", 429 | "fs-extra": "8.1.0", 430 | "glob": "7.1.4", 431 | "inquirer": "6.5.0", 432 | "is-utf8": "0.2.1", 433 | "lodash": "4.17.15", 434 | "minimist": "1.2.5", 435 | "strip-bom": "4.0.0", 436 | "strip-json-comments": "3.0.1" 437 | }, 438 | "dependencies": { 439 | "lodash": { 440 | "version": "4.17.15", 441 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 442 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 443 | "dev": true 444 | } 445 | } 446 | }, 447 | "component-emitter": { 448 | "version": "1.3.0", 449 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 450 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 451 | "dev": true 452 | }, 453 | "concat-map": { 454 | "version": "0.0.1", 455 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 456 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 457 | "dev": true 458 | }, 459 | "conventional-commit-types": { 460 | "version": "3.0.0", 461 | "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", 462 | "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", 463 | "dev": true 464 | }, 465 | "copy-descriptor": { 466 | "version": "0.1.1", 467 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 468 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 469 | "dev": true 470 | }, 471 | "cosmiconfig": { 472 | "version": "6.0.0", 473 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", 474 | "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", 475 | "dev": true, 476 | "optional": true, 477 | "requires": { 478 | "@types/parse-json": "4.0.0", 479 | "import-fresh": "3.2.1", 480 | "parse-json": "5.0.0", 481 | "path-type": "4.0.0", 482 | "yaml": "1.10.0" 483 | } 484 | }, 485 | "cz-conventional-changelog": { 486 | "version": "3.2.0", 487 | "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.2.0.tgz", 488 | "integrity": "sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==", 489 | "dev": true, 490 | "requires": { 491 | "@commitlint/load": "9.0.1", 492 | "chalk": "2.4.2", 493 | "commitizen": "4.1.2", 494 | "conventional-commit-types": "3.0.0", 495 | "lodash.map": "4.6.0", 496 | "longest": "2.0.1", 497 | "word-wrap": "1.2.3" 498 | } 499 | }, 500 | "debug": { 501 | "version": "2.6.9", 502 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 503 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 504 | "dev": true, 505 | "requires": { 506 | "ms": "2.0.0" 507 | } 508 | }, 509 | "decode-uri-component": { 510 | "version": "0.2.0", 511 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 512 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 513 | "dev": true 514 | }, 515 | "dedent": { 516 | "version": "0.7.0", 517 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 518 | "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", 519 | "dev": true 520 | }, 521 | "define-property": { 522 | "version": "2.0.2", 523 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 524 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 525 | "dev": true, 526 | "requires": { 527 | "is-descriptor": "1.0.2", 528 | "isobject": "3.0.1" 529 | }, 530 | "dependencies": { 531 | "is-accessor-descriptor": { 532 | "version": "1.0.0", 533 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 534 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 535 | "dev": true, 536 | "requires": { 537 | "kind-of": "6.0.3" 538 | } 539 | }, 540 | "is-data-descriptor": { 541 | "version": "1.0.0", 542 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 543 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 544 | "dev": true, 545 | "requires": { 546 | "kind-of": "6.0.3" 547 | } 548 | }, 549 | "is-descriptor": { 550 | "version": "1.0.2", 551 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 552 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 553 | "dev": true, 554 | "requires": { 555 | "is-accessor-descriptor": "1.0.0", 556 | "is-data-descriptor": "1.0.0", 557 | "kind-of": "6.0.3" 558 | } 559 | } 560 | } 561 | }, 562 | "detect-file": { 563 | "version": "1.0.0", 564 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 565 | "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", 566 | "dev": true 567 | }, 568 | "detect-indent": { 569 | "version": "6.0.0", 570 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", 571 | "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", 572 | "dev": true 573 | }, 574 | "error-ex": { 575 | "version": "1.3.2", 576 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 577 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 578 | "dev": true, 579 | "optional": true, 580 | "requires": { 581 | "is-arrayish": "0.2.1" 582 | } 583 | }, 584 | "escape-string-regexp": { 585 | "version": "1.0.5", 586 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 587 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 588 | "dev": true 589 | }, 590 | "expand-brackets": { 591 | "version": "2.1.4", 592 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 593 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 594 | "dev": true, 595 | "requires": { 596 | "debug": "2.6.9", 597 | "define-property": "0.2.5", 598 | "extend-shallow": "2.0.1", 599 | "posix-character-classes": "0.1.1", 600 | "regex-not": "1.0.2", 601 | "snapdragon": "0.8.2", 602 | "to-regex": "3.0.2" 603 | }, 604 | "dependencies": { 605 | "define-property": { 606 | "version": "0.2.5", 607 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 608 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 609 | "dev": true, 610 | "requires": { 611 | "is-descriptor": "0.1.6" 612 | } 613 | }, 614 | "extend-shallow": { 615 | "version": "2.0.1", 616 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 617 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 618 | "dev": true, 619 | "requires": { 620 | "is-extendable": "0.1.1" 621 | } 622 | } 623 | } 624 | }, 625 | "expand-tilde": { 626 | "version": "2.0.2", 627 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 628 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 629 | "dev": true, 630 | "requires": { 631 | "homedir-polyfill": "1.0.3" 632 | } 633 | }, 634 | "extend-shallow": { 635 | "version": "3.0.2", 636 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 637 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 638 | "dev": true, 639 | "requires": { 640 | "assign-symbols": "1.0.0", 641 | "is-extendable": "1.0.1" 642 | }, 643 | "dependencies": { 644 | "is-extendable": { 645 | "version": "1.0.1", 646 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 647 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 648 | "dev": true, 649 | "requires": { 650 | "is-plain-object": "2.0.4" 651 | } 652 | } 653 | } 654 | }, 655 | "external-editor": { 656 | "version": "3.1.0", 657 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 658 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 659 | "dev": true, 660 | "requires": { 661 | "chardet": "0.7.0", 662 | "iconv-lite": "0.4.24", 663 | "tmp": "0.0.33" 664 | } 665 | }, 666 | "extglob": { 667 | "version": "2.0.4", 668 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 669 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 670 | "dev": true, 671 | "requires": { 672 | "array-unique": "0.3.2", 673 | "define-property": "1.0.0", 674 | "expand-brackets": "2.1.4", 675 | "extend-shallow": "2.0.1", 676 | "fragment-cache": "0.2.1", 677 | "regex-not": "1.0.2", 678 | "snapdragon": "0.8.2", 679 | "to-regex": "3.0.2" 680 | }, 681 | "dependencies": { 682 | "define-property": { 683 | "version": "1.0.0", 684 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 685 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 686 | "dev": true, 687 | "requires": { 688 | "is-descriptor": "1.0.2" 689 | } 690 | }, 691 | "extend-shallow": { 692 | "version": "2.0.1", 693 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 694 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 695 | "dev": true, 696 | "requires": { 697 | "is-extendable": "0.1.1" 698 | } 699 | }, 700 | "is-accessor-descriptor": { 701 | "version": "1.0.0", 702 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 703 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 704 | "dev": true, 705 | "requires": { 706 | "kind-of": "6.0.3" 707 | } 708 | }, 709 | "is-data-descriptor": { 710 | "version": "1.0.0", 711 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 712 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 713 | "dev": true, 714 | "requires": { 715 | "kind-of": "6.0.3" 716 | } 717 | }, 718 | "is-descriptor": { 719 | "version": "1.0.2", 720 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 721 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 722 | "dev": true, 723 | "requires": { 724 | "is-accessor-descriptor": "1.0.0", 725 | "is-data-descriptor": "1.0.0", 726 | "kind-of": "6.0.3" 727 | } 728 | } 729 | } 730 | }, 731 | "figures": { 732 | "version": "2.0.0", 733 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 734 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 735 | "dev": true, 736 | "requires": { 737 | "escape-string-regexp": "1.0.5" 738 | } 739 | }, 740 | "fill-range": { 741 | "version": "4.0.0", 742 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 743 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 744 | "dev": true, 745 | "requires": { 746 | "extend-shallow": "2.0.1", 747 | "is-number": "3.0.0", 748 | "repeat-string": "1.6.1", 749 | "to-regex-range": "2.1.1" 750 | }, 751 | "dependencies": { 752 | "extend-shallow": { 753 | "version": "2.0.1", 754 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 755 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 756 | "dev": true, 757 | "requires": { 758 | "is-extendable": "0.1.1" 759 | } 760 | } 761 | } 762 | }, 763 | "find-node-modules": { 764 | "version": "2.0.0", 765 | "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", 766 | "integrity": "sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw==", 767 | "dev": true, 768 | "requires": { 769 | "findup-sync": "3.0.0", 770 | "merge": "1.2.1" 771 | } 772 | }, 773 | "find-root": { 774 | "version": "1.1.0", 775 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 776 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 777 | "dev": true 778 | }, 779 | "findup-sync": { 780 | "version": "3.0.0", 781 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", 782 | "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", 783 | "dev": true, 784 | "requires": { 785 | "detect-file": "1.0.0", 786 | "is-glob": "4.0.1", 787 | "micromatch": "3.1.10", 788 | "resolve-dir": "1.0.1" 789 | } 790 | }, 791 | "for-in": { 792 | "version": "1.0.2", 793 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 794 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 795 | "dev": true 796 | }, 797 | "fragment-cache": { 798 | "version": "0.2.1", 799 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 800 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 801 | "dev": true, 802 | "requires": { 803 | "map-cache": "0.2.2" 804 | } 805 | }, 806 | "fs-extra": { 807 | "version": "8.1.0", 808 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 809 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 810 | "dev": true, 811 | "requires": { 812 | "graceful-fs": "4.2.4", 813 | "jsonfile": "4.0.0", 814 | "universalify": "0.1.2" 815 | } 816 | }, 817 | "fs.realpath": { 818 | "version": "1.0.0", 819 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 820 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 821 | "dev": true 822 | }, 823 | "get-value": { 824 | "version": "2.0.6", 825 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 826 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 827 | "dev": true 828 | }, 829 | "glob": { 830 | "version": "7.1.4", 831 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 832 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 833 | "dev": true, 834 | "requires": { 835 | "fs.realpath": "1.0.0", 836 | "inflight": "1.0.6", 837 | "inherits": "2.0.4", 838 | "minimatch": "3.0.4", 839 | "once": "1.4.0", 840 | "path-is-absolute": "1.0.1" 841 | } 842 | }, 843 | "global-dirs": { 844 | "version": "0.1.1", 845 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 846 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 847 | "dev": true, 848 | "optional": true, 849 | "requires": { 850 | "ini": "1.3.5" 851 | } 852 | }, 853 | "global-modules": { 854 | "version": "1.0.0", 855 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 856 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 857 | "dev": true, 858 | "requires": { 859 | "global-prefix": "1.0.2", 860 | "is-windows": "1.0.2", 861 | "resolve-dir": "1.0.1" 862 | } 863 | }, 864 | "global-prefix": { 865 | "version": "1.0.2", 866 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 867 | "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", 868 | "dev": true, 869 | "requires": { 870 | "expand-tilde": "2.0.2", 871 | "homedir-polyfill": "1.0.3", 872 | "ini": "1.3.5", 873 | "is-windows": "1.0.2", 874 | "which": "1.3.1" 875 | } 876 | }, 877 | "graceful-fs": { 878 | "version": "4.2.4", 879 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 880 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 881 | "dev": true 882 | }, 883 | "has-flag": { 884 | "version": "4.0.0", 885 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 886 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 887 | "dev": true, 888 | "optional": true 889 | }, 890 | "has-value": { 891 | "version": "1.0.0", 892 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 893 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 894 | "dev": true, 895 | "requires": { 896 | "get-value": "2.0.6", 897 | "has-values": "1.0.0", 898 | "isobject": "3.0.1" 899 | } 900 | }, 901 | "has-values": { 902 | "version": "1.0.0", 903 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 904 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 905 | "dev": true, 906 | "requires": { 907 | "is-number": "3.0.0", 908 | "kind-of": "4.0.0" 909 | }, 910 | "dependencies": { 911 | "kind-of": { 912 | "version": "4.0.0", 913 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 914 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 915 | "dev": true, 916 | "requires": { 917 | "is-buffer": "1.1.6" 918 | } 919 | } 920 | } 921 | }, 922 | "homedir-polyfill": { 923 | "version": "1.0.3", 924 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 925 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 926 | "dev": true, 927 | "requires": { 928 | "parse-passwd": "1.0.0" 929 | } 930 | }, 931 | "iconv-lite": { 932 | "version": "0.4.24", 933 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 934 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 935 | "dev": true, 936 | "requires": { 937 | "safer-buffer": "2.1.2" 938 | } 939 | }, 940 | "import-fresh": { 941 | "version": "3.2.1", 942 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 943 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 944 | "dev": true, 945 | "requires": { 946 | "parent-module": "1.0.1", 947 | "resolve-from": "4.0.0" 948 | }, 949 | "dependencies": { 950 | "resolve-from": { 951 | "version": "4.0.0", 952 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 953 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 954 | "dev": true 955 | } 956 | } 957 | }, 958 | "inflight": { 959 | "version": "1.0.6", 960 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 961 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 962 | "dev": true, 963 | "requires": { 964 | "once": "1.4.0", 965 | "wrappy": "1.0.2" 966 | } 967 | }, 968 | "inherits": { 969 | "version": "2.0.4", 970 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 971 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 972 | "dev": true 973 | }, 974 | "ini": { 975 | "version": "1.3.5", 976 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 977 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 978 | "dev": true 979 | }, 980 | "inquirer": { 981 | "version": "6.5.0", 982 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", 983 | "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", 984 | "dev": true, 985 | "requires": { 986 | "ansi-escapes": "3.2.0", 987 | "chalk": "2.4.2", 988 | "cli-cursor": "2.1.0", 989 | "cli-width": "2.2.1", 990 | "external-editor": "3.1.0", 991 | "figures": "2.0.0", 992 | "lodash": "4.17.19", 993 | "mute-stream": "0.0.7", 994 | "run-async": "2.4.1", 995 | "rxjs": "6.6.0", 996 | "string-width": "2.1.1", 997 | "strip-ansi": "5.2.0", 998 | "through": "2.3.8" 999 | } 1000 | }, 1001 | "is-accessor-descriptor": { 1002 | "version": "0.1.6", 1003 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1004 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1005 | "dev": true, 1006 | "requires": { 1007 | "kind-of": "3.2.2" 1008 | }, 1009 | "dependencies": { 1010 | "kind-of": { 1011 | "version": "3.2.2", 1012 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1013 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1014 | "dev": true, 1015 | "requires": { 1016 | "is-buffer": "1.1.6" 1017 | } 1018 | } 1019 | } 1020 | }, 1021 | "is-arrayish": { 1022 | "version": "0.2.1", 1023 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1024 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1025 | "dev": true, 1026 | "optional": true 1027 | }, 1028 | "is-buffer": { 1029 | "version": "1.1.6", 1030 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1031 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1032 | "dev": true 1033 | }, 1034 | "is-data-descriptor": { 1035 | "version": "0.1.4", 1036 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1037 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1038 | "dev": true, 1039 | "requires": { 1040 | "kind-of": "3.2.2" 1041 | }, 1042 | "dependencies": { 1043 | "kind-of": { 1044 | "version": "3.2.2", 1045 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1046 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1047 | "dev": true, 1048 | "requires": { 1049 | "is-buffer": "1.1.6" 1050 | } 1051 | } 1052 | } 1053 | }, 1054 | "is-descriptor": { 1055 | "version": "0.1.6", 1056 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1057 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1058 | "dev": true, 1059 | "requires": { 1060 | "is-accessor-descriptor": "0.1.6", 1061 | "is-data-descriptor": "0.1.4", 1062 | "kind-of": "5.1.0" 1063 | }, 1064 | "dependencies": { 1065 | "kind-of": { 1066 | "version": "5.1.0", 1067 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1068 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", 1069 | "dev": true 1070 | } 1071 | } 1072 | }, 1073 | "is-extendable": { 1074 | "version": "0.1.1", 1075 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1076 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1077 | "dev": true 1078 | }, 1079 | "is-extglob": { 1080 | "version": "2.1.1", 1081 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1082 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1083 | "dev": true 1084 | }, 1085 | "is-fullwidth-code-point": { 1086 | "version": "2.0.0", 1087 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1088 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1089 | "dev": true 1090 | }, 1091 | "is-glob": { 1092 | "version": "4.0.1", 1093 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1094 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1095 | "dev": true, 1096 | "requires": { 1097 | "is-extglob": "2.1.1" 1098 | } 1099 | }, 1100 | "is-number": { 1101 | "version": "3.0.0", 1102 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1103 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1104 | "dev": true, 1105 | "requires": { 1106 | "kind-of": "3.2.2" 1107 | }, 1108 | "dependencies": { 1109 | "kind-of": { 1110 | "version": "3.2.2", 1111 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1112 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1113 | "dev": true, 1114 | "requires": { 1115 | "is-buffer": "1.1.6" 1116 | } 1117 | } 1118 | } 1119 | }, 1120 | "is-plain-object": { 1121 | "version": "2.0.4", 1122 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1123 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1124 | "dev": true, 1125 | "requires": { 1126 | "isobject": "3.0.1" 1127 | } 1128 | }, 1129 | "is-utf8": { 1130 | "version": "0.2.1", 1131 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1132 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1133 | "dev": true 1134 | }, 1135 | "is-windows": { 1136 | "version": "1.0.2", 1137 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1138 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1139 | "dev": true 1140 | }, 1141 | "isarray": { 1142 | "version": "1.0.0", 1143 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1144 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1145 | "dev": true 1146 | }, 1147 | "isexe": { 1148 | "version": "2.0.0", 1149 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1150 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1151 | "dev": true 1152 | }, 1153 | "isobject": { 1154 | "version": "3.0.1", 1155 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1156 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1157 | "dev": true 1158 | }, 1159 | "js-tokens": { 1160 | "version": "4.0.0", 1161 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1162 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1163 | "dev": true, 1164 | "optional": true 1165 | }, 1166 | "json-parse-better-errors": { 1167 | "version": "1.0.2", 1168 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1169 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1170 | "dev": true, 1171 | "optional": true 1172 | }, 1173 | "jsonfile": { 1174 | "version": "4.0.0", 1175 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1176 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1177 | "dev": true, 1178 | "requires": { 1179 | "graceful-fs": "4.2.4" 1180 | } 1181 | }, 1182 | "kind-of": { 1183 | "version": "6.0.3", 1184 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1185 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1186 | "dev": true 1187 | }, 1188 | "lines-and-columns": { 1189 | "version": "1.1.6", 1190 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 1191 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", 1192 | "dev": true, 1193 | "optional": true 1194 | }, 1195 | "lodash": { 1196 | "version": "4.17.19", 1197 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 1198 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 1199 | "dev": true 1200 | }, 1201 | "lodash.map": { 1202 | "version": "4.6.0", 1203 | "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", 1204 | "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", 1205 | "dev": true 1206 | }, 1207 | "longest": { 1208 | "version": "2.0.1", 1209 | "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", 1210 | "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", 1211 | "dev": true 1212 | }, 1213 | "map-cache": { 1214 | "version": "0.2.2", 1215 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1216 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1217 | "dev": true 1218 | }, 1219 | "map-visit": { 1220 | "version": "1.0.0", 1221 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1222 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1223 | "dev": true, 1224 | "requires": { 1225 | "object-visit": "1.0.1" 1226 | } 1227 | }, 1228 | "merge": { 1229 | "version": "1.2.1", 1230 | "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", 1231 | "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", 1232 | "dev": true 1233 | }, 1234 | "micromatch": { 1235 | "version": "3.1.10", 1236 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1237 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1238 | "dev": true, 1239 | "requires": { 1240 | "arr-diff": "4.0.0", 1241 | "array-unique": "0.3.2", 1242 | "braces": "2.3.2", 1243 | "define-property": "2.0.2", 1244 | "extend-shallow": "3.0.2", 1245 | "extglob": "2.0.4", 1246 | "fragment-cache": "0.2.1", 1247 | "kind-of": "6.0.3", 1248 | "nanomatch": "1.2.13", 1249 | "object.pick": "1.3.0", 1250 | "regex-not": "1.0.2", 1251 | "snapdragon": "0.8.2", 1252 | "to-regex": "3.0.2" 1253 | } 1254 | }, 1255 | "mimic-fn": { 1256 | "version": "1.2.0", 1257 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1258 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1259 | "dev": true 1260 | }, 1261 | "minimatch": { 1262 | "version": "3.0.4", 1263 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1264 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1265 | "dev": true, 1266 | "requires": { 1267 | "brace-expansion": "1.1.11" 1268 | } 1269 | }, 1270 | "minimist": { 1271 | "version": "1.2.5", 1272 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1273 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1274 | "dev": true 1275 | }, 1276 | "mixin-deep": { 1277 | "version": "1.3.2", 1278 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 1279 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 1280 | "dev": true, 1281 | "requires": { 1282 | "for-in": "1.0.2", 1283 | "is-extendable": "1.0.1" 1284 | }, 1285 | "dependencies": { 1286 | "is-extendable": { 1287 | "version": "1.0.1", 1288 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1289 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1290 | "dev": true, 1291 | "requires": { 1292 | "is-plain-object": "2.0.4" 1293 | } 1294 | } 1295 | } 1296 | }, 1297 | "ms": { 1298 | "version": "2.0.0", 1299 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1300 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1301 | "dev": true 1302 | }, 1303 | "mute-stream": { 1304 | "version": "0.0.7", 1305 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1306 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1307 | "dev": true 1308 | }, 1309 | "nanomatch": { 1310 | "version": "1.2.13", 1311 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 1312 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 1313 | "dev": true, 1314 | "requires": { 1315 | "arr-diff": "4.0.0", 1316 | "array-unique": "0.3.2", 1317 | "define-property": "2.0.2", 1318 | "extend-shallow": "3.0.2", 1319 | "fragment-cache": "0.2.1", 1320 | "is-windows": "1.0.2", 1321 | "kind-of": "6.0.3", 1322 | "object.pick": "1.3.0", 1323 | "regex-not": "1.0.2", 1324 | "snapdragon": "0.8.2", 1325 | "to-regex": "3.0.2" 1326 | } 1327 | }, 1328 | "object-copy": { 1329 | "version": "0.1.0", 1330 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 1331 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 1332 | "dev": true, 1333 | "requires": { 1334 | "copy-descriptor": "0.1.1", 1335 | "define-property": "0.2.5", 1336 | "kind-of": "3.2.2" 1337 | }, 1338 | "dependencies": { 1339 | "define-property": { 1340 | "version": "0.2.5", 1341 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1342 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1343 | "dev": true, 1344 | "requires": { 1345 | "is-descriptor": "0.1.6" 1346 | } 1347 | }, 1348 | "kind-of": { 1349 | "version": "3.2.2", 1350 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1351 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1352 | "dev": true, 1353 | "requires": { 1354 | "is-buffer": "1.1.6" 1355 | } 1356 | } 1357 | } 1358 | }, 1359 | "object-visit": { 1360 | "version": "1.0.1", 1361 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 1362 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 1363 | "dev": true, 1364 | "requires": { 1365 | "isobject": "3.0.1" 1366 | } 1367 | }, 1368 | "object.pick": { 1369 | "version": "1.3.0", 1370 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 1371 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 1372 | "dev": true, 1373 | "requires": { 1374 | "isobject": "3.0.1" 1375 | } 1376 | }, 1377 | "once": { 1378 | "version": "1.4.0", 1379 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1380 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1381 | "dev": true, 1382 | "requires": { 1383 | "wrappy": "1.0.2" 1384 | } 1385 | }, 1386 | "onetime": { 1387 | "version": "2.0.1", 1388 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1389 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1390 | "dev": true, 1391 | "requires": { 1392 | "mimic-fn": "1.2.0" 1393 | } 1394 | }, 1395 | "os-tmpdir": { 1396 | "version": "1.0.2", 1397 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1398 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1399 | "dev": true 1400 | }, 1401 | "parent-module": { 1402 | "version": "1.0.1", 1403 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1404 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1405 | "dev": true, 1406 | "requires": { 1407 | "callsites": "3.1.0" 1408 | } 1409 | }, 1410 | "parse-json": { 1411 | "version": "5.0.0", 1412 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", 1413 | "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", 1414 | "dev": true, 1415 | "optional": true, 1416 | "requires": { 1417 | "@babel/code-frame": "7.10.4", 1418 | "error-ex": "1.3.2", 1419 | "json-parse-better-errors": "1.0.2", 1420 | "lines-and-columns": "1.1.6" 1421 | } 1422 | }, 1423 | "parse-passwd": { 1424 | "version": "1.0.0", 1425 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 1426 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 1427 | "dev": true 1428 | }, 1429 | "pascalcase": { 1430 | "version": "0.1.1", 1431 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 1432 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 1433 | "dev": true 1434 | }, 1435 | "path-is-absolute": { 1436 | "version": "1.0.1", 1437 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1438 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1439 | "dev": true 1440 | }, 1441 | "path-type": { 1442 | "version": "4.0.0", 1443 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1444 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1445 | "dev": true, 1446 | "optional": true 1447 | }, 1448 | "posix-character-classes": { 1449 | "version": "0.1.1", 1450 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 1451 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 1452 | "dev": true 1453 | }, 1454 | "regex-not": { 1455 | "version": "1.0.2", 1456 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 1457 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 1458 | "dev": true, 1459 | "requires": { 1460 | "extend-shallow": "3.0.2", 1461 | "safe-regex": "1.1.0" 1462 | } 1463 | }, 1464 | "repeat-element": { 1465 | "version": "1.1.3", 1466 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 1467 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 1468 | "dev": true 1469 | }, 1470 | "repeat-string": { 1471 | "version": "1.6.1", 1472 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1473 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1474 | "dev": true 1475 | }, 1476 | "resolve-dir": { 1477 | "version": "1.0.1", 1478 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 1479 | "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", 1480 | "dev": true, 1481 | "requires": { 1482 | "expand-tilde": "2.0.2", 1483 | "global-modules": "1.0.0" 1484 | } 1485 | }, 1486 | "resolve-from": { 1487 | "version": "5.0.0", 1488 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1489 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1490 | "dev": true 1491 | }, 1492 | "resolve-global": { 1493 | "version": "1.0.0", 1494 | "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", 1495 | "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", 1496 | "dev": true, 1497 | "optional": true, 1498 | "requires": { 1499 | "global-dirs": "0.1.1" 1500 | } 1501 | }, 1502 | "resolve-url": { 1503 | "version": "0.2.1", 1504 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 1505 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 1506 | "dev": true 1507 | }, 1508 | "restore-cursor": { 1509 | "version": "2.0.0", 1510 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1511 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1512 | "dev": true, 1513 | "requires": { 1514 | "onetime": "2.0.1", 1515 | "signal-exit": "3.0.3" 1516 | } 1517 | }, 1518 | "ret": { 1519 | "version": "0.1.15", 1520 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 1521 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 1522 | "dev": true 1523 | }, 1524 | "run-async": { 1525 | "version": "2.4.1", 1526 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1527 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1528 | "dev": true 1529 | }, 1530 | "rxjs": { 1531 | "version": "6.6.0", 1532 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", 1533 | "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", 1534 | "dev": true, 1535 | "requires": { 1536 | "tslib": "1.13.0" 1537 | } 1538 | }, 1539 | "safe-regex": { 1540 | "version": "1.1.0", 1541 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 1542 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 1543 | "dev": true, 1544 | "requires": { 1545 | "ret": "0.1.15" 1546 | } 1547 | }, 1548 | "safer-buffer": { 1549 | "version": "2.1.2", 1550 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1551 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1552 | "dev": true 1553 | }, 1554 | "set-value": { 1555 | "version": "2.0.1", 1556 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 1557 | "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 1558 | "dev": true, 1559 | "requires": { 1560 | "extend-shallow": "2.0.1", 1561 | "is-extendable": "0.1.1", 1562 | "is-plain-object": "2.0.4", 1563 | "split-string": "3.1.0" 1564 | }, 1565 | "dependencies": { 1566 | "extend-shallow": { 1567 | "version": "2.0.1", 1568 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1569 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1570 | "dev": true, 1571 | "requires": { 1572 | "is-extendable": "0.1.1" 1573 | } 1574 | } 1575 | } 1576 | }, 1577 | "signal-exit": { 1578 | "version": "3.0.3", 1579 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1580 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1581 | "dev": true 1582 | }, 1583 | "snapdragon": { 1584 | "version": "0.8.2", 1585 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 1586 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 1587 | "dev": true, 1588 | "requires": { 1589 | "base": "0.11.2", 1590 | "debug": "2.6.9", 1591 | "define-property": "0.2.5", 1592 | "extend-shallow": "2.0.1", 1593 | "map-cache": "0.2.2", 1594 | "source-map": "0.5.7", 1595 | "source-map-resolve": "0.5.3", 1596 | "use": "3.1.1" 1597 | }, 1598 | "dependencies": { 1599 | "define-property": { 1600 | "version": "0.2.5", 1601 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1602 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1603 | "dev": true, 1604 | "requires": { 1605 | "is-descriptor": "0.1.6" 1606 | } 1607 | }, 1608 | "extend-shallow": { 1609 | "version": "2.0.1", 1610 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1611 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1612 | "dev": true, 1613 | "requires": { 1614 | "is-extendable": "0.1.1" 1615 | } 1616 | } 1617 | } 1618 | }, 1619 | "snapdragon-node": { 1620 | "version": "2.1.1", 1621 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 1622 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 1623 | "dev": true, 1624 | "requires": { 1625 | "define-property": "1.0.0", 1626 | "isobject": "3.0.1", 1627 | "snapdragon-util": "3.0.1" 1628 | }, 1629 | "dependencies": { 1630 | "define-property": { 1631 | "version": "1.0.0", 1632 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1633 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1634 | "dev": true, 1635 | "requires": { 1636 | "is-descriptor": "1.0.2" 1637 | } 1638 | }, 1639 | "is-accessor-descriptor": { 1640 | "version": "1.0.0", 1641 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1642 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1643 | "dev": true, 1644 | "requires": { 1645 | "kind-of": "6.0.3" 1646 | } 1647 | }, 1648 | "is-data-descriptor": { 1649 | "version": "1.0.0", 1650 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1651 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1652 | "dev": true, 1653 | "requires": { 1654 | "kind-of": "6.0.3" 1655 | } 1656 | }, 1657 | "is-descriptor": { 1658 | "version": "1.0.2", 1659 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1660 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1661 | "dev": true, 1662 | "requires": { 1663 | "is-accessor-descriptor": "1.0.0", 1664 | "is-data-descriptor": "1.0.0", 1665 | "kind-of": "6.0.3" 1666 | } 1667 | } 1668 | } 1669 | }, 1670 | "snapdragon-util": { 1671 | "version": "3.0.1", 1672 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 1673 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 1674 | "dev": true, 1675 | "requires": { 1676 | "kind-of": "3.2.2" 1677 | }, 1678 | "dependencies": { 1679 | "kind-of": { 1680 | "version": "3.2.2", 1681 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1682 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1683 | "dev": true, 1684 | "requires": { 1685 | "is-buffer": "1.1.6" 1686 | } 1687 | } 1688 | } 1689 | }, 1690 | "source-map": { 1691 | "version": "0.5.7", 1692 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1693 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1694 | "dev": true 1695 | }, 1696 | "source-map-resolve": { 1697 | "version": "0.5.3", 1698 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", 1699 | "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", 1700 | "dev": true, 1701 | "requires": { 1702 | "atob": "2.1.2", 1703 | "decode-uri-component": "0.2.0", 1704 | "resolve-url": "0.2.1", 1705 | "source-map-url": "0.4.0", 1706 | "urix": "0.1.0" 1707 | } 1708 | }, 1709 | "source-map-url": { 1710 | "version": "0.4.0", 1711 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 1712 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 1713 | "dev": true 1714 | }, 1715 | "split-string": { 1716 | "version": "3.1.0", 1717 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 1718 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 1719 | "dev": true, 1720 | "requires": { 1721 | "extend-shallow": "3.0.2" 1722 | } 1723 | }, 1724 | "static-extend": { 1725 | "version": "0.1.2", 1726 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 1727 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 1728 | "dev": true, 1729 | "requires": { 1730 | "define-property": "0.2.5", 1731 | "object-copy": "0.1.0" 1732 | }, 1733 | "dependencies": { 1734 | "define-property": { 1735 | "version": "0.2.5", 1736 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1737 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1738 | "dev": true, 1739 | "requires": { 1740 | "is-descriptor": "0.1.6" 1741 | } 1742 | } 1743 | } 1744 | }, 1745 | "string-width": { 1746 | "version": "2.1.1", 1747 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1748 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1749 | "dev": true, 1750 | "requires": { 1751 | "is-fullwidth-code-point": "2.0.0", 1752 | "strip-ansi": "4.0.0" 1753 | }, 1754 | "dependencies": { 1755 | "strip-ansi": { 1756 | "version": "4.0.0", 1757 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1758 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1759 | "dev": true, 1760 | "requires": { 1761 | "ansi-regex": "3.0.0" 1762 | } 1763 | } 1764 | } 1765 | }, 1766 | "strip-ansi": { 1767 | "version": "5.2.0", 1768 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1769 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1770 | "dev": true, 1771 | "requires": { 1772 | "ansi-regex": "4.1.0" 1773 | }, 1774 | "dependencies": { 1775 | "ansi-regex": { 1776 | "version": "4.1.0", 1777 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1778 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1779 | "dev": true 1780 | } 1781 | } 1782 | }, 1783 | "strip-bom": { 1784 | "version": "4.0.0", 1785 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 1786 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 1787 | "dev": true 1788 | }, 1789 | "strip-json-comments": { 1790 | "version": "3.0.1", 1791 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1792 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1793 | "dev": true 1794 | }, 1795 | "supports-color": { 1796 | "version": "7.1.0", 1797 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1798 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1799 | "dev": true, 1800 | "optional": true, 1801 | "requires": { 1802 | "has-flag": "4.0.0" 1803 | } 1804 | }, 1805 | "through": { 1806 | "version": "2.3.8", 1807 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1808 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1809 | "dev": true 1810 | }, 1811 | "tmp": { 1812 | "version": "0.0.33", 1813 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1814 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1815 | "dev": true, 1816 | "requires": { 1817 | "os-tmpdir": "1.0.2" 1818 | } 1819 | }, 1820 | "to-object-path": { 1821 | "version": "0.3.0", 1822 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 1823 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 1824 | "dev": true, 1825 | "requires": { 1826 | "kind-of": "3.2.2" 1827 | }, 1828 | "dependencies": { 1829 | "kind-of": { 1830 | "version": "3.2.2", 1831 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1832 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1833 | "dev": true, 1834 | "requires": { 1835 | "is-buffer": "1.1.6" 1836 | } 1837 | } 1838 | } 1839 | }, 1840 | "to-regex": { 1841 | "version": "3.0.2", 1842 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 1843 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 1844 | "dev": true, 1845 | "requires": { 1846 | "define-property": "2.0.2", 1847 | "extend-shallow": "3.0.2", 1848 | "regex-not": "1.0.2", 1849 | "safe-regex": "1.1.0" 1850 | } 1851 | }, 1852 | "to-regex-range": { 1853 | "version": "2.1.1", 1854 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 1855 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 1856 | "dev": true, 1857 | "requires": { 1858 | "is-number": "3.0.0", 1859 | "repeat-string": "1.6.1" 1860 | } 1861 | }, 1862 | "tslib": { 1863 | "version": "1.13.0", 1864 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1865 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1866 | "dev": true 1867 | }, 1868 | "union-value": { 1869 | "version": "1.0.1", 1870 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 1871 | "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 1872 | "dev": true, 1873 | "requires": { 1874 | "arr-union": "3.1.0", 1875 | "get-value": "2.0.6", 1876 | "is-extendable": "0.1.1", 1877 | "set-value": "2.0.1" 1878 | } 1879 | }, 1880 | "universalify": { 1881 | "version": "0.1.2", 1882 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1883 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1884 | "dev": true 1885 | }, 1886 | "unset-value": { 1887 | "version": "1.0.0", 1888 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 1889 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 1890 | "dev": true, 1891 | "requires": { 1892 | "has-value": "0.3.1", 1893 | "isobject": "3.0.1" 1894 | }, 1895 | "dependencies": { 1896 | "has-value": { 1897 | "version": "0.3.1", 1898 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 1899 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 1900 | "dev": true, 1901 | "requires": { 1902 | "get-value": "2.0.6", 1903 | "has-values": "0.1.4", 1904 | "isobject": "2.1.0" 1905 | }, 1906 | "dependencies": { 1907 | "isobject": { 1908 | "version": "2.1.0", 1909 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1910 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1911 | "dev": true, 1912 | "requires": { 1913 | "isarray": "1.0.0" 1914 | } 1915 | } 1916 | } 1917 | }, 1918 | "has-values": { 1919 | "version": "0.1.4", 1920 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 1921 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 1922 | "dev": true 1923 | } 1924 | } 1925 | }, 1926 | "urix": { 1927 | "version": "0.1.0", 1928 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 1929 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 1930 | "dev": true 1931 | }, 1932 | "use": { 1933 | "version": "3.1.1", 1934 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 1935 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", 1936 | "dev": true 1937 | }, 1938 | "which": { 1939 | "version": "1.3.1", 1940 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1941 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1942 | "dev": true, 1943 | "requires": { 1944 | "isexe": "2.0.0" 1945 | } 1946 | }, 1947 | "word-wrap": { 1948 | "version": "1.2.3", 1949 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1950 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1951 | "dev": true 1952 | }, 1953 | "wrappy": { 1954 | "version": "1.0.2", 1955 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1956 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1957 | "dev": true 1958 | }, 1959 | "yaml": { 1960 | "version": "1.10.0", 1961 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", 1962 | "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", 1963 | "dev": true, 1964 | "optional": true 1965 | } 1966 | } 1967 | } 1968 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name='Queue' 2 | include ':app' 3 | include ':library' 4 | --------------------------------------------------------------------------------