├── .gitignore ├── LICENSE ├── README.md ├── build.js ├── cli ├── colors.js ├── default-options-input.json ├── format.js ├── get-options.js ├── graph-defaults.json ├── log-min-max.js ├── log-stats.js ├── multiple-defaults.json ├── parse-args.js └── write-file-recursive.js ├── index.js ├── package.json ├── src ├── benches │ ├── convolution.js │ ├── generate-matrices.js │ └── matrix-multiplication.js ├── index.js ├── run.js ├── stats │ ├── diff.js │ ├── format-diff.js │ ├── generate_stats │ │ ├── find-run-best-worst.js │ │ ├── generate-build-stats.js │ │ ├── generate-overall-stats.js │ │ └── generate-run-stats.js │ ├── get-score.js │ ├── get-stats.js │ └── output_formats │ │ ├── build-time-format.json │ │ ├── overall-format.json │ │ ├── run-time-format.json │ │ └── stats.json └── util │ ├── bench-it.js │ ├── benchmark-out.js │ ├── defaults.json │ ├── export-as-json.js │ ├── get-default-options.js │ ├── get-min-max.js │ ├── get-texture.js │ └── multi-bench.js ├── test ├── benches │ ├── convolution.js │ ├── generate-matrices.js │ └── matrix-multiplication.js ├── cli │ └── get-options.js ├── index.js ├── run.js ├── stats │ ├── diff.js │ ├── get-score.js │ └── get-stats.js └── util │ ├── bench-it.js │ ├── export-as-json.js │ └── get-min-max.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | node_modules/* 3 | 4 | *.log -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Benchmark 2 | **Benchmark** is a simple benchmarking tool for GPU.js. This tool works both in JavaScript and CLI. 3 | This tool runs three benchmarks: 4 | 1. [Matrix Multiplication](#matrix-multiplication) 5 | 2. [Matrix Convolution](#matrix-convolution) 6 | 3. [Pipelining](#pipelining) 7 | 8 | ### Table of Contents 9 | - [Installation](#installation) 10 | - [Browser Usage](#browser-usage) 11 | - [Usage](#usage) 12 | - [CLI Usage](#cli) 13 | - [Options](#options) 14 | - [Saving Graphs As JSON](#saving-graphs-as-json) 15 | - [Multiple Benchmarks](#multiple-benchmarks) 16 | - [Output](#output) 17 | - [Stats](#stats) 18 | - [BenchmarkOut Object](#benchmarkout) 19 | - [Benchmarks](#benchmarks) 20 | - [Using With React Native](#expo) 21 | 22 | ### Installation 23 | NOTE: The package `gpu.js` needs to be installed separately. 24 | Benchmark is available on npm under the name `@gpujs/benchmark`. 25 | #### Using yarn 26 | ```sh 27 | yarn add @gpujs/benchmark 28 | ``` 29 | #### Using npm 30 | ```sh 31 | npm install @gpujs/benchmark 32 | ``` 33 | ##### NOTE: If it asks for a GPU.js version, you can choose any version of your choice (>=v2.0.0) but the provided dist files will have the version which was the latest during the release of that version of **benchmark**. 34 | 35 | ### Browser Usage 36 | #### Building 37 | **NOTE**: The latest dist files are not included since v2.1.0 due to problems with browserify(https://github.com/gpujs/benchmark/issues/7). This issue will be addressed as soon as possible. 38 | **NOTE**: The dist files are also included in the npm module and GitHub repository, skip this step if you are not running a modified script locally. 39 | We use browserify and minify to build the distributable files `dist/benchmark.js` and `dist/benchmark.min.js`. 40 | After running the setup script, run the following command 41 | ```sh 42 | yarn build 43 | ``` 44 | 45 | #### Using 46 | Include the benchmark dist file in the HTML file. 47 | ```html 48 | 49 | 50 | ``` 51 | or, from the npm module 52 | ```html 53 | 54 | 55 | ``` 56 | 57 | The exported function is `benchmark`. 58 | ```js 59 | const out = benchmark(options) 60 | ``` 61 | ##### NOTE: Options are is an Object. See [this](#options). 62 | 63 | ### Usage 64 | #### Javascript 65 | 1. Import **Benchmark**. 66 | ```js 67 | const benchmark = require('@gpujs/benchmark') 68 | ``` 69 | ##### OR using ES6 syntax 70 | ```js 71 | import benchmark from '@gpujs/benchmark' 72 | ``` 73 | 74 | 2. Run it. 75 | ```js 76 | const benchmarks = benchmark.benchmark(options) 77 | ``` 78 | OR run [Multiple Benchmarks](#multiple-benchmarks) 79 | ```js 80 | const benchmarks = benchmark.multipleBenchmark(options) 81 | ``` 82 | This returns the benchmarks in an Object. See [this](#output). 83 | ##### NOTE: Options are is an Object. See [this](#options). 84 | 85 | #### CLI 86 | 1. Clone the repository and open the directory. 87 | ```sh 88 | git clone https://github.com/gpujs/benchmark 89 | cd benchmark 90 | ``` 91 | 92 | 2. Install `yarn` 93 | We use [yarn](https://yarnpkg.com/en/) as our package manager. You will have to install that too, as a side effect. (If you have yarn installed, skip this step) 94 | ```sh 95 | npm install -g yarn 96 | ``` 97 | 98 | 3. Install the dependencies 99 | ```sh 100 | yarn setup 101 | ``` 102 | ##### NOTE: If it asks for a GPU.js version, you can choose any version of your choice (>=v2.0.0) but the provided dist files will have the version which was the latest during the release of the latest version of **benchmark** 103 | 104 | 4. Run the tool in the CLI 105 | ```sh 106 | yarn start 107 | ``` 108 | ##### OR using `node` 109 | ```sh 110 | node ./index.js 111 | ``` 112 | This will prompt you to enter the optional [options] 113 | #### Using CLI with JSON Options as Input 114 | ```sh 115 | yarn start options 116 | ``` 117 | [options](#options) is a stringified JSON object passed as an argument. 118 | ##### OR using `node` 119 | ```sh 120 | node ./index.js options 121 | ``` 122 | Here, `options` is a stringified JSON object. 123 | 124 | ##### Example 125 | ```sh 126 | yarn start '{"num_iterations": 4}' 127 | ``` 128 | 129 | #### Options 130 | The following options can be passed on to the `benchmark` or `multipleBenchmark` method. 131 | 132 | 1. `benchmark` options: 133 | - `cpu`(*Object*) \*: A custom `GPU({mode: 'cpu'})` Object to benchmark specific versions of GPU.js(>= v2.0.0). Mandatory in everything except CLI. 134 | 135 | - `gpu`(*Object*) \*: A custom `GPU()` Object to benchmark specific versions of GPU.js(>= v2.0.0). (default: The version shipped with benchmark). Mandatory in everything except CLI. 136 | 137 | - `matrix_size`(*Integer*): The size of the uniform matrix used for benchmarking. (default: 512) 138 | 139 | - `num_iterations`(*Integer*): The number of iterations of run time calculation. (default: 1) 140 | 141 | - `logs`(*Boolean*): Toggles console logs by the library. 142 | 143 | - `cpu_benchmark`(*Boolean*): Toggles the benchmarking of CPU. False is recommended to big matrix sizes. (default: true) 144 | 145 | 2. `multipleBenchmark` options: 146 | [Multiple Benchmark](#multiple-benchmarks) options have the following structure. 147 | ```js 148 | { 149 | common_options: { // options common to all but can be overridden in range or in full_options, preference given to range 150 | cpu_benchmark: false, 151 | cpu: new CPU({mode: 'cpu'}), 152 | gpu: new GPU() 153 | }, 154 | range: { // only one of this and full_options works 155 | option_name: 'matrix_size', 156 | interval: [128, 1024], 157 | step: 100 //(default 10)(A.P.: 128, 138, 148, 158) one of step or common_ratio can be used, preference given to step 158 | // common_ratio: 2 (G.P.: 128, 256, 512, 1024) 159 | }, 160 | full_options: [ 161 | { 162 | // array of options objects for each benchmark(only one of this and range works, preference given to range) 163 | } 164 | ] 165 | } 166 | ``` 167 | - `common_options`(*Object*): Options common to all the benchmarks that are run. (Same as `benchmark` options). 168 | - `range`(*Object*): Used to create a set of options using a set of rules, for each benchmark. (only one of range or full_options can be used) 169 | - `option_name`(*String*): The option for which the range is applied. This has to be of type Number. It can be one of the `benchmark` options. 170 | - `interval`(*Array*): The upper and lower limits for the option. 171 | - `step`(*Number*): The common difference between each option value. All the options will be in an AP. (only one of `step` or `common_ratio` can be used, preference is given to `step`) 172 | - `common_ratio`(*Number*): The common ratio between each option value. All the options will be in a GP. (only one of `step` or `common_ratio` can be used, preference is given to `step`) 173 | - `full_options`(*Array*): An array of options object, each one corresponding to one benchmark. Each object is the same as `benchmark` options. (only one of range or full_options can be used) 174 | 175 | #### Multiple Benchmarks in CLI 176 | ```sh 177 | yarn start --multiple [options?] 178 | ``` 179 | [options](#options) to the CLI are stored in a stringified JSON object passed as an argument. 180 | More about [Multiple Benchmarks](#multiple-benchmarks). 181 | 182 | #### Saving Graphs as JSON 183 | 1. **Plotly Style JSON** 184 | ```sh 185 | yarn start --multiple --returnPlotlyJSON 186 | ``` 187 | This will log to the console, [plotly.js](https://plot.ly/javascript/) style JSON which stores the graph data for GPU score v/s matrix size of each benchmark. 188 | 189 | ```sh 190 | yarn start --multiple --savePlotlyJSONToFile=path/to/file.json 191 | ``` 192 | This saves the [plotly.js](https://plot.ly/javascript/) style JSON data for: 193 | - GPU score v/s matrix size 194 | - GPU matrix multiplication run time v/s matrix size 195 | - CPU score v/s matrix size 196 | - CPU matrix multiplication run time v/s matrix size 197 | 198 | ##### NOTE: If CPU is not benchmarked, CPU score and run time will have non-meaningful negative values which are to be ignored. 199 | ##### NOTE: Filename need not have a `.json` extension. 200 | 201 | 1. **Chartist Style JSON** 202 | ```sh 203 | yarn start --multiple --returnChartistJSON 204 | ``` 205 | This will log to the console, [chartist.js](https://gionkunz.github.io/chartist-js/) style JSON which stores the graph data for GPU score v/s matrix size of each benchmark. 206 | 207 | ```sh 208 | yarn start --multiple --saveChartistJSONToFile=path/to/file.json 209 | ``` 210 | This saves the [chartist.js](https://gionkunz.github.io/chartist-js/) style JSON data for: 211 | - GPU score v/s matrix size 212 | - GPU matrix multiplication run time v/s matrix size 213 | - CPU score v/s matrix size 214 | - CPU matrix multiplication run time v/s matrix size 215 | 216 | ##### NOTE: If CPU is not benchmarked, CPU score and run time will have non-meaningful negative values which are to be ignored. 217 | ##### NOTE: Filename need not have a `.json` extension. 218 | 219 | ##### NOTE: One or more of the above arguments for JSON output can be used with `--multiple` 220 | 221 | 222 | #### Multiple Benchmarks 223 | **Benchmark** allows you to run a sequence of benchmarks each with different custom options or each having number options like matrix size changed by a fixed amount. 224 | 225 | ```js 226 | benchmark.multipleBenchmark(options); 227 | ``` 228 | Where options is an object with the following properties: 229 | - `common_options`(*Object*): Options common to every benchmark in a sequence. (default: `{cpu_benchmark: false}`) 230 | - `range`(*Object*): Define a range of option(number type) values, one for each benchmark in the sequence. *e.g.*: matrix_size: 512, 1024, 1536... or matrix_size: 512, 1024, 2048 ... 231 | Here, the specified option can either be incremented by a fixed number(common difference) or multiplied by a fixed number(common factor). 232 | - `option_name`(*String*): The name of the option for which the range is to be set. *e.g.*: matrix_size (Default: `matrix_size`) 233 | - `interval`(*Array*): An array with upper and lower limits for the range. *e.g.*: [512, 2048] (Default: `[128, 1024]`) 234 | - `step`(*Number*): The fixed number which is to be added(common difference). (Default: `100`) 235 | - `common_ratio`(*Number*): The fixed number to be multiplied. (Default: none) 236 | ###### NOTE: Only one of `step` and `common_ratio` can be used 237 | - `full_options`(*Array*): An array of objects specifying separate set of options for each benchmark in the sequence(common_options properties can be overridden here). (Default: none) 238 | ###### NOTE: Only one of `range` and `full_options` can be used 239 | 240 | ##### Examples 241 | 1. Range: 242 | ```js 243 | benchmark.multipleBenchmark({ 244 | common_options: { 245 | cpu_benchmark: false, 246 | logs: false 247 | }, 248 | range: { 249 | option_name: 'matrix_size', 250 | interval: [128, 2048], 251 | common_ratio: 2 252 | } 253 | }) 254 | ``` 255 | The above code runs a separate benchmark for the matrix sizes 128, 256, 512, 1024, 2048 which are in GP. 256 | 257 | 2. full_options: 258 | ```js 259 | benchmark.multipleBenchmark({ 260 | common_options: { 261 | logs: false, 262 | cpu_benchmark: false 263 | }, 264 | full_options: [ 265 | { 266 | logs: true, // override 267 | matrix_size: 2048 268 | }, 269 | { 270 | cpu_benchmark: true, //override 271 | matrix_size: 128 272 | } 273 | ] 274 | }) 275 | ``` 276 | 277 | ### API 278 | 279 | #### Output 280 | The output of any benchmark(multiple or single) is a [`BenchmarkOut`](#benchmarkout) Object. 281 | 282 | #### Stats 283 | The [output](#output) contains a `stats` property which shows the overall stats of the benchmark: 284 | - `run_time`: The run time stats 285 | - `mat_mult`, `mat_conv`, `pipe`(*Object*): These three objects contain the stats for each type of benchmark. 286 | - `diff`: Has a single property that contains performance comparison scores between CPU and GPU. 287 | - `cpu_gpu`: 288 | - `min`, `max`, `avg`: The minimum, maximum and average time taken stats 289 | - `winner`(`gpu` | `cpu`): The better performer among the two. 290 | - `percentage`(*Number*): By how much percentage it is better. 291 | 292 | - `build_time`: The build time stats 293 | - `mat_mult`, `mat_conv`: Built time stats for each benchmark. 294 | - `diff`: Same as the diff object in `run_time` except that it compares GPU v/s GPU(pipeline mode) in the property `gpu_pipe`. (P.S. Best Performer and Worst Performer are not included) 295 | 296 | - `overall`: The overall stats 297 | `mat_mult`, `mat_conv`: Overall stats for each benchmark 298 | - `best_performer`(`gpu` | `cpu`): The best overall performer. 299 | - `worst_performer`(`gpu` | `cpu`): The worst overall performer. 300 | - `diff`: Same as the diff object in `run_time` 301 | 302 | - `score`: The score object is a property of the main output object. 303 | - `gpu`, `cpu`(*Number*): A score is a number representing the overall normalized average performance of the GPU or CPU. This score can be directly compared to other benchmarks or hardware. 304 | 305 | **TECHNICAL**: The `score` is *floor* of one-hundredth of the ratio of the total number of operations in matrix multiplication to the time taken for the operations. 306 | - In the case of matrix multiplication, one single operation is taken to be the product of two array elements and the total number of operations is taken to be the cube of one of the dimensions[for a square matrix]. 307 | 308 | #### BenchmarkOut 309 | This object stores the output of **Benchmark**. 310 | 311 | 312 | ##### Properties 313 | - `mat_gen`, `mat_pad`(*Number*): Matrix generation and matrix padding times in `ms`. 314 | - `build_time`(*Object*): 315 | - `mat_mult`, `mat_conv`(*Object*) 316 | - `gpu`, `pipe`(*Number*): Compile times for GPU and GPU(pipeline mode) in `ms` for each benchmark. 317 | - `run_time`(*Object*): Run times for each benchmark. 318 | - `mat_mult`, `mat_conv`, `pipe`(*Object*): Run times for each benchmark. 319 | - `gpu`, `cpu`(*Object*): GPU and CPU run times. 320 | - `min`, `max`, `avg`(*Number*): The minimum, maximum and average run times in `ms`. 321 | - `deviation` (*Number*): Percentage deviation of results from average value. 322 | - `stats`(*Object*): The [statistics](#stats). 323 | 324 | ##### Methods 325 | - `getDataField(field, index = 0)`(returns: ***): Gets any one of the output field(property). 326 | - `field`(*String*): The name of the field. 327 | - `index`(Number): The index of the benchmark if multiple benchmarks are run. 328 | - `getPlotlyJSON(compare_fields)`, `getChartistJSON(compare_fields)`(Returns: *Array*): Returns plotly or Chartist style JSON Object for charts. (only for multiple benchmarks) 329 | - `compare_fields`: An array of objects having two properties `x` and `y` representing the data to be plotted on their respective axes. 330 | - `x`, `y`(*String*): Can be one of: 331 | - `matrix_size` 332 | - `gpu_score` 333 | - `cpu_score` 334 | - `gpu_run_time_mat_mult`: GPU matrix multiplication run time 335 | - `cpu_run_time_mat_mult`: CPU matrix multiplication run time 336 | - `gpu_run_time_mat_conv`: GPU matrix convolution run time 337 | - `cpu_run_time_mat_conv`: CPU matrix convolution run time 338 | - `pipe_run_time`: GPU pipelining run time 339 | 340 | Default value of `compare_fields` argument for `getPlotlyJSON` and `getChartistJSON` methods: 341 | ```js 342 | [ 343 | { 344 | x: 'matrix_size', 345 | y: 'gpu_run_time_mat_mult' 346 | }, 347 | { 348 | x: 'matrix_size', 349 | y: 'pipe_run_time' 350 | }, 351 | { 352 | x: 'matrix_size', 353 | y: 'gpu_score' 354 | } 355 | ] 356 | ``` 357 | 358 | 359 | #### Benchmarks 360 | 361 | ##### Matrix Multiplication 362 | This benchmark [multiplies](https://www.mathsisfun.com/algebra/matrix-multiplying.html) two randomly generated uniform-sized matrices and benchmarks the GPU and CPU against the time taken by each. 363 | 364 | GPU.js Kernel: 365 | ```js 366 | function(a, b) { 367 | let sum = 0; 368 | for (let i = 0; i < this.output.x; i++) { 369 | sum += a[this.thread.y][i] * b[i][this.thread.x]; 370 | } 371 | return sum; 372 | } 373 | ``` 374 | 375 | ##### Matrix Convolution 376 | This benchmark [convolves](https://en.wikipedia.org/wiki/Kernel_(image_processing)#Convolution) a 3x3 [kernel](https://en.wikipedia.org/wiki/Kernel_(image_processing)) over a randomly generated uniform sized matrix. 377 | The convolution kernel is 378 | ``` 379 | 1 2 1 380 | 2 1 2 381 | 1 2 1 382 | ``` 383 | 384 | GPU.js Kernel: 385 | ```js 386 | function (array, kernel) { 387 | let sum = 0; 388 | for (let i = 0; i < ${kernelX}; i++){ 389 | for (let j = 0; j < ${kernelY}; j++){ 390 | sum += kernel[j][i] * array[this.thread.y + j][this.thread.x + i]; 391 | } 392 | } 393 | return sum; 394 | } 395 | ``` 396 | Where `kernelX` and `kernelY` are the dimensions of the kernel. 397 | 398 | ##### Pipelining 399 | GPU.js supports a feature called [Pipelining](https://github.com/gpujs/gpu.js#pipelining) and this benchmark benchmarks this feature. 400 | It runs four matrix multiplication benchmarks in a sequence while pipelining the output of the earlier benchmark to be used as an input to the next one. The benchmark is run both on the GPU and the CPU(without pipelining) and the time taken is compared. 401 | When it is run on the GPU, the output of the previous multiplication is passed on to the next call as a texture (a storage unit on the GPU) on the GPU itself which drastically reduces the time taken because the output need not be converted and transferred to the CPU and back. 402 | 403 | ### Expo 404 | GPU.js can be run on Android and iOS devices using [expo-gl](https://github.com/gpujs/expo-gl) which is a simple package developed by the GPU.js community. -------------------------------------------------------------------------------- /build.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'), 2 | browserify = require('browserify'), 3 | minify = require('minify'); 4 | 5 | const createDist = () => { 6 | browserify('./src/index.js').bundle((err, buffer) => { 7 | if (err) throw err; 8 | 9 | fs.writeFileSync('./dist/benchmark.js', buffer); 10 | minify('./dist/benchmark.js').then((data) => fs.writeFileSync('./dist/benchmark.min.js', data)); 11 | }) 12 | } 13 | 14 | if (fs.existsSync('./dist')){ 15 | createDist(); 16 | } 17 | else { 18 | fs.mkdirSync('./dist'); 19 | createDist(); 20 | } -------------------------------------------------------------------------------- /cli/colors.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | RED_UNDER: '\033[1;31;4m', // underlined red 3 | RED_NO_UNDER: '\033[1;31m', // red without underline 4 | GREEN_UNDER: '\033[0;32;4m', // underlined green 5 | GREEN_NO_UNDER: '\033[0;32m', // green without underline 6 | YELLOW_UNDER: '\033[0;33;4m', // yellow underlined 7 | YELLOW_NO_UNDER: '\033[0;33m', // yellow without underlined 8 | BG_WHITE: '\033[47;30;1m', // white background 9 | RED_FLASH: '\033[1;31;5m', // flashing/blinking red text 10 | NC: '\033[0m' // no color(default) 11 | } -------------------------------------------------------------------------------- /cli/default-options-input.json: -------------------------------------------------------------------------------- 1 | [ 2 | "matrix_size", 3 | "num_iterations", 4 | "cpu_benchmark" 5 | ] -------------------------------------------------------------------------------- /cli/format.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @method br 3 | * @description Adds a line break in the console 4 | * @param numBreaks Number of line breaks to add. (Default 2) 5 | * @returns {Null} 6 | */ 7 | const br = (numBreaks = 1) => {for(let br = 0; br < numBreaks; br++) {console.log(``)}} 8 | 9 | module.exports = { 10 | br 11 | } -------------------------------------------------------------------------------- /cli/get-options.js: -------------------------------------------------------------------------------- 1 | const readlineSync = require('readline-sync'), 2 | defaultInputs = require('./default-options-input.json'), 3 | { YELLOW_UNDER, GREEN_NO_UNDER, NC } = require('./colors'), 4 | defaults = require('../src/util/defaults.json'); 5 | 6 | function getOptionsInput(options) { 7 | console.log(`${GREEN_NO_UNDER}OPTIONS:${NC} (Press Enter to Select the Default Value)`); 8 | 9 | defaultInputs.forEach(input => { 10 | if (options.hasOwnProperty(input)) return; 11 | 12 | options[input] = readlineSync.question(`${YELLOW_UNDER}${input}${NC} (${typeof defaults[input]})(default: ${defaults[input]}): `); 13 | 14 | if (options[input] === '') options[input] = defaults[input]; 15 | }) 16 | 17 | return options; 18 | } 19 | 20 | module.exports = getOptionsInput; -------------------------------------------------------------------------------- /cli/graph-defaults.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "x": "matrix_size", 4 | "y": "gpu_score" 5 | }, 6 | { 7 | "x": "matrix_size", 8 | "y": "gpu_run_time_mat_mult" 9 | }, 10 | { 11 | "x": "matrix_size", 12 | "y": "cpu_score" 13 | }, 14 | { 15 | "x": "matrix_size", 16 | "y": "cpu_run_time_mat_mult" 17 | } 18 | ] -------------------------------------------------------------------------------- /cli/log-min-max.js: -------------------------------------------------------------------------------- 1 | const { NC, YELLOW_UNDER } = require('./colors'); 2 | 3 | const getVal = val => val.avg == -1 ? 4 | `${YELLOW_UNDER}Not Benchmarked${NC}` : 5 | `${YELLOW_UNDER}${val.avg}${NC} ms +- ${YELLOW_UNDER}${val.deviation}${NC}%` 6 | 7 | module.exports = minMax => { 8 | console.log(`GPU average: ${getVal(minMax.gpu)}`); 9 | console.log(`CPU average: ${getVal(minMax.cpu)}`); 10 | } -------------------------------------------------------------------------------- /cli/log-stats.js: -------------------------------------------------------------------------------- 1 | const { NC, YELLOW_NO_UNDER, YELLOW_UNDER, GREEN_UNDER, GREEN_NO_UNDER, RED_NO_UNDER } = require('./colors'), 2 | { br } = require('./format'); 3 | 4 | const performerMap = { 5 | gpu: 'GPU', 6 | cpu: 'CPU', 7 | pipe: 'GPU(pipeline mode)' 8 | }, 9 | benchMap = { 10 | mat_mult: 'Matrix Multiplication', 11 | mat_conv: 'Matrix Convolution', 12 | pipe: 'Pipelining' 13 | } 14 | 15 | const logRunTimeStats = ({run_time}, cpuBenched) => { 16 | if (cpuBenched) { 17 | for (const bench in run_time) { 18 | console.log(`Benchmark: ${GREEN_UNDER}${benchMap[bench]}${NC}`); 19 | br(); 20 | let performerNotBenched; 21 | 22 | for (const diff in run_time[bench].diff) { 23 | const performers = diff.split('_'), 24 | { avg } = run_time[bench].diff[diff], 25 | percentage = { 26 | avg: run_time[bench].diff[diff].avg.percentage 27 | }; 28 | 29 | performerNotBenched = (performerNotBenched || percentage.min == -1 || percentage.max == -1 || percentage.avg == -1); 30 | 31 | if (!performerNotBenched){ 32 | console.log(`Performance Comparison between ${YELLOW_NO_UNDER}${performerMap[performers[0]]}${NC} and ${YELLOW_NO_UNDER}${performerMap[performers[1]]}${NC}:`); 33 | console.log(`Better Performer: ${YELLOW_NO_UNDER}${performerMap[avg.winner]}${NC} by ${YELLOW_UNDER}${percentage.avg}${NC}%`); 34 | } 35 | } 36 | br(2); 37 | } 38 | } 39 | else console.log('Nothing to Compare With \n') 40 | } 41 | 42 | const logBuildTimeStats = ({build_time}) => { 43 | for (const bench in build_time) { 44 | const performers = ['gpu', 'pipe']; 45 | performers.splice(performers.indexOf(build_time[bench].diff.winner)); 46 | console.log(`Benchmark: ${GREEN_UNDER}${benchMap[bench]}${NC}`); 47 | console.log(`${YELLOW_NO_UNDER}${performerMap[build_time[bench].diff.gpu_pipe.winner]}${NC} compiled ${YELLOW_UNDER}${build_time[bench].diff.gpu_pipe.percentage}${NC}% faster than ${YELLOW_NO_UNDER}${performerMap[performers[0]]}${NC}`); 48 | br(2); 49 | } 50 | } 51 | 52 | const logOverallStats = ({overall}, cpuBenched) => { 53 | if (cpuBenched) { 54 | for (const bench in overall) { 55 | console.log(`Benchmark: ${GREEN_UNDER}${benchMap[bench]}${NC}`); 56 | br(); 57 | if (overall[bench].diff.percentage != -1) console.log(`${YELLOW_NO_UNDER}${performerMap[overall[bench].best_performer]}${NC} was ${YELLOW_UNDER}${overall[bench].diff.percentage}${NC}% faster than ${YELLOW_NO_UNDER}${performerMap[overall[bench].worst_performer]}${NC}`); 58 | br(2); 59 | } 60 | } 61 | else console.log('Nothing to Compare With') 62 | } 63 | 64 | module.exports = { 65 | logRunTimeStats, 66 | logBuildTimeStats, 67 | logOverallStats, 68 | performerMap, 69 | benchMap 70 | } -------------------------------------------------------------------------------- /cli/multiple-defaults.json: -------------------------------------------------------------------------------- 1 | { 2 | "common_options": { 3 | "cpu_benchmark": false, 4 | "logs": true 5 | }, 6 | "range": { 7 | "option_name": "matrix_size", 8 | "interval": [64, 512], 9 | "common_ratio": 2 10 | } 11 | } -------------------------------------------------------------------------------- /cli/parse-args.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Parses all the CLI arguments 3 | * @param {Float32Array} args The user CLI arguments (Usually process.argv) 4 | */ 5 | function parseArgs(args) { 6 | if (args[2] !== undefined) { 7 | const multiple = args.includes('--multiple'); 8 | const options = args.find(opt => /^{.*}$/.test(opt)) || false; 9 | 10 | const returnPlotlyJSON = args.includes('--returnPlotlyJSON'); 11 | const returnChartistJSON = args.includes('--returnChartistJSON'); 12 | 13 | const plotlySavePath = args.find(opt => /^--savePlotlyJSONToFile=/.test(opt)) || false; 14 | const chartistSavePath = args.find(opt => /^--saveChartistJSONToFile=/.test(opt)) || false; 15 | 16 | return { 17 | multiple, 18 | options, 19 | returnPlotlyJSON, 20 | returnChartistJSON, 21 | plotlySavePath, 22 | chartistSavePath 23 | } 24 | } 25 | else { 26 | return false; 27 | } 28 | } 29 | 30 | module.exports = parseArgs; -------------------------------------------------------------------------------- /cli/write-file-recursive.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'), 2 | path = require('path'); 3 | 4 | /** 5 | * @description Saves a file to a given path recursively, ie also creates the required directories. 6 | * @param {String} path Path to the file including the name of the file with the extension 7 | * @param {String} content Contents of the file 8 | */ 9 | function writeFileSyncRecursive(path, content) { 10 | const folders = path.split(path.sep).slice(0, -1); 11 | if (folders.length > 0) { 12 | 13 | // create folder path if it doesn't exist 14 | folders.reduce((last, folder) => { 15 | if (!fs.existsSync(last)) { 16 | fs.mkdirSync(last); 17 | } 18 | const folderPath = last + path.sep + folder; 19 | 20 | if (!fs.existsSync(folderPath)) { 21 | fs.mkdirSync(folderPath); 22 | } 23 | 24 | return folderPath; 25 | }) 26 | } 27 | fs.writeFileSync(path, content); 28 | } 29 | 30 | module.exports = writeFileSyncRecursive; -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { GPU } = require('gpu.js'), 2 | { benchmark: bench, multipleBenchmark } = require('./src/index'), 3 | writeFileSyncRecursive = require('./cli/write-file-recursive'), 4 | getOptionsInput = require('./cli/get-options'), 5 | parseArgs = require('./cli/parse-args'), 6 | graphDefaults = require('./cli/graph-defaults.json'), 7 | multipleDefaults = require('./cli/multiple-defaults.json'), 8 | logMinMax = require('./cli/log-min-max'), 9 | { GREEN_NO_UNDER, NC, RED_FLASH, YELLOW_UNDER, YELLOW_NO_UNDER } = require('./cli/colors'), 10 | { br } = require('./cli/format'), 11 | { logRunTimeStats, logBuildTimeStats, logOverallStats } = require('./cli/log-stats'); 12 | 13 | let options = { 14 | gpu: new GPU(), 15 | cpu: new GPU({ mode: 'gpu' }) 16 | }, 17 | multiple = false; 18 | const parsedArgs = parseArgs(process.argv); 19 | 20 | br(); 21 | 22 | if (parsedArgs) { 23 | try { 24 | if (parsedArgs.multiple) { 25 | multiple = true; 26 | 27 | if (parsedArgs.options) options = JSON.parse(parsedArgs.options); 28 | else { 29 | options = {...multipleDefaults}; 30 | } 31 | } 32 | else if (parsedArgs.options) options = JSON.parse(parsedArgs.options); 33 | } 34 | catch (e) { 35 | console.log(`${RED_FLASH}Options argument is not a valid JSON string or contains errors, running benchmarks with default options.${NC}`); 36 | options = {...multipleDefaults}; 37 | br(); 38 | } 39 | } 40 | 41 | 42 | if (!multiple) { 43 | options.logs = true; 44 | 45 | getOptionsInput(options); 46 | 47 | br(); 48 | console.log(`MATRIX SIZE: ${YELLOW_UNDER}${options.matrix_size || 512}${YELLOW_NO_UNDER}x${YELLOW_UNDER}${options.matrix_size || 512}${NC}`); 49 | br(); 50 | 51 | const benchmarks = bench(options).getData(); 52 | const cpuBenched = benchmarks.options.cpu_benchmark; 53 | br(2); 54 | 55 | console.log(`Matrix Generation Time: ${YELLOW_UNDER}${benchmarks.mat_gen}${NC} ms (Generated 5 Matrices)`); 56 | console.log(`Matrix Padding Time: ${YELLOW_UNDER}${benchmarks.mat_pad}${NC} ms`); 57 | br(2); 58 | 59 | console.log(`${GREEN_NO_UNDER}COMPILE TIME:${NC}`); 60 | 61 | console.log(`Matrix Multiplication Compile Time: ${YELLOW_UNDER}${benchmarks.build_time.mat_mult.gpu}${NC} ms`); 62 | console.log(`Matrix Multiplication (Pipeline) Compile Time: ${YELLOW_UNDER}${benchmarks.build_time.mat_mult.pipe}${NC} ms`); 63 | console.log(`Matrix Convolution Compile Time: ${YELLOW_UNDER}${benchmarks.build_time.mat_conv.gpu}${NC} ms`); 64 | br(2); 65 | 66 | console.log(`${GREEN_NO_UNDER}MATRIX MULTIPLICATION RUN TIME:${NC}`); 67 | logMinMax(benchmarks.run_time.mat_mult); 68 | br(2); 69 | 70 | console.log(`${GREEN_NO_UNDER}MATRIX CONVOLUTION RUN TIME:${NC}`); 71 | logMinMax(benchmarks.run_time.mat_conv); 72 | br(); 73 | 74 | console.log(`${GREEN_NO_UNDER}PIPELINE BENCHMARK:${NC}`); 75 | logMinMax(benchmarks.run_time.pipe); 76 | br(); 77 | 78 | console.log(`${GREEN_NO_UNDER}STATISTICS:${NC}`); 79 | br(); 80 | 81 | console.log(`${GREEN_NO_UNDER}Run Time Statistics:${NC}`); 82 | br(); 83 | logRunTimeStats(benchmarks.stats, cpuBenched); 84 | 85 | console.log(`${GREEN_NO_UNDER}Build Time Statistics:${NC}`); 86 | br(); 87 | logBuildTimeStats(benchmarks.stats, cpuBenched); 88 | 89 | console.log(`${GREEN_NO_UNDER}Overall Statistics:${NC}`); 90 | br(); 91 | logOverallStats(benchmarks.stats, cpuBenched); 92 | 93 | console.log(`${GREEN_NO_UNDER}Score:${NC}`); 94 | br(); 95 | console.log(`GPU: ${YELLOW_UNDER}${benchmarks.score.gpu}${NC}`); 96 | console.log(`CPU: ${YELLOW_UNDER}${benchmarks.score.cpu < 0 ? 'Not Benchmarked' : benchmarks.score.cpu}${NC}`); 97 | br(); 98 | } 99 | else { 100 | const benchmark = multipleBenchmark(options); 101 | 102 | if (parsedArgs.returnPlotlyJSON){ 103 | br(); 104 | console.log('PLOTLY JSON:'); 105 | br(); 106 | 107 | console.log(benchmark.getPlotlyJSON([graphDefaults[0]])) 108 | 109 | br(); 110 | } 111 | 112 | if (parsedArgs.returnChartistJSON){ 113 | br(); 114 | console.log('CHARTIST JSON:'); 115 | br(); 116 | 117 | console.log(benchmark.getChartistJSON([graphDefaults[0]])) 118 | 119 | br(); 120 | } 121 | 122 | if (parsedArgs.plotlySavePath) { 123 | const path = parsedArgs.plotlySavePath.replace(/^--savePlotlyJSONToFile=/, '').replace(/.json$/, ''); 124 | 125 | writeFileSyncRecursive(`${path}.json`, JSON.stringify( 126 | benchmark.getPlotlyJSON(graphDefaults) 127 | )) 128 | } 129 | 130 | if (parsedArgs.chartistSavePath) { 131 | const path = parsedArgs.chartistSavePath.replace(/^--saveChartistJSONToFile=/, '').replace(/.json$/, ''); 132 | 133 | writeFileSyncRecursive(`${path}.json`, JSON.stringify( 134 | benchmark.getChartistJSON(graphDefaults) 135 | )) 136 | } 137 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@gpujs/benchmark", 3 | "version": "3.1.0", 4 | "private": false, 5 | "description": "A benchmarking tool for gpu.js", 6 | "main": "src/index.js", 7 | "scripts": { 8 | "start": "node ./index.js", 9 | "setup": "yarn install && npm rebuild", 10 | "test": "TEST=true tape test/util/*.js test/stats/*.js test/benches/*.js test/cli/*.js test/index.js test/run.js | tap-spec", 11 | "build": "node ./build.js", 12 | "npm-publish": "yarn test && yarn publish" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/gpujs/benchmark.git" 17 | }, 18 | "author": "gpujs", 19 | "license": "MIT", 20 | "dependencies": { 21 | "lodash": "^4.17.15", 22 | "performance-now": "^2.1.0", 23 | "readline-sync": "^1.4.10" 24 | }, 25 | "bugs": { 26 | "url": "https://github.com/gpujs/benchmark/issues" 27 | }, 28 | "homepage": "https://github.com/gpujs/benchmark#readme", 29 | "devDependencies": { 30 | "browserify": "16.5.0", 31 | "gpu.js": "^2.9.4", 32 | "minify": "^5.1.0", 33 | "tap-spec": "^5.0.0", 34 | "tape": "^4.10.1" 35 | }, 36 | "keywords": [ 37 | "gpujs", 38 | "gpu", 39 | "gpu.js", 40 | "benchmark" 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /src/benches/convolution.js: -------------------------------------------------------------------------------- 1 | const kernel = [ 2 | [1, 2, 1], 3 | [2, 1, 2], 4 | [1, 2, 1] 5 | ] 6 | 7 | const kernelX = kernel[0].length, 8 | kernelY = kernel.length, 9 | paddingX = Math.floor(kernelX / 2), 10 | paddingY = Math.floor(kernelY / 2); 11 | 12 | /** 13 | * @method paddificate 14 | * @description Pads a JavaScript array. 15 | * @param {Float32Array} array Input array. 16 | * @param {Number} paddingX x-axis padding size. 17 | * @param {Number} paddingY y-axis padding size. 18 | * @return {Float32Array} 19 | */ 20 | const paddificate = (array, paddingX, paddingY) => { 21 | let out = []; 22 | 23 | for (var y = 0; y < array.length + paddingY * 2; y++){ 24 | out.push([]); 25 | for (var x = 0; x < array[0].length + paddingX * 2; x++){ 26 | const positionX = Math.min(Math.max(x - paddingX, 0), array[0].length - 1); 27 | const positionY = Math.min(Math.max(y - paddingY, 0), array.length - 1); 28 | 29 | out[y].push(array[positionY][positionX]); 30 | } 31 | } 32 | return out; 33 | } 34 | 35 | const matConvFunc = `function (array, kernel) { 36 | let sum = 0; 37 | for (let i = 0; i < ${kernelX}; i++){ 38 | for (let j = 0; j < ${kernelY}; j++){ 39 | sum += kernel[j][i] * array[this.thread.y + j][this.thread.x + i]; 40 | } 41 | } 42 | return sum; 43 | }`; 44 | 45 | /** 46 | * @method generateFuncs 47 | * @description Generates kernel convolution functions. 48 | * @param {"GPU"} gpu A GPU.js GPU object. 49 | * @param {"GPU"} cpu A GPU.js object with mode=cpu 50 | * @param {Float32Array|"Object"} output The output size 51 | * @returns {{gpu: Object, pipe: Object, cpu: Object}} 52 | */ 53 | const generateFuncs = (gpu, cpu, output) => { 54 | return { 55 | gpu: gpu.createKernel(matConvFunc, { 56 | output 57 | }), 58 | pipe: gpu.createKernel(matConvFunc, { 59 | output, 60 | pipeline: true 61 | }), 62 | cpu: cpu.createKernel(matConvFunc, { 63 | output 64 | }) 65 | } 66 | } 67 | 68 | module.exports = { 69 | kernel, 70 | kernelX, 71 | kernelY, 72 | paddingX, 73 | paddingY, 74 | paddificate, 75 | matConvFunc, 76 | generateFuncs 77 | } 78 | -------------------------------------------------------------------------------- /src/benches/generate-matrices.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @method generateMatrices 3 | * @description generates 5 matrices of uniform x and y length 4 | * @param size size of the matrices 5 | * @returns {Float32Array} 6 | */ 7 | module.exports = size => { 8 | const matrices = [[], [], [], [], []]; 9 | 10 | for (let y = 0; y < size; y++){ 11 | matrices[0].push([]); 12 | matrices[1].push([]); 13 | matrices[2].push([]); 14 | matrices[3].push([]); 15 | matrices[4].push([]); 16 | for (let x = 0; x < size; x++){ 17 | matrices[0][y].push(Math.random()); 18 | matrices[1][y].push(Math.random()); 19 | matrices[2][y].push(Math.random()); 20 | matrices[3][y].push(Math.random()); 21 | matrices[4][y].push(Math.random()); 22 | } 23 | } 24 | return matrices; 25 | } 26 | -------------------------------------------------------------------------------- /src/benches/matrix-multiplication.js: -------------------------------------------------------------------------------- 1 | const matMultFunc = function(a, b) { 2 | let sum = 0; 3 | for (let i = 0; i < this.output.x; i++) { 4 | sum += a[this.thread.y][i] * b[i][this.thread.x]; 5 | } 6 | return sum; 7 | } 8 | 9 | /** 10 | * @method generateFuncs 11 | * @description Generates matrix multiplication functions. 12 | * @param {"GPU"} gpu A GPU.js GPU object. 13 | * @param {"GPU"} cpu A GPU.js object with mode=cpu 14 | * @param {Float32Array|"Object"} output The output size 15 | * @return {"Object"} 16 | */ 17 | const generateFuncs = (gpu, cpu, output) => { 18 | return { 19 | gpu: gpu.createKernel(matMultFunc, { 20 | output 21 | }), 22 | pipe: gpu.createKernel(matMultFunc, { 23 | output, 24 | pipeline: true 25 | }), 26 | cpu: cpu.createKernel(matMultFunc, { 27 | output 28 | }) 29 | } 30 | } 31 | 32 | module.exports = { 33 | generateFuncs, 34 | matMultFunc 35 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const run = require('./run'), 2 | BenchmarkOut = require('./util/benchmark-out'), 3 | getDefaultOptions = require('./util/get-default-options'), 4 | multipleBenchmark = require('./util/multi-bench'); 5 | 6 | /** 7 | * @method benchmark 8 | * @description benchmarks gpu.js 9 | * @param {...Options} options Optional options 10 | */ 11 | const benchmark = (options = {}) => { 12 | options = getDefaultOptions(options); 13 | const out = new BenchmarkOut(true, run(options)); 14 | 15 | return out; 16 | } 17 | 18 | module.exports = { 19 | benchmark, 20 | multipleBenchmark 21 | } 22 | -------------------------------------------------------------------------------- /src/run.js: -------------------------------------------------------------------------------- 1 | const benchIt = require('./util/bench-it'), 2 | generateMatrices = require('./benches/generate-matrices'), 3 | getMinMaxAvg = require('./util/get-min-max'), 4 | matMult = require('./benches/matrix-multiplication'), 5 | matConv = require('./benches/convolution'), 6 | { paddificate, paddingX, paddingY, kernel } = require('./benches/convolution'), 7 | { YELLOW_UNDER, GREEN_NO_UNDER, NC } = require('../cli/colors'), 8 | { generateStatsObj: generateStats } = require('./stats/get-stats'), 9 | getgetTextureKernel = require('./util/get-texture'), 10 | getScore = require('./stats/get-score'); 11 | 12 | /** 13 | * @method run 14 | * @param {Options} options 15 | * @return {"Object"} 16 | */ 17 | const run = options => { 18 | options.output = [options.matrix_size, options.matrix_size]; 19 | 20 | const getTexture = getgetTextureKernel(options.gpu, options.matrix_size, options.matrix_size); 21 | const mat = benchIt(() => generateMatrices(options.matrix_size)), 22 | padded = benchIt(() => paddificate(mat.ret[0], paddingX, paddingY)); 23 | 24 | getTexture.build(mat.ret[0]); 25 | const matrixTexs = mat.ret.map(arr => getTexture(arr)); 26 | 27 | const funcs = { 28 | mat_mult: matMult.generateFuncs(options.gpu, options.cpu, options.output), 29 | mat_conv: matConv.generateFuncs(options.gpu, options.cpu, options.output) 30 | } 31 | 32 | const benchmarks = { 33 | mat_mult: { 34 | gpu: [], 35 | cpu: [] 36 | }, 37 | mat_conv: { 38 | gpu: [], 39 | cpu: [] 40 | }, 41 | pipe: { 42 | gpu: [], 43 | cpu: [] 44 | } 45 | } 46 | 47 | const build_time = { 48 | mat_mult: { 49 | gpu: benchIt(() => {funcs.mat_mult.gpu.build(mat.ret[0], mat.ret[1])}).time, 50 | pipe: benchIt(() => {funcs.mat_mult.pipe.build(matrixTexs[0], matrixTexs[1])}).time 51 | }, 52 | mat_conv: { 53 | gpu: benchIt(() => {funcs.mat_conv.gpu.build(padded.ret, kernel)}).time, 54 | pipe: benchIt(() => {funcs.mat_conv.pipe.build(padded.ret, kernel)}).time 55 | } 56 | } 57 | 58 | for (let i = 1; i <= options.num_iterations; i++) { 59 | benchmarks.mat_mult.gpu.push( 60 | benchIt(() => 61 | { 62 | funcs.mat_mult.gpu.run(mat.ret[0], mat.ret[1]); 63 | } 64 | ).time 65 | ) 66 | 67 | benchmarks.mat_conv.gpu.push( 68 | benchIt(() => 69 | { 70 | funcs.mat_conv.gpu.run(padded.ret, kernel); 71 | } 72 | ).time 73 | ) 74 | 75 | if (options.cpu_benchmark) { 76 | benchmarks.mat_mult.cpu.push( 77 | benchIt(() => 78 | { 79 | funcs.mat_mult.cpu(mat.ret[0], mat.ret[1]); 80 | } 81 | ).time 82 | ) 83 | } 84 | 85 | if (options.cpu_benchmark) { 86 | benchmarks.mat_conv.cpu.push( 87 | benchIt(() => 88 | { 89 | funcs.mat_conv.cpu(padded.ret, kernel); 90 | } 91 | ).time 92 | ) 93 | } 94 | 95 | const func = (mat1, mat2) => { 96 | funcs.mat_mult.pipe.run(mat1, mat2); 97 | const result = getTexture(funcs.mat_mult.pipe.renderOutput()); 98 | return result; 99 | } 100 | 101 | benchmarks.pipe.gpu.push( 102 | benchIt(() => { 103 | return func(func(func(func(matrixTexs[0], matrixTexs[1]), matrixTexs[2]), matrixTexs[3]), matrixTexs[4]).toArray(); 104 | }).time 105 | ) 106 | 107 | if (options.cpu_benchmark) { 108 | benchmarks.pipe.cpu.push( 109 | benchIt(() => { 110 | const func = funcs.mat_mult.cpu; 111 | 112 | func(func(func(func(mat.ret[0], mat.ret[1]), mat.ret[2]), mat.ret[3]), mat.ret[4]); 113 | }).time 114 | ) 115 | } 116 | 117 | if (options.logs) console.log(`Iteration ${YELLOW_UNDER}${i}${NC} ${GREEN_NO_UNDER}completed${NC} ${GREEN_NO_UNDER}✔${NC}`); 118 | } 119 | 120 | while (matrixTexs.length > 0) matrixTexs.pop().delete(); 121 | 122 | for (let i in funcs) { 123 | funcs[i].gpu.destroy(); 124 | funcs[i].pipe.destroy(); 125 | } 126 | getTexture.destroy(); 127 | 128 | const run_time = { 129 | mat_mult: { 130 | gpu: getMinMaxAvg(benchmarks.mat_mult.gpu), 131 | cpu: options.cpu_benchmark ? getMinMaxAvg(benchmarks.mat_mult.cpu) : {min: -1, avg: -1, max: -1, deviation: -1} 132 | }, 133 | 134 | mat_conv: { 135 | gpu: getMinMaxAvg(benchmarks.mat_conv.gpu), 136 | cpu: options.cpu_benchmark ? getMinMaxAvg(benchmarks.mat_conv.cpu) : {min: -1, avg: -1, max: -1, deviation: -1} 137 | }, 138 | 139 | pipe: { 140 | gpu: getMinMaxAvg(benchmarks.pipe.gpu), 141 | cpu: options.cpu_benchmark ? getMinMaxAvg(benchmarks.pipe.cpu) : {min: -1, avg: -1, max: -1, deviation: -1} 142 | } 143 | } 144 | 145 | const stats = generateStats(run_time, build_time); 146 | 147 | const benches = { 148 | mat_gen: mat.time, 149 | mat_pad: padded.time, 150 | 151 | build_time, 152 | run_time, 153 | 154 | stats, 155 | score: getScore(run_time, options.matrix_size), 156 | 157 | options 158 | } 159 | 160 | return benches; 161 | } 162 | 163 | module.exports = run; 164 | -------------------------------------------------------------------------------- /src/stats/diff.js: -------------------------------------------------------------------------------- 1 | const getDiff = (val1, val2) => Math.floor( 2 | ((val2 - val1) / val2) * 10000 3 | ) / 100 4 | 5 | module.exports = (val1, val2) => val1 < val2 ? 6 | { 7 | diff: getDiff(val1, val2), greater: 0 8 | } : 9 | { 10 | diff: getDiff(val2, val1), greater: 1 11 | } -------------------------------------------------------------------------------- /src/stats/format-diff.js: -------------------------------------------------------------------------------- 1 | module.exports = (diff, contenders) => { 2 | if (diff.diff >= 100){ 3 | contenders.splice(diff.greater, diff.greater + 1); 4 | 5 | return { 6 | percentage: -1, 7 | winner: contenders[0] 8 | } 9 | } 10 | 11 | return { 12 | percentage: diff.diff, 13 | winner: contenders[diff.greater] 14 | } 15 | } -------------------------------------------------------------------------------- /src/stats/generate_stats/find-run-best-worst.js: -------------------------------------------------------------------------------- 1 | const findRunBestWorst = (stats, run_time) => { 2 | for (const bench in run_time) { 3 | let better_avg = Infinity, 4 | better_performer = '', 5 | worse_avg = 0, 6 | worse_performer = ''; 7 | 8 | for (const performer in run_time[bench]) { 9 | if (better_avg > run_time[bench][performer].avg && run_time[bench][performer].avg != -1){ 10 | better_performer = performer; 11 | better_avg = Math.min(run_time[bench][performer].avg, better_avg); 12 | } 13 | 14 | if (worse_avg < run_time[bench][performer].avg && run_time[bench][performer].avg != -1){ 15 | worse_performer = performer; 16 | worse_avg = Math.max(run_time[bench][performer].avg, worse_avg); 17 | } 18 | 19 | if (run_time[bench][performer].avg == -1) better_avg = -1; 20 | } 21 | 22 | stats.run_time[bench].best_performer = better_performer; 23 | stats.run_time[bench].worst_performer = worse_performer; 24 | } 25 | } 26 | 27 | module.exports = findRunBestWorst; -------------------------------------------------------------------------------- /src/stats/generate_stats/generate-build-stats.js: -------------------------------------------------------------------------------- 1 | const getDiff = require('../diff'); 2 | const formatDiff = require('../format-diff'); 3 | const buildTimeFormat = require('../output_formats/build-time-format.json'); 4 | const _ = require('lodash'); 5 | 6 | 7 | const generateBuildStats = (stats, build_time) => { 8 | for (const bench in stats.build_time) { 9 | stats.build_time[bench] = _.cloneDeep(buildTimeFormat); 10 | const rawDiff = getDiff(build_time[bench].gpu, build_time[bench].pipe); 11 | const diff = formatDiff(rawDiff, ['gpu', 'pipe']); 12 | 13 | stats.build_time[bench].diff.gpu_pipe = diff; 14 | } 15 | } 16 | 17 | module.exports = generateBuildStats; -------------------------------------------------------------------------------- /src/stats/generate_stats/generate-overall-stats.js: -------------------------------------------------------------------------------- 1 | const getDiff = require('../diff'); 2 | const formatDiff = require('../format-diff'); 3 | 4 | const generateOverallStats = (stats, run_time, build_time) => { 5 | for (const bench in stats.overall) { 6 | let better_total = Infinity, 7 | better_performer = '', 8 | worse_total = 0, 9 | worse_performer = '', 10 | performerNotBenched; 11 | 12 | for (const performer in run_time[bench]){ 13 | 14 | const performer_build_time = performer == 'cpu' ? 0 : build_time[bench][performer], 15 | performer_run_time = run_time[bench][performer].avg, 16 | total_time = performer_build_time + performer_run_time; 17 | 18 | if (total_time < better_total && run_time[bench][performer].avg != -1){ 19 | better_total = total_time; 20 | better_performer = performer; 21 | } 22 | 23 | performerNotBenched = (performerNotBenched || run_time[bench][performer].avg == -1); 24 | 25 | if (total_time > worse_total && run_time[bench][performer].avg != -1){ 26 | worse_total = total_time; 27 | worse_performer = performer; 28 | } 29 | 30 | } 31 | 32 | if (performerNotBenched) worse_total = -1; 33 | 34 | stats.overall[bench].best_performer = better_performer; 35 | stats.overall[bench].worst_performer = worse_performer; 36 | stats.overall[bench].diff = formatDiff(getDiff(better_total, worse_total), [better_performer, worse_performer]); 37 | } 38 | } 39 | 40 | module.exports = generateOverallStats; -------------------------------------------------------------------------------- /src/stats/generate_stats/generate-run-stats.js: -------------------------------------------------------------------------------- 1 | const getDiff = require('../diff'); 2 | const formatDiff = require('../format-diff'); 3 | const runTimeFormat = require('../output_formats/run-time-format.json'); 4 | const _ = require('lodash'); 5 | 6 | const generateRunStats = (stats, run_time) => { 7 | for (const bench in stats.run_time) { 8 | stats.run_time[bench] = _.cloneDeep(runTimeFormat); 9 | 10 | for (const diffName in stats.run_time[bench].diff) { 11 | const contenders = diffName.split('_'); 12 | const rawDiffs = { 13 | min: {}, 14 | max: {}, 15 | avg: {} 16 | } 17 | 18 | for (const rawDiff in rawDiffs) { 19 | rawDiffs[rawDiff] = getDiff( 20 | run_time[bench][contenders[0]][rawDiff], 21 | run_time[bench][contenders[1]][rawDiff] 22 | ) 23 | if (run_time[bench][contenders[0]][rawDiff] == -1 || run_time[bench][contenders[1]][rawDiff] == -1) rawDiffs[rawDiff].diff = -1; 24 | } 25 | 26 | const diff = { 27 | min: formatDiff(rawDiffs.min, contenders), 28 | max: formatDiff(rawDiffs.max, contenders), 29 | avg: formatDiff(rawDiffs.avg, contenders) 30 | } 31 | 32 | stats.run_time[bench].diff[diffName] = diff; 33 | } 34 | } 35 | } 36 | 37 | module.exports = generateRunStats; -------------------------------------------------------------------------------- /src/stats/get-score.js: -------------------------------------------------------------------------------- 1 | const getScore = (run_time, matrix_size) => { 2 | const score = { 3 | gpu: Math.floor((Math.pow(matrix_size, 3) / run_time.mat_mult.gpu.avg) / 100) , 4 | cpu: Math.floor((Math.pow(matrix_size, 3) / run_time.mat_mult.cpu.avg) / 100) 5 | } 6 | 7 | return score; 8 | } 9 | 10 | module.exports = getScore; -------------------------------------------------------------------------------- /src/stats/get-stats.js: -------------------------------------------------------------------------------- 1 | const stats = require('./output_formats/stats.json'); // Template 2 | 3 | const generateBuildStats = require('./generate_stats/generate-build-stats'), 4 | generateRunStats = require('./generate_stats/generate-run-stats'), 5 | findRunBestWorst = require('./generate_stats/find-run-best-worst'), 6 | generateOverallStats = require('./generate_stats/generate-overall-stats'); 7 | 8 | const generateStatsObj = (run_time, build_time) => { 9 | generateRunStats(stats, run_time); 10 | generateBuildStats(stats, build_time); 11 | findRunBestWorst(stats, run_time); 12 | generateOverallStats(stats, run_time, build_time); 13 | 14 | return stats; 15 | } 16 | 17 | module.exports = { 18 | generateStatsObj 19 | } -------------------------------------------------------------------------------- /src/stats/output_formats/build-time-format.json: -------------------------------------------------------------------------------- 1 | { 2 | "diff": { 3 | "gpu_pipe": {} 4 | } 5 | } -------------------------------------------------------------------------------- /src/stats/output_formats/overall-format.json: -------------------------------------------------------------------------------- 1 | { 2 | "best_performer": {}, 3 | "worst_performer": {}, 4 | "diff": {} 5 | } -------------------------------------------------------------------------------- /src/stats/output_formats/run-time-format.json: -------------------------------------------------------------------------------- 1 | { 2 | "diff": { 3 | "cpu_gpu": {} 4 | }, 5 | "best_performer": "", 6 | "worst_performer": "" 7 | } -------------------------------------------------------------------------------- /src/stats/output_formats/stats.json: -------------------------------------------------------------------------------- 1 | { 2 | "run_time": { 3 | "mat_mult": {}, 4 | "mat_conv": {}, 5 | "pipe": {} 6 | }, 7 | "build_time": { 8 | "mat_mult": {}, 9 | "mat_conv": {} 10 | }, 11 | "overall": { 12 | "mat_mult": {}, 13 | "mat_conv": {} 14 | } 15 | } -------------------------------------------------------------------------------- /src/util/bench-it.js: -------------------------------------------------------------------------------- 1 | const now = require('performance-now'); 2 | /** 3 | * @method benchIt 4 | * @param {Function} func the function to be run 5 | * @returns {{ret: *, time: Number}} 6 | */ 7 | module.exports = func => { 8 | 9 | let time = now() * (-1); 10 | const ret = func(); 11 | time += now(); 12 | time *= 100; // To return only two decimal places 13 | time = Math.floor(time) / 100; 14 | 15 | return { 16 | ret, 17 | time 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/util/benchmark-out.js: -------------------------------------------------------------------------------- 1 | const { getPlotlyJSON: convertToPlotlyJSON, getChartistJSON: convertToChartistJSON } = require('./export-as-json'); 2 | 3 | class BenchmarkOut { 4 | /** 5 | * @param {Boolean} [singleData] whether only a single data object is to be stored 6 | * @param {*} [initData] initialData 7 | * @returns {null} 8 | */ 9 | constructor(singleData = false, initData) { 10 | this.singleData = singleData; 11 | 12 | if (singleData) { 13 | this.data = initData; 14 | } 15 | else { 16 | this.data = []; 17 | if (initData){ 18 | this.data.push(initData) 19 | } 20 | } 21 | } 22 | 23 | /** 24 | * @method addData 25 | * @param {Object} newData new data object to be added to a multi-data array 26 | * @returns {null} 27 | */ 28 | addData(newData) { 29 | if (!this.singleData) { 30 | this.data.push(newData) 31 | } 32 | else throw "Single Data" 33 | } 34 | 35 | /** 36 | * @method setDataField 37 | * @param {String} field the field name 38 | * @param {*} value the field value 39 | * @param {Number} [index=0] index of the data object in the multi-data array 40 | * @returns {null} 41 | */ 42 | setDataField(field, value, index = 0) { 43 | if (this.singleData) { 44 | this.data[field] = value; 45 | } 46 | else { 47 | this.data[index][field] = value; 48 | } 49 | } 50 | 51 | /** 52 | * @method getDataField 53 | * @param {String} field the field name 54 | * @param {Number} [index=0] index of the data object in the multi-data array 55 | * @returns {*} 56 | */ 57 | getDataField(field, index = 0) { 58 | if (this.singleData) { 59 | return this.data[field]; 60 | } 61 | else { 62 | return this.data[index][field]; 63 | } 64 | } 65 | 66 | /** 67 | * @method getData 68 | * @returns {Object} 69 | */ 70 | getData() { 71 | return this.data; 72 | } 73 | 74 | /** 75 | * @description Returns a plotly style array of graphs 76 | * @param {Array} compare_fields 77 | */ 78 | getPlotlyJSON(compare_fields = [ 79 | { 80 | x: 'matrix_size', 81 | y: 'gpu_run_time_mat_mult' 82 | }, 83 | { 84 | x: 'matrix_size', 85 | y: 'pipe_run_time' 86 | }, 87 | { 88 | x: 'matrix_size', 89 | y: 'gpu_score' 90 | } 91 | ]) { 92 | if (!this.singleData){ 93 | const retArr = []; 94 | compare_fields.forEach((compareField) => { 95 | retArr.push(convertToPlotlyJSON(this.data, { 96 | x: compareField.x, 97 | y: compareField.y 98 | })) 99 | }) 100 | 101 | return retArr; 102 | } 103 | else throw "Only possible for multi-data arrays" 104 | } 105 | 106 | /** 107 | * @description Returns a plotly style array of graphs 108 | * @param {Array} compare_fields 109 | */ 110 | getChartistJSON(compare_fields = [ 111 | { 112 | x: 'matrix_size', 113 | y: 'gpu_run_time_mat_mult' 114 | }, 115 | { 116 | x: 'matrix_size', 117 | y: 'pipe_run_time' 118 | }, 119 | { 120 | x: 'matrix_size', 121 | y: 'gpu_score' 122 | } 123 | ]) { 124 | if (!this.singleData){ 125 | const retArr = []; 126 | compare_fields.forEach((compareField) => { 127 | retArr.push(convertToChartistJSON(this.data, { 128 | x: compareField.x, 129 | y: compareField.y 130 | })) 131 | }) 132 | 133 | return retArr; 134 | } 135 | else throw "Only possible for multi-data arrays" 136 | } 137 | } 138 | 139 | module.exports = BenchmarkOut; -------------------------------------------------------------------------------- /src/util/defaults.json: -------------------------------------------------------------------------------- 1 | { 2 | "matrix_size": 512, 3 | "logs": true, 4 | "cpu_benchmark": true, 5 | "num_iterations": 1 6 | } -------------------------------------------------------------------------------- /src/util/export-as-json.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @method removeUnnecesasaryProps 3 | * @description removes unnecessary properties from the benchmarks object(to be stringified) 4 | * @param {"Object"} data The benchmark data 5 | * @returns {"Object"} 6 | */ 7 | const removeUnnecessaryProps = (data) => { 8 | data.options.gpu = ''; 9 | data.options.cpu = ''; 10 | 11 | return data 12 | } 13 | 14 | /** 15 | * @method getBenchmarkJSON 16 | * @description returns the benchmark data as a JSON string 17 | * @param {"Object"} data The benchmark data 18 | * @returns {"Object"} 19 | */ 20 | const getBenchmarkJSON = (data) => { 21 | return JSON.stringify(removeUnnecessaryProps(data)); 22 | } 23 | 24 | const getPlotData = (dataArr, axes, plotFunction) => { 25 | const setVal = (input, data) => { 26 | let outData; 27 | switch (input) { 28 | case 'matrix_size': 29 | outData = data.options.matrix_size; 30 | break; 31 | 32 | case 'gpu_score': 33 | outData = data.score.gpu; 34 | break; 35 | case 'cpu_score': 36 | outData = data.score.cpu; 37 | break; 38 | 39 | case 'gpu_run_time_mat_mult': 40 | outData = data.run_time.mat_mult.gpu.avg; 41 | break; 42 | case 'gpu_run_time_mat_conv': 43 | outData = data.run_time.mat_conv.gpu.avg; 44 | break; 45 | case 'cpu_run_time_mat_mult': 46 | outData = data.run_time.mat_mult.cpu.avg; 47 | break; 48 | case 'cpu_run_time_mat_conv': 49 | outData = data.run_time.mat_conv.cpu.avg; 50 | break; 51 | 52 | case 'pipe_run_time': 53 | outData = data.run_time.pipe.gpu.avg; 54 | break; 55 | } 56 | return outData; 57 | } 58 | 59 | dataArr.forEach(data => { 60 | let x, y; 61 | x = setVal(axes.x, data); 62 | y = setVal(axes.y, data); 63 | 64 | plotFunction(x, y); 65 | }) 66 | } 67 | 68 | /** 69 | * @method getPlotlyJSON 70 | * @description returns multiple benchmarks as plotly format graph JSON string 71 | * @param {"Array"} dataArr An array of benchmarks 72 | * @param {"Object"} axes An object containing x and y axis labels 73 | */ 74 | const getPlotlyJSON = (dataArr, axes = {x: '', y: ''}) => { 75 | const out = {x_series: [], y_series: []} 76 | 77 | getPlotData(dataArr, axes, (x, y) => { 78 | out.x_series.push(x); 79 | out.y_series.push(y); 80 | }) 81 | 82 | return out; 83 | } 84 | 85 | /** 86 | * @method getChartistJSON 87 | * @description returns multiple benchmarks as chartist format graph JSON string 88 | * @param {"Array"} dataArr An array of benchmarks 89 | * @param {"Object"} axes An object containing x and y axis labels 90 | */ 91 | const getChartistJSON = (dataArr, axes = {x: '', y: ''}) => { 92 | const out = []; 93 | 94 | getPlotData(dataArr, axes, (x, y) => { 95 | out.push({ 96 | x, 97 | y 98 | }) 99 | }) 100 | 101 | return out; 102 | } 103 | 104 | module.exports = { 105 | getBenchmarkJSON, 106 | getPlotlyJSON, 107 | getChartistJSON 108 | } -------------------------------------------------------------------------------- /src/util/get-default-options.js: -------------------------------------------------------------------------------- 1 | const defaults = require('./defaults.json'); 2 | 3 | /** 4 | * @param {...Options} options 5 | */ 6 | const getDefaultOptions = (options) => { 7 | options.num_iterations = options.num_iterations || defaults.num_iterations; 8 | 9 | options.matrix_size = options.matrix_size || defaults.matrix_size; 10 | 11 | options.logs = options.logs === undefined ? defaults.logs : options.logs == true; 12 | options.cpu_benchmark = options.cpu_benchmark === undefined ? defaults.cpu_benchmark : options.cpu_benchmark == true; 13 | 14 | options.gpu = options.gpu; 15 | options.cpu = options.cpu; 16 | 17 | return options; 18 | } 19 | 20 | module.exports = getDefaultOptions; -------------------------------------------------------------------------------- /src/util/get-min-max.js: -------------------------------------------------------------------------------- 1 | module.exports = arr => { 2 | const avg = Math.floor( 3 | ( 4 | arr.reduce((acc, val) => acc + val) / arr.length 5 | ) * 100 6 | ) / 100, 7 | min = arr.reduce((min, val) => Math.min(min, val)), 8 | max = arr.reduce((max, val) => Math.max(max, val)); 9 | 10 | // Deviation Calculation 11 | let difference = 0; 12 | 13 | arr.forEach(val => difference += Math.abs(val - avg)); 14 | 15 | const deviation = Math.floor( 16 | ( 17 | difference / avg 18 | ) * 100 19 | ) / 100; 20 | 21 | return { 22 | avg, 23 | min, 24 | max, 25 | deviation 26 | } 27 | } -------------------------------------------------------------------------------- /src/util/get-texture.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @method getgetTextureKernel 3 | * @param {"GPU"} gpu 4 | * @param {Number} arrayX 5 | * @param {Number} arrayY 6 | */ 7 | const getgetTextureKernel = (gpu, arrayX, arrayY) => { 8 | return gpu.createKernel(function(array) { 9 | return array[this.thread.y][this.thread.x]; 10 | }, 11 | { 12 | output: [arrayX, arrayY], 13 | pipeline: true 14 | }) 15 | } 16 | 17 | module.exports = getgetTextureKernel; -------------------------------------------------------------------------------- /src/util/multi-bench.js: -------------------------------------------------------------------------------- 1 | const { YELLOW_UNDER, RED_FLASH, NC } = require('../../cli/colors'), 2 | BenchmarkOut = require('./benchmark-out'), 3 | getDefaultOptions = require('./get-default-options'), 4 | run = require('../run'), 5 | { br } = require('../../cli/format'); 6 | 7 | const defaultOptions = { 8 | common_options: { // options common to all but can be overridden in range or in full_options, preference given to range 9 | cpu_benchmark: false 10 | }, 11 | range: { // only one of this and full_options works 12 | option_name: 'matrix_size', 13 | interval: [128, 1024], 14 | step: 100 //(default 10) one of step or common_ratio can be used, preference given to step 15 | // common_ratio: 2 (G.P.: 128, 256, 512, 1024) 16 | }, 17 | full_options: [ 18 | { 19 | // array of options objects for each benchmark(only one of this and range works, preference given to range) 20 | } 21 | ] 22 | } 23 | /** 24 | * @method multipleBenchmark 25 | * @description runs multiple GPU.js benchmarks each with different options 26 | * @param {"Object"} options array of optional options objects 27 | * @returns {"Object"} 28 | */ 29 | const multipleBenchmark = (options = defaultOptions) => { 30 | const out = new BenchmarkOut(); 31 | const commonBenchmarkOptions = getDefaultOptions(options.common_options || defaultOptions.common_options); 32 | const benchmarkOptionsArr = []; 33 | 34 | if (options.range) { 35 | const interval = options.range.interval, 36 | option_name = options.range.option_name; 37 | 38 | if (options.range.step) { 39 | const step = options.range.step; 40 | 41 | for (let i = interval[0]; i <= interval[1]; i += step) { 42 | benchmarkOptionsArr.push({ 43 | ...commonBenchmarkOptions, 44 | }) 45 | benchmarkOptionsArr[benchmarkOptionsArr.length - 1][option_name] = i; 46 | } 47 | } 48 | else if (options.range.common_ratio) { 49 | const common_ratio = options.range.common_ratio; 50 | 51 | for (let i = interval[0]; i <= interval[1]; i *= common_ratio) { 52 | benchmarkOptionsArr.push({ 53 | ...commonBenchmarkOptions, 54 | }) 55 | benchmarkOptionsArr[benchmarkOptionsArr.length - 1][option_name] = Math.min(i, interval[1]) 56 | } 57 | } 58 | else { 59 | const step = 10; 60 | 61 | for (let i = interval[0]; i <= interval[1]; i += step) { 62 | benchmarkOptionsArr.push({ 63 | ...commonBenchmarkOptions, 64 | }) 65 | benchmarkOptionsArr[benchmarkOptionsArr.length - 1][option_name] = i; 66 | } 67 | } 68 | } 69 | else if (options.full_options) { 70 | options.full_options.forEach(optionSet => { 71 | benchmarkOptionsArr.push({ 72 | ...commonBenchmarkOptions, 73 | ...optionSet 74 | }) 75 | }) 76 | } 77 | 78 | benchmarkOptionsArr.forEach((benchmarkOption, i) => { 79 | console.log(`Config ${YELLOW_UNDER}#${i}${NC}:`); 80 | 81 | console.log(`MATRIX_SIZE: ${YELLOW_UNDER}${benchmarkOption.matrix_size}${NC}`); 82 | console.log(`NUM_ITERATIONS: ${YELLOW_UNDER}${benchmarkOption.num_iterations}${NC}`); 83 | console.log(`CPU_BENCHMARK: ${YELLOW_UNDER}${benchmarkOption.cpu_benchmark}${NC}`); 84 | br(); 85 | 86 | out.addData(run(benchmarkOption)); 87 | br(); 88 | br(); 89 | }) 90 | 91 | if (benchmarkOptionsArr.length === 0) console.log(`${RED_FLASH}The Options are Invalid${NC}`); 92 | 93 | return out; 94 | } 95 | 96 | module.exports = multipleBenchmark; 97 | -------------------------------------------------------------------------------- /test/benches/convolution.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | { kernel, kernelX, kernelY, paddingX, paddingY, paddificate, generateFuncs } = require('../../src/benches/convolution'), 3 | { GPU } = require('gpu.js'); 4 | 5 | const gpu = new GPU({mode: 'gpu'}); 6 | const cpu = new GPU({mode: 'cpu'}); 7 | 8 | test('matrix convolution benchmark test', t => { 9 | const expectedKernelX = 3, 10 | expectedKernelY = 3, 11 | expectedPaddingX = 1, 12 | expectedPaddingY = 1, 13 | array = [ 14 | [1, 2, 1], 15 | [1, 3, 4], 16 | [5, 5, 8] 17 | ], 18 | expectedPaddedArray = [ 19 | [1, 1, 2, 1, 1], 20 | [1, 1, 2, 1, 1], 21 | [1, 1, 3, 4, 4], 22 | [5, 5, 5, 8, 8], 23 | [5, 5, 5, 8, 8] 24 | ], 25 | expectedConvolvedArray = [ 26 | [18, 23, 27], 27 | [34, 42, 52], 28 | [51, 65, 78] 29 | ] 30 | 31 | t.equal(kernelX, expectedKernelX, 'Correct kernel X width'); 32 | t.equal(kernelY, expectedKernelY, 'Correct kernel Y height'); 33 | 34 | t.equal(paddingX, expectedPaddingX, 'Correct padding X'); 35 | t.equal(paddingY, expectedPaddingY, 'Correct padding Y'); 36 | 37 | const paddedArray = paddificate(array, paddingX, paddingY); 38 | 39 | t.deepEqual(paddedArray, expectedPaddedArray, 'paddificate returns correctly padded array'); 40 | 41 | const funcs = generateFuncs(gpu, cpu, [array.length, array.length]); 42 | 43 | const gpuConvolve = funcs.gpu(expectedPaddedArray, kernel); 44 | cpuConvolve = funcs.cpu(expectedPaddedArray, kernel); 45 | 46 | t.deepEqual(cpuConvolve, gpuConvolve, 'CPU and GPU kernels return the same output.'); 47 | t.deepEqual(gpuConvolve, expectedConvolvedArray, 'GPU kernel works correctly.'); 48 | t.deepEqual(cpuConvolve, expectedConvolvedArray, 'CPU kernel works correctly.'); 49 | 50 | t.end(); 51 | }) -------------------------------------------------------------------------------- /test/benches/generate-matrices.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | generateMatrices = require('../../src/benches/generate-matrices'); 3 | 4 | test('generateMatrices function test', t => { 5 | const matrixSize = 3; 6 | 7 | const matrices = generateMatrices(matrixSize); 8 | 9 | t.equal(matrices.length, 5, 'generateMatrices produces 5 matrices') 10 | 11 | t.equal(matrices[0][0].length, 3, 'X width of matrix 1 is correct') 12 | t.equal(matrices[0].length, 3, 'Y height of matrix 1 is correct') 13 | 14 | t.equal(matrices[1][0].length, 3, 'X width of matrix 2 is correct') 15 | t.equal(matrices[1].length, 3, 'Y height of matrix 2 is correct') 16 | 17 | t.end(); 18 | }) -------------------------------------------------------------------------------- /test/benches/matrix-multiplication.js: -------------------------------------------------------------------------------- 1 | // const test = require('tape'), 2 | // { generateFuncs } = require('../../src/benches/convolution'), 3 | // { GPU } = require('gpu.js'); 4 | 5 | // const gpu = new GPU({mode: 'gpu'}); 6 | // const cpu = new GPU({mode: 'cpu'}); 7 | 8 | // test('matrix multiplication benchmark test', t => { 9 | // const array1 = [ 10 | // [1, 2, 1], 11 | // [1, 3, 4], 12 | // [5, 5, 8] 13 | // ], 14 | // array2 = [ 15 | // [1, 2, 1], 16 | // [9, 1, 2], 17 | // [1, 5, 3] 18 | // ], 19 | // expectedOutputArray = [ 20 | // [20, 9, 8], 21 | // [32, 25, 19], 22 | // [58, 55, 39] 23 | // ] 24 | 25 | // const funcs = generateFuncs(gpu, cpu, [array1.length, array1.length]); 26 | 27 | // const gpuMult = funcs.gpu(array1, array2), 28 | // cpuMult = funcs.cpu(array1, array2); 29 | 30 | // // t.deepEqual(gpuMult, cpuMult, 'CPU and GPU kernels return the same output.'); 31 | // // t.deepEqual(gpuMult, expectedOutputArray, 'GPU kernel works correctly.'); 32 | // // t.deepEqual(cpuConvolve, expectedConvolvedArray, 'CPU kernel works correctly.'); 33 | 34 | // t.end(); 35 | // }) -------------------------------------------------------------------------------- /test/cli/get-options.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | getOptionsInput = require('../../cli/get-options'); 3 | 4 | test('getOptionsInput skips asking when already defined', t => { 5 | const matrix_size = 123; 6 | const num_iterations = 50; 7 | const cpu_benchmark = {}; 8 | const options = getOptionsInput({ 9 | matrix_size, 10 | num_iterations, 11 | cpu_benchmark 12 | }); 13 | t.equals(options.matrix_size, matrix_size); 14 | t.equals(options.num_iterations, num_iterations); 15 | t.equals(options.cpu_benchmark, cpu_benchmark); 16 | t.end(); 17 | }); -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | const { GPU } = require('gpu.js'), 2 | test = require('tape'), 3 | index = require('../src/index').benchmark; 4 | 5 | const gpu = new GPU(), 6 | cpu = new GPU({ mode: 'cpu' }); 7 | 8 | test('index.js entry point test', t => { 9 | const expectedDefaults = require('../src/util/defaults.json'), 10 | expectedNonDefaultOptions = { 11 | gpu, 12 | cpu, 13 | matrix_size: 1024, 14 | num_iterations: 5, 15 | logs: false, 16 | cpu_benchmark: false 17 | }; 18 | 19 | const options = index({ 20 | gpu, 21 | cpu, 22 | gpu: new GPU(), 23 | }).getDataField('options'); 24 | const nonDefaultOptions = index(expectedNonDefaultOptions).getDataField('options'); 25 | 26 | for (let def in expectedDefaults) { 27 | t.equal(options[def], expectedDefaults[def], `Correct ${def} default.`); 28 | } 29 | 30 | for (let def in expectedNonDefaultOptions) { 31 | t.equal(nonDefaultOptions[def], expectedNonDefaultOptions[def], `Correct ${def} non default.`); 32 | } 33 | 34 | t.end(); 35 | }) -------------------------------------------------------------------------------- /test/run.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | { GPU } = require('gpu.js'), 3 | run = require('../src/run'); 4 | 5 | const options = { 6 | num_iterations: 1, 7 | matrix_size: 512, 8 | output: [512, 512], 9 | logs: false, 10 | cpu_benchmark: true, 11 | cpu: new GPU({mode: 'cpu'}), 12 | gpu: new GPU() 13 | } 14 | 15 | test('Run function test with cpu benchmark.', t => { 16 | const out = run(options); 17 | 18 | t.true(out.hasOwnProperty('mat_gen'), 'return value contains mat_gen property'); 19 | t.true(out.hasOwnProperty('mat_pad'), 'return value contains mat_pad property'); 20 | 21 | t.true(out.hasOwnProperty('build_time'), 'return value contains build_time property'); 22 | t.true(out.hasOwnProperty('run_time'), 'return value contains run_time property'); 23 | 24 | t.true(out.hasOwnProperty('stats'), 'return value contains stats property'); 25 | 26 | t.end(); 27 | }) 28 | 29 | test('Run function test without cpu benchmark.', t => { 30 | options.cpu_benchmark = false; 31 | const out = run(options); 32 | 33 | t.true(out.hasOwnProperty('mat_gen'), 'return value contains mat_gen property'); 34 | t.true(out.hasOwnProperty('mat_pad'), 'return value contains mat_pad property'); 35 | 36 | t.true(out.hasOwnProperty('build_time'), 'return value contains build_time property'); 37 | t.true(out.hasOwnProperty('run_time'), 'return value contains run_time property'); 38 | 39 | t.true(out.hasOwnProperty('stats'), 'return value contains stats property'); 40 | 41 | t.end(); 42 | }) -------------------------------------------------------------------------------- /test/stats/diff.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | getDiff = require('../../src/stats/diff'); 3 | 4 | test('getDiff stats function test', t => { 5 | const vals = [100, 200], 6 | expected = { 7 | diff: 50, 8 | greater: 0 9 | }; 10 | 11 | const diff = getDiff(vals[0], vals[1]); 12 | 13 | t.deepEqual(diff, expected, 'getDiff calculates correct diff'); 14 | 15 | t.end(); 16 | }) -------------------------------------------------------------------------------- /test/stats/get-score.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | getScore = require('../../src/stats/get-score'); 3 | 4 | test('getScore stats function test', t => { 5 | const matrix_size = 1024; 6 | const run_time = { 7 | mat_mult: { 8 | gpu: {avg: 1024}, 9 | cpu: {avg: 4096} 10 | } 11 | } 12 | 13 | const score = getScore(run_time, matrix_size); 14 | 15 | t.equals(score.gpu, 10485, 'Calculates expected score for GPU'); 16 | t.equals(score.cpu, 2621, 'Calculates expected score for CPU'); 17 | 18 | t.end(); 19 | }) -------------------------------------------------------------------------------- /test/stats/get-stats.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | getDiff = require('../../src/stats/diff'), 3 | { generateStatsObj } = require('../../src/stats/get-stats'), 4 | formatDiff = require('../../src/stats/format-diff'); 5 | 6 | test('formatDiff stats function test', t => { 7 | const diff = getDiff(5, 10), 8 | nonBenchDiff = getDiff(-1, 999999), 9 | expected = { 10 | percentage: 50, 11 | winner: 'contender1' 12 | }, 13 | expectedNonBenchDiff = { 14 | percentage: -1, 15 | winner: 'benchmarked' 16 | }, 17 | contenders = ['contender1', 'contender2'], 18 | nonBenchContenders = ['non-benchmarked', 'benchmarked']; 19 | 20 | const formattedDiff = formatDiff(diff, contenders), 21 | formattedNonBenchDiff = formatDiff(nonBenchDiff, nonBenchContenders); 22 | 23 | t.deepEqual(formattedDiff, expected, 'formatDiff produces expected output'); 24 | t.deepEqual(formattedNonBenchDiff, expectedNonBenchDiff, 'formatDiff produces expected output if the diff contains -1'); 25 | 26 | t.end(); 27 | }) 28 | 29 | test('generateStatsObj stats function test', t => { 30 | const run_time = { 31 | mat_mult: { 32 | gpu: { 33 | min: 10, 34 | max: 20, 35 | avg: 15 36 | }, 37 | cpu: { 38 | min: 20, 39 | max: 30, 40 | avg: 25 41 | } 42 | }, 43 | mat_conv: { 44 | gpu: { 45 | min: 8, 46 | max: 12, 47 | avg: 10 48 | }, 49 | cpu: { 50 | min: 5, 51 | max: 10, 52 | avg: 7.5 53 | } 54 | }, 55 | pipe: { 56 | gpu: { 57 | min: 100, 58 | max: 120, 59 | avg: 110 60 | }, 61 | cpu: { 62 | min: 2000, 63 | max: 4000, 64 | avg: 3000 65 | } 66 | } 67 | }, 68 | build_time = { 69 | mat_mult: { 70 | gpu: 25, 71 | pipe: 30 72 | }, 73 | mat_conv: { 74 | gpu: 20, 75 | pipe: 25 76 | } 77 | } 78 | 79 | const expectedStats = { 80 | run_time: { 81 | mat_mult: { 82 | diff: { 83 | cpu_gpu: { 84 | min: { 85 | percentage: 50, 86 | winner: 'gpu' 87 | }, 88 | max: { 89 | percentage: 33.33, 90 | winner: 'gpu' 91 | }, 92 | avg: { 93 | percentage: 40, 94 | winner: 'gpu' 95 | } 96 | } 97 | }, 98 | best_performer: 'gpu', 99 | worst_performer: 'cpu' 100 | }, 101 | mat_conv: { 102 | diff: { 103 | cpu_gpu: { 104 | min: { 105 | percentage: 37.5, 106 | winner: 'cpu' 107 | }, 108 | max: { 109 | percentage: 16.66, 110 | winner: 'cpu' 111 | }, 112 | avg: { 113 | percentage: 25, 114 | winner: 'cpu' 115 | } 116 | } 117 | }, 118 | best_performer: 'cpu', 119 | worst_performer: 'gpu' 120 | }, 121 | pipe: { 122 | diff: { 123 | cpu_gpu: { 124 | min: { 125 | percentage: 95, 126 | winner: 'gpu' 127 | }, 128 | max: { 129 | percentage: 97, 130 | winner: 'gpu' 131 | }, 132 | avg: { 133 | percentage: 96.33, 134 | winner: 'gpu' 135 | } 136 | } 137 | }, 138 | best_performer: 'gpu', 139 | worst_performer: 'cpu' 140 | } 141 | }, 142 | build_time: { 143 | mat_mult: { 144 | diff: { 145 | gpu_pipe: { 146 | percentage: 16.66, 147 | winner: 'gpu' 148 | } 149 | } 150 | }, 151 | mat_conv: { 152 | diff: { 153 | gpu_pipe: { 154 | percentage: 20, 155 | winner: 'gpu' 156 | } 157 | } 158 | } 159 | }, 160 | overall: { 161 | mat_mult: { 162 | best_performer: 'cpu', 163 | worst_performer: 'gpu', 164 | diff: { 165 | percentage: 37.5, 166 | winner: 'cpu' 167 | } 168 | }, 169 | mat_conv: { 170 | best_performer: 'cpu', 171 | worst_performer: 'gpu', 172 | diff: { 173 | percentage: 75, 174 | winner: 'cpu' 175 | } 176 | } 177 | } 178 | } 179 | 180 | const stats = generateStatsObj(run_time, build_time); 181 | 182 | t.deepEqual(stats.run_time.mat_mult, expectedStats.run_time.mat_mult, 'generateStatsObj produces expected matrix multiplication run time stats'); 183 | t.deepEqual(stats.run_time.mat_conv, expectedStats.run_time.mat_conv, 'generateStatsObj produces expected matrix convolution run time stats'); 184 | t.deepEqual(stats.run_time.pipe, expectedStats.run_time.pipe, 'generateStatsObj produces expected pipelining run time stats'); 185 | 186 | t.deepEqual(stats.build_time.mat_mult, expectedStats.build_time.mat_mult, 'generateStatsObj produces expected matrix multiplication build time stats'); 187 | t.deepEqual(stats.build_time.mat_conv, expectedStats.build_time.mat_conv, 'generateStatsObj produces expected matrix convolution build time stats'); 188 | 189 | t.deepEqual(stats.overall.mat_mult, expectedStats.overall.mat_mult, 'generateStatsObj produces expected matrix multiplication overall stats'); 190 | t.deepEqual(stats.overall.mat_conv, expectedStats.overall.mat_conv, 'generateStatsObj produces expected matrix convolution stats'); 191 | 192 | t.end(); 193 | }) -------------------------------------------------------------------------------- /test/util/bench-it.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | benchIt = require('../../src/util/bench-it'), 3 | now = require('performance-now'); 4 | 5 | const pause = (milliseconds, cb) => { 6 | const ms = now(); 7 | while ((now()) - ms <= milliseconds) {} 8 | return cb(); 9 | }, 10 | approx = (val, compare, margin = 30) => Math.abs(val - compare) <= margin; 11 | 12 | test('benchIt util function test', t => { 13 | const out = benchIt(() => pause(1000, () => 'return')); 14 | 15 | t.true(out.hasOwnProperty('ret') && out.hasOwnProperty('time'), 'benchIt returns all values'); 16 | t.equal(out.ret, 'return', 'benchIt returns the correct output'); 17 | t.true(approx(out.time, 1000), 'benchIt measures accurately'); 18 | 19 | t.end(); 20 | }) -------------------------------------------------------------------------------- /test/util/export-as-json.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | { getPlotlyJSON } = require('../../src/util/export-as-json'); 3 | 4 | test('getPlotlyJSON util function test', t => { 5 | const data = [ 6 | { 7 | options: { 8 | matrix_size: 512 9 | }, 10 | score: { 11 | gpu: 1000 12 | } 13 | }, 14 | { 15 | options: { 16 | matrix_size: 1024 17 | }, 18 | score: { 19 | gpu: 1212 20 | } 21 | }, 22 | { 23 | options: { 24 | matrix_size: 2048 25 | }, 26 | score: { 27 | gpu: 8992 28 | } 29 | }, 30 | { 31 | options: { 32 | matrix_size: 4096 33 | }, 34 | score: { 35 | gpu: 9982 36 | } 37 | } 38 | ] 39 | 40 | const expectedOut = { 41 | x_series: [512, 1024, 2048, 4096], 42 | y_series: [1000, 1212, 8992, 9982] 43 | } 44 | 45 | const out = getPlotlyJSON(data, { 46 | x: 'matrix_size', 47 | y: 'gpu_score' 48 | }) 49 | 50 | t.deepEqual(out, expectedOut, 'getPlotlyJSON returns correct JSON'); 51 | 52 | t.end(); 53 | }) -------------------------------------------------------------------------------- /test/util/get-min-max.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'), 2 | getMinMaxAvg = require('../../src/util/get-min-max'); 3 | 4 | test('getMinMaxAvg util function test', t => { 5 | const testArray = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], 6 | expected = { 7 | min: 10, 8 | max: 100, 9 | avg: 55, 10 | deviation: 4.54 11 | }; 12 | 13 | const minMax = getMinMaxAvg(testArray); 14 | 15 | for (let out in expected) { 16 | t.equal(minMax[out], expected[out], `${out} is correctly calculated.`) 17 | } 18 | 19 | t.deepEqual(minMax, expected, 'getMinMaxAvg returns correct values.'); 20 | 21 | t.end(); 22 | }) -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | JSONStream@^1.0.3: 6 | version "1.3.5" 7 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 8 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 9 | dependencies: 10 | jsonparse "^1.2.0" 11 | through ">=2.2.7 <3" 12 | 13 | abbrev@1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 16 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 17 | 18 | acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: 19 | version "1.8.2" 20 | resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" 21 | integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== 22 | dependencies: 23 | acorn "^7.0.0" 24 | acorn-walk "^7.0.0" 25 | xtend "^4.0.2" 26 | 27 | acorn-walk@^7.0.0: 28 | version "7.1.1" 29 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" 30 | integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== 31 | 32 | acorn@^7.0.0: 33 | version "7.1.1" 34 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" 35 | integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== 36 | 37 | acorn@^7.1.1: 38 | version "7.3.1" 39 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" 40 | integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== 41 | 42 | ajv@^6.5.5: 43 | version "6.12.3" 44 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" 45 | integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== 46 | dependencies: 47 | fast-deep-equal "^3.1.1" 48 | fast-json-stable-stringify "^2.0.0" 49 | json-schema-traverse "^0.4.1" 50 | uri-js "^4.2.2" 51 | 52 | ansi-regex@^2.0.0: 53 | version "2.1.1" 54 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 55 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 56 | 57 | ansi-regex@^3.0.0: 58 | version "3.0.0" 59 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 60 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 61 | 62 | ansi-styles@^2.2.1: 63 | version "2.2.1" 64 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 65 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 66 | 67 | aproba@^1.0.3: 68 | version "1.2.0" 69 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 70 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 71 | 72 | are-we-there-yet@~1.1.2: 73 | version "1.1.5" 74 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 75 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 76 | dependencies: 77 | delegates "^1.0.0" 78 | readable-stream "^2.0.6" 79 | 80 | asn1.js@^4.0.0: 81 | version "4.10.1" 82 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" 83 | integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== 84 | dependencies: 85 | bn.js "^4.0.0" 86 | inherits "^2.0.1" 87 | minimalistic-assert "^1.0.0" 88 | 89 | asn1@~0.2.3: 90 | version "0.2.4" 91 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 92 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 93 | dependencies: 94 | safer-buffer "~2.1.0" 95 | 96 | assert-plus@1.0.0, assert-plus@^1.0.0: 97 | version "1.0.0" 98 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 99 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 100 | 101 | assert@^1.4.0: 102 | version "1.5.0" 103 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" 104 | integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== 105 | dependencies: 106 | object-assign "^4.1.1" 107 | util "0.10.3" 108 | 109 | asynckit@^0.4.0: 110 | version "0.4.0" 111 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 112 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 113 | 114 | aws-sign2@~0.7.0: 115 | version "0.7.0" 116 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 117 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 118 | 119 | aws4@^1.8.0: 120 | version "1.10.0" 121 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" 122 | integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== 123 | 124 | balanced-match@^1.0.0: 125 | version "1.0.0" 126 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 127 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 128 | 129 | base64-js@^1.0.2: 130 | version "1.3.1" 131 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 132 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 133 | 134 | bcrypt-pbkdf@^1.0.0: 135 | version "1.0.2" 136 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 137 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 138 | dependencies: 139 | tweetnacl "^0.14.3" 140 | 141 | bindings@^1.5.0: 142 | version "1.5.0" 143 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 144 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 145 | dependencies: 146 | file-uri-to-path "1.0.0" 147 | 148 | bit-twiddle@^1.0.2: 149 | version "1.0.2" 150 | resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" 151 | integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= 152 | 153 | bl@^4.0.1: 154 | version "4.0.3" 155 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" 156 | integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== 157 | dependencies: 158 | buffer "^5.5.0" 159 | inherits "^2.0.4" 160 | readable-stream "^3.4.0" 161 | 162 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: 163 | version "4.11.9" 164 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" 165 | integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== 166 | 167 | brace-expansion@^1.1.7: 168 | version "1.1.11" 169 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 170 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 171 | dependencies: 172 | balanced-match "^1.0.0" 173 | concat-map "0.0.1" 174 | 175 | brorand@^1.0.1: 176 | version "1.1.0" 177 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 178 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 179 | 180 | browser-pack@^6.0.1: 181 | version "6.1.0" 182 | resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" 183 | integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== 184 | dependencies: 185 | JSONStream "^1.0.3" 186 | combine-source-map "~0.8.0" 187 | defined "^1.0.0" 188 | safe-buffer "^5.1.1" 189 | through2 "^2.0.0" 190 | umd "^3.0.0" 191 | 192 | browser-resolve@^1.11.0, browser-resolve@^1.7.0: 193 | version "1.11.3" 194 | resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" 195 | integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== 196 | dependencies: 197 | resolve "1.1.7" 198 | 199 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 200 | version "1.2.0" 201 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 202 | integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== 203 | dependencies: 204 | buffer-xor "^1.0.3" 205 | cipher-base "^1.0.0" 206 | create-hash "^1.1.0" 207 | evp_bytestokey "^1.0.3" 208 | inherits "^2.0.1" 209 | safe-buffer "^5.0.1" 210 | 211 | browserify-cipher@^1.0.0: 212 | version "1.0.1" 213 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" 214 | integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== 215 | dependencies: 216 | browserify-aes "^1.0.4" 217 | browserify-des "^1.0.0" 218 | evp_bytestokey "^1.0.0" 219 | 220 | browserify-des@^1.0.0: 221 | version "1.0.2" 222 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" 223 | integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== 224 | dependencies: 225 | cipher-base "^1.0.1" 226 | des.js "^1.0.0" 227 | inherits "^2.0.1" 228 | safe-buffer "^5.1.2" 229 | 230 | browserify-rsa@^4.0.0: 231 | version "4.0.1" 232 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 233 | integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= 234 | dependencies: 235 | bn.js "^4.1.0" 236 | randombytes "^2.0.1" 237 | 238 | browserify-sign@^4.0.0: 239 | version "4.0.4" 240 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" 241 | integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= 242 | dependencies: 243 | bn.js "^4.1.1" 244 | browserify-rsa "^4.0.0" 245 | create-hash "^1.1.0" 246 | create-hmac "^1.1.2" 247 | elliptic "^6.0.0" 248 | inherits "^2.0.1" 249 | parse-asn1 "^5.0.0" 250 | 251 | browserify-zlib@~0.2.0: 252 | version "0.2.0" 253 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 254 | integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== 255 | dependencies: 256 | pako "~1.0.5" 257 | 258 | browserify@16.5.0: 259 | version "16.5.0" 260 | resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.0.tgz#a1c2bc0431bec11fd29151941582e3f645ede881" 261 | integrity sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw== 262 | dependencies: 263 | JSONStream "^1.0.3" 264 | assert "^1.4.0" 265 | browser-pack "^6.0.1" 266 | browser-resolve "^1.11.0" 267 | browserify-zlib "~0.2.0" 268 | buffer "^5.0.2" 269 | cached-path-relative "^1.0.0" 270 | concat-stream "^1.6.0" 271 | console-browserify "^1.1.0" 272 | constants-browserify "~1.0.0" 273 | crypto-browserify "^3.0.0" 274 | defined "^1.0.0" 275 | deps-sort "^2.0.0" 276 | domain-browser "^1.2.0" 277 | duplexer2 "~0.1.2" 278 | events "^2.0.0" 279 | glob "^7.1.0" 280 | has "^1.0.0" 281 | htmlescape "^1.1.0" 282 | https-browserify "^1.0.0" 283 | inherits "~2.0.1" 284 | insert-module-globals "^7.0.0" 285 | labeled-stream-splicer "^2.0.0" 286 | mkdirp "^0.5.0" 287 | module-deps "^6.0.0" 288 | os-browserify "~0.3.0" 289 | parents "^1.0.1" 290 | path-browserify "~0.0.0" 291 | process "~0.11.0" 292 | punycode "^1.3.2" 293 | querystring-es3 "~0.2.0" 294 | read-only-stream "^2.0.0" 295 | readable-stream "^2.0.2" 296 | resolve "^1.1.4" 297 | shasum "^1.0.0" 298 | shell-quote "^1.6.1" 299 | stream-browserify "^2.0.0" 300 | stream-http "^3.0.0" 301 | string_decoder "^1.1.1" 302 | subarg "^1.0.0" 303 | syntax-error "^1.1.1" 304 | through2 "^2.0.0" 305 | timers-browserify "^1.0.1" 306 | tty-browserify "0.0.1" 307 | url "~0.11.0" 308 | util "~0.10.1" 309 | vm-browserify "^1.0.0" 310 | xtend "^4.0.0" 311 | 312 | buffer-from@^1.0.0: 313 | version "1.1.1" 314 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 315 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 316 | 317 | buffer-shims@~1.0.0: 318 | version "1.0.0" 319 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 320 | integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= 321 | 322 | buffer-xor@^1.0.3: 323 | version "1.0.3" 324 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 325 | integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= 326 | 327 | buffer@^5.0.2, buffer@^5.5.0: 328 | version "5.6.0" 329 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" 330 | integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== 331 | dependencies: 332 | base64-js "^1.0.2" 333 | ieee754 "^1.1.4" 334 | 335 | builtin-status-codes@^3.0.0: 336 | version "3.0.0" 337 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 338 | integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= 339 | 340 | cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: 341 | version "1.0.2" 342 | resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" 343 | integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== 344 | 345 | camel-case@^3.0.0: 346 | version "3.0.0" 347 | resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" 348 | integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= 349 | dependencies: 350 | no-case "^2.2.0" 351 | upper-case "^1.1.1" 352 | 353 | caseless@~0.12.0: 354 | version "0.12.0" 355 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 356 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 357 | 358 | chalk@^1.0.0: 359 | version "1.1.3" 360 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 361 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 362 | dependencies: 363 | ansi-styles "^2.2.1" 364 | escape-string-regexp "^1.0.2" 365 | has-ansi "^2.0.0" 366 | strip-ansi "^3.0.0" 367 | supports-color "^2.0.0" 368 | 369 | chownr@^1.1.1: 370 | version "1.1.4" 371 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 372 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 373 | 374 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 375 | version "1.0.4" 376 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 377 | integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== 378 | dependencies: 379 | inherits "^2.0.1" 380 | safe-buffer "^5.0.1" 381 | 382 | clean-css@^4.1.6, clean-css@^4.2.1: 383 | version "4.2.3" 384 | resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" 385 | integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== 386 | dependencies: 387 | source-map "~0.6.0" 388 | 389 | code-point-at@^1.0.0: 390 | version "1.1.0" 391 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 392 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 393 | 394 | combine-source-map@^0.8.0, combine-source-map@~0.8.0: 395 | version "0.8.0" 396 | resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" 397 | integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= 398 | dependencies: 399 | convert-source-map "~1.1.0" 400 | inline-source-map "~0.6.0" 401 | lodash.memoize "~3.0.3" 402 | source-map "~0.5.3" 403 | 404 | combined-stream@^1.0.6, combined-stream@~1.0.6: 405 | version "1.0.8" 406 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 407 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 408 | dependencies: 409 | delayed-stream "~1.0.0" 410 | 411 | commander@^2.19.0, commander@^2.20.0, commander@~2.20.3: 412 | version "2.20.3" 413 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 414 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 415 | 416 | concat-map@0.0.1: 417 | version "0.0.1" 418 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 419 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 420 | 421 | concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: 422 | version "1.6.2" 423 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 424 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 425 | dependencies: 426 | buffer-from "^1.0.0" 427 | inherits "^2.0.3" 428 | readable-stream "^2.2.2" 429 | typedarray "^0.0.6" 430 | 431 | console-browserify@^1.1.0: 432 | version "1.2.0" 433 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" 434 | integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== 435 | 436 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 437 | version "1.1.0" 438 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 439 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 440 | 441 | constants-browserify@~1.0.0: 442 | version "1.0.0" 443 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 444 | integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= 445 | 446 | convert-source-map@~1.1.0: 447 | version "1.1.3" 448 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" 449 | integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= 450 | 451 | core-util-is@1.0.2, core-util-is@~1.0.0: 452 | version "1.0.2" 453 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 454 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 455 | 456 | create-ecdh@^4.0.0: 457 | version "4.0.3" 458 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" 459 | integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== 460 | dependencies: 461 | bn.js "^4.1.0" 462 | elliptic "^6.0.0" 463 | 464 | create-hash@^1.1.0, create-hash@^1.1.2: 465 | version "1.2.0" 466 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 467 | integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 468 | dependencies: 469 | cipher-base "^1.0.1" 470 | inherits "^2.0.1" 471 | md5.js "^1.3.4" 472 | ripemd160 "^2.0.1" 473 | sha.js "^2.4.0" 474 | 475 | create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: 476 | version "1.1.7" 477 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 478 | integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== 479 | dependencies: 480 | cipher-base "^1.0.3" 481 | create-hash "^1.1.0" 482 | inherits "^2.0.1" 483 | ripemd160 "^2.0.0" 484 | safe-buffer "^5.0.1" 485 | sha.js "^2.4.8" 486 | 487 | crypto-browserify@^3.0.0: 488 | version "3.12.0" 489 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 490 | integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== 491 | dependencies: 492 | browserify-cipher "^1.0.0" 493 | browserify-sign "^4.0.0" 494 | create-ecdh "^4.0.0" 495 | create-hash "^1.1.0" 496 | create-hmac "^1.1.0" 497 | diffie-hellman "^5.0.0" 498 | inherits "^2.0.1" 499 | pbkdf2 "^3.0.3" 500 | public-encrypt "^4.0.0" 501 | randombytes "^2.0.0" 502 | randomfill "^1.0.3" 503 | 504 | css-b64-images@~0.2.5: 505 | version "0.2.5" 506 | resolved "https://registry.yarnpkg.com/css-b64-images/-/css-b64-images-0.2.5.tgz#42005d83204b2b4a5d93b6b1a5644133b5927a02" 507 | integrity sha1-QgBdgyBLK0pdk7axpWRBM7WSegI= 508 | 509 | dash-ast@^1.0.0: 510 | version "1.0.0" 511 | resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" 512 | integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== 513 | 514 | dashdash@^1.12.0: 515 | version "1.14.1" 516 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 517 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 518 | dependencies: 519 | assert-plus "^1.0.0" 520 | 521 | debug@^4.1.0: 522 | version "4.1.1" 523 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 524 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 525 | dependencies: 526 | ms "^2.1.1" 527 | 528 | decompress-response@^4.2.0: 529 | version "4.2.1" 530 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 531 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 532 | dependencies: 533 | mimic-response "^2.0.0" 534 | 535 | deep-equal@~1.1.1: 536 | version "1.1.1" 537 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" 538 | integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== 539 | dependencies: 540 | is-arguments "^1.0.4" 541 | is-date-object "^1.0.1" 542 | is-regex "^1.0.4" 543 | object-is "^1.0.1" 544 | object-keys "^1.1.1" 545 | regexp.prototype.flags "^1.2.0" 546 | 547 | deep-extend@^0.6.0: 548 | version "0.6.0" 549 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 550 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 551 | 552 | define-properties@^1.1.2, define-properties@^1.1.3: 553 | version "1.1.3" 554 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 555 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 556 | dependencies: 557 | object-keys "^1.0.12" 558 | 559 | defined@^1.0.0, defined@~1.0.0: 560 | version "1.0.0" 561 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 562 | integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= 563 | 564 | delayed-stream@~1.0.0: 565 | version "1.0.0" 566 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 567 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 568 | 569 | delegates@^1.0.0: 570 | version "1.0.0" 571 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 572 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 573 | 574 | deps-sort@^2.0.0: 575 | version "2.0.1" 576 | resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" 577 | integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== 578 | dependencies: 579 | JSONStream "^1.0.3" 580 | shasum-object "^1.0.0" 581 | subarg "^1.0.0" 582 | through2 "^2.0.0" 583 | 584 | des.js@^1.0.0: 585 | version "1.0.1" 586 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" 587 | integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== 588 | dependencies: 589 | inherits "^2.0.1" 590 | minimalistic-assert "^1.0.0" 591 | 592 | detect-libc@^1.0.3: 593 | version "1.0.3" 594 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 595 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 596 | 597 | detective@^5.2.0: 598 | version "5.2.0" 599 | resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" 600 | integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== 601 | dependencies: 602 | acorn-node "^1.6.1" 603 | defined "^1.0.0" 604 | minimist "^1.1.1" 605 | 606 | diffie-hellman@^5.0.0: 607 | version "5.0.3" 608 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" 609 | integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== 610 | dependencies: 611 | bn.js "^4.1.0" 612 | miller-rabin "^4.0.0" 613 | randombytes "^2.0.0" 614 | 615 | domain-browser@^1.2.0: 616 | version "1.2.0" 617 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 618 | integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== 619 | 620 | dotignore@~0.1.2: 621 | version "0.1.2" 622 | resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" 623 | integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== 624 | dependencies: 625 | minimatch "^3.0.4" 626 | 627 | duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: 628 | version "0.1.4" 629 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 630 | integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= 631 | dependencies: 632 | readable-stream "^2.0.2" 633 | 634 | duplexer@^0.1.1: 635 | version "0.1.1" 636 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 637 | integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= 638 | 639 | ecc-jsbn@~0.1.1: 640 | version "0.1.2" 641 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 642 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 643 | dependencies: 644 | jsbn "~0.1.0" 645 | safer-buffer "^2.1.0" 646 | 647 | elliptic@^6.0.0: 648 | version "6.5.3" 649 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" 650 | integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== 651 | dependencies: 652 | bn.js "^4.4.0" 653 | brorand "^1.0.1" 654 | hash.js "^1.0.0" 655 | hmac-drbg "^1.0.0" 656 | inherits "^2.0.1" 657 | minimalistic-assert "^1.0.0" 658 | minimalistic-crypto-utils "^1.0.0" 659 | 660 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 661 | version "1.4.4" 662 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 663 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 664 | dependencies: 665 | once "^1.4.0" 666 | 667 | env-paths@^2.2.0: 668 | version "2.2.0" 669 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" 670 | integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== 671 | 672 | es-abstract@^1.17.0-next.1: 673 | version "1.17.4" 674 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" 675 | integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== 676 | dependencies: 677 | es-to-primitive "^1.2.1" 678 | function-bind "^1.1.1" 679 | has "^1.0.3" 680 | has-symbols "^1.0.1" 681 | is-callable "^1.1.5" 682 | is-regex "^1.0.5" 683 | object-inspect "^1.7.0" 684 | object-keys "^1.1.1" 685 | object.assign "^4.1.0" 686 | string.prototype.trimleft "^2.1.1" 687 | string.prototype.trimright "^2.1.1" 688 | 689 | es-to-primitive@^1.2.1: 690 | version "1.2.1" 691 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 692 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 693 | dependencies: 694 | is-callable "^1.1.4" 695 | is-date-object "^1.0.1" 696 | is-symbol "^1.0.2" 697 | 698 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 699 | version "1.0.5" 700 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 701 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 702 | 703 | events@^2.0.0: 704 | version "2.1.0" 705 | resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" 706 | integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== 707 | 708 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 709 | version "1.0.3" 710 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 711 | integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== 712 | dependencies: 713 | md5.js "^1.3.4" 714 | safe-buffer "^5.1.1" 715 | 716 | expand-template@^2.0.3: 717 | version "2.0.3" 718 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 719 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 720 | 721 | extend@~3.0.2: 722 | version "3.0.2" 723 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 724 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 725 | 726 | extsprintf@1.3.0: 727 | version "1.3.0" 728 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 729 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 730 | 731 | extsprintf@^1.2.0: 732 | version "1.4.0" 733 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 734 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 735 | 736 | fast-deep-equal@^3.1.1: 737 | version "3.1.3" 738 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 739 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 740 | 741 | fast-json-stable-stringify@^2.0.0: 742 | version "2.1.0" 743 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 744 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 745 | 746 | fast-safe-stringify@^2.0.7: 747 | version "2.0.7" 748 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" 749 | integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== 750 | 751 | figures@^1.4.0: 752 | version "1.7.0" 753 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 754 | integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= 755 | dependencies: 756 | escape-string-regexp "^1.0.5" 757 | object-assign "^4.1.0" 758 | 759 | file-uri-to-path@1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 762 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 763 | 764 | for-each@~0.3.3: 765 | version "0.3.3" 766 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 767 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 768 | dependencies: 769 | is-callable "^1.1.3" 770 | 771 | forever-agent@~0.6.1: 772 | version "0.6.1" 773 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 774 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 775 | 776 | form-data@~2.3.2: 777 | version "2.3.3" 778 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 779 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 780 | dependencies: 781 | asynckit "^0.4.0" 782 | combined-stream "^1.0.6" 783 | mime-types "^2.1.12" 784 | 785 | fs-constants@^1.0.0: 786 | version "1.0.0" 787 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 788 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 789 | 790 | fs-minipass@^1.2.5: 791 | version "1.2.7" 792 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 793 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 794 | dependencies: 795 | minipass "^2.6.0" 796 | 797 | fs.realpath@^1.0.0: 798 | version "1.0.0" 799 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 800 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 801 | 802 | function-bind@^1.1.1, function-bind@~1.1.1: 803 | version "1.1.1" 804 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 805 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 806 | 807 | gauge@~2.7.3: 808 | version "2.7.4" 809 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 810 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 811 | dependencies: 812 | aproba "^1.0.3" 813 | console-control-strings "^1.0.0" 814 | has-unicode "^2.0.0" 815 | object-assign "^4.1.0" 816 | signal-exit "^3.0.0" 817 | string-width "^1.0.1" 818 | strip-ansi "^3.0.1" 819 | wide-align "^1.1.0" 820 | 821 | get-assigned-identifiers@^1.2.0: 822 | version "1.2.0" 823 | resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" 824 | integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== 825 | 826 | getpass@^0.1.1: 827 | version "0.1.7" 828 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 829 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 830 | dependencies: 831 | assert-plus "^1.0.0" 832 | 833 | github-from-package@0.0.0: 834 | version "0.0.0" 835 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 836 | integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= 837 | 838 | gl-wiretap@^0.6.2: 839 | version "0.6.2" 840 | resolved "https://registry.yarnpkg.com/gl-wiretap/-/gl-wiretap-0.6.2.tgz#e4aa19622831088fbaa7e5a18d01768f7a3fb07c" 841 | integrity sha512-fxy1XGiPkfzK+T3XKDbY7yaqMBmozCGvAFyTwaZA3imeZH83w7Hr3r3bYlMRWIyzMI/lDUvUMM/92LE2OwqFyQ== 842 | 843 | gl@^4.4.1: 844 | version "4.5.2" 845 | resolved "https://registry.yarnpkg.com/gl/-/gl-4.5.2.tgz#89151aaaf46251c2a68b99b2ab347d90a8538824" 846 | integrity sha512-EC4Gm4+yCpDrRaHeiRn7yBkl5EQwhTuwwCx1rVk423dS4RLLkoKfSRu2aXY5Cw5dduhv/f14W/kmWBHKVXYgYw== 847 | dependencies: 848 | bindings "^1.5.0" 849 | bit-twiddle "^1.0.2" 850 | glsl-tokenizer "^2.0.2" 851 | nan "^2.14.1" 852 | node-abi "^2.16.0" 853 | node-gyp "^6.1.0" 854 | prebuild-install "^5.1.0" 855 | 856 | glob@^7.1.0, glob@^7.1.3, glob@^7.1.4, glob@~7.1.6: 857 | version "7.1.6" 858 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 859 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 860 | dependencies: 861 | fs.realpath "^1.0.0" 862 | inflight "^1.0.4" 863 | inherits "2" 864 | minimatch "^3.0.4" 865 | once "^1.3.0" 866 | path-is-absolute "^1.0.0" 867 | 868 | glsl-tokenizer@^2.0.2: 869 | version "2.1.5" 870 | resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" 871 | integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== 872 | dependencies: 873 | through2 "^0.6.3" 874 | 875 | gpu-mock.js@^1.1.1: 876 | version "1.2.1" 877 | resolved "https://registry.yarnpkg.com/gpu-mock.js/-/gpu-mock.js-1.2.1.tgz#fafeb2a7ba3a065325071c8e56fe87944fd7cc01" 878 | integrity sha512-zoMKlvC3oj1/43TTJghnpEp4U4/8NgOE3ZqA0gF8fZ1YSCVKaaPcQT3F2FajqTI71gwCYxQ/VCqCA1TQRk9G9A== 879 | dependencies: 880 | gpu.js "^2.9.3" 881 | 882 | gpu.js@^2.9.3, gpu.js@^2.9.4: 883 | version "2.9.4" 884 | resolved "https://registry.yarnpkg.com/gpu.js/-/gpu.js-2.9.4.tgz#33babbb2670fa469343e2b04afba84b4d81d1640" 885 | integrity sha512-1N+gN83Y3ZuiazTvsXsjdXTzoT7C8tUWdaiGPn6zDMupJx54gRFgK/z67jYW45o3165t9qKUsrQja8sx3XlDCA== 886 | dependencies: 887 | acorn "^7.1.1" 888 | gl "^4.4.1" 889 | gl-wiretap "^0.6.2" 890 | gpu-mock.js "^1.1.1" 891 | 892 | graceful-fs@^4.2.2: 893 | version "4.2.4" 894 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 895 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 896 | 897 | har-schema@^2.0.0: 898 | version "2.0.0" 899 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 900 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 901 | 902 | har-validator@~5.1.3: 903 | version "5.1.3" 904 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 905 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 906 | dependencies: 907 | ajv "^6.5.5" 908 | har-schema "^2.0.0" 909 | 910 | has-ansi@^2.0.0: 911 | version "2.0.0" 912 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 913 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 914 | dependencies: 915 | ansi-regex "^2.0.0" 916 | 917 | has-symbols@^1.0.0, has-symbols@^1.0.1: 918 | version "1.0.1" 919 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 920 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 921 | 922 | has-unicode@^2.0.0: 923 | version "2.0.1" 924 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 925 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 926 | 927 | has@^1.0.0, has@^1.0.3, has@~1.0.3: 928 | version "1.0.3" 929 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 930 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 931 | dependencies: 932 | function-bind "^1.1.1" 933 | 934 | hash-base@^3.0.0: 935 | version "3.0.4" 936 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 937 | integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= 938 | dependencies: 939 | inherits "^2.0.1" 940 | safe-buffer "^5.0.1" 941 | 942 | hash.js@^1.0.0, hash.js@^1.0.3: 943 | version "1.1.7" 944 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 945 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 946 | dependencies: 947 | inherits "^2.0.3" 948 | minimalistic-assert "^1.0.1" 949 | 950 | he@^1.2.0: 951 | version "1.2.0" 952 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 953 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 954 | 955 | hmac-drbg@^1.0.0: 956 | version "1.0.1" 957 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 958 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 959 | dependencies: 960 | hash.js "^1.0.3" 961 | minimalistic-assert "^1.0.0" 962 | minimalistic-crypto-utils "^1.0.1" 963 | 964 | html-minifier@^4.0.0: 965 | version "4.0.0" 966 | resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-4.0.0.tgz#cca9aad8bce1175e02e17a8c33e46d8988889f56" 967 | integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== 968 | dependencies: 969 | camel-case "^3.0.0" 970 | clean-css "^4.2.1" 971 | commander "^2.19.0" 972 | he "^1.2.0" 973 | param-case "^2.1.1" 974 | relateurl "^0.2.7" 975 | uglify-js "^3.5.1" 976 | 977 | htmlescape@^1.1.0: 978 | version "1.1.1" 979 | resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" 980 | integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= 981 | 982 | http-signature@~1.2.0: 983 | version "1.2.0" 984 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 985 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 986 | dependencies: 987 | assert-plus "^1.0.0" 988 | jsprim "^1.2.2" 989 | sshpk "^1.7.0" 990 | 991 | https-browserify@^1.0.0: 992 | version "1.0.0" 993 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 994 | integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= 995 | 996 | ieee754@^1.1.4: 997 | version "1.1.13" 998 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 999 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 1000 | 1001 | inflight@^1.0.4: 1002 | version "1.0.6" 1003 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1004 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1005 | dependencies: 1006 | once "^1.3.0" 1007 | wrappy "1" 1008 | 1009 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: 1010 | version "2.0.4" 1011 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1012 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1013 | 1014 | inherits@2.0.1: 1015 | version "2.0.1" 1016 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1017 | integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= 1018 | 1019 | inherits@2.0.3: 1020 | version "2.0.3" 1021 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1022 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1023 | 1024 | ini@~1.3.0: 1025 | version "1.3.5" 1026 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1027 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1028 | 1029 | inline-source-map@~0.6.0: 1030 | version "0.6.2" 1031 | resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" 1032 | integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= 1033 | dependencies: 1034 | source-map "~0.5.3" 1035 | 1036 | insert-module-globals@^7.0.0: 1037 | version "7.2.0" 1038 | resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" 1039 | integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== 1040 | dependencies: 1041 | JSONStream "^1.0.3" 1042 | acorn-node "^1.5.2" 1043 | combine-source-map "^0.8.0" 1044 | concat-stream "^1.6.1" 1045 | is-buffer "^1.1.0" 1046 | path-is-absolute "^1.0.1" 1047 | process "~0.11.0" 1048 | through2 "^2.0.0" 1049 | undeclared-identifiers "^1.1.2" 1050 | xtend "^4.0.0" 1051 | 1052 | is-arguments@^1.0.4: 1053 | version "1.0.4" 1054 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" 1055 | integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== 1056 | 1057 | is-buffer@^1.1.0: 1058 | version "1.1.6" 1059 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1060 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1061 | 1062 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5: 1063 | version "1.1.5" 1064 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 1065 | integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== 1066 | 1067 | is-date-object@^1.0.1: 1068 | version "1.0.2" 1069 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1070 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1071 | 1072 | is-finite@^1.0.1: 1073 | version "1.1.0" 1074 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 1075 | integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 1076 | 1077 | is-fullwidth-code-point@^1.0.0: 1078 | version "1.0.0" 1079 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1080 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1081 | dependencies: 1082 | number-is-nan "^1.0.0" 1083 | 1084 | is-fullwidth-code-point@^2.0.0: 1085 | version "2.0.0" 1086 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1087 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1088 | 1089 | is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5: 1090 | version "1.0.5" 1091 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 1092 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 1093 | dependencies: 1094 | has "^1.0.3" 1095 | 1096 | is-symbol@^1.0.2: 1097 | version "1.0.3" 1098 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1099 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1100 | dependencies: 1101 | has-symbols "^1.0.1" 1102 | 1103 | is-typedarray@~1.0.0: 1104 | version "1.0.0" 1105 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1106 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1107 | 1108 | isarray@0.0.1: 1109 | version "0.0.1" 1110 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1111 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 1112 | 1113 | isarray@~1.0.0: 1114 | version "1.0.0" 1115 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1116 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1117 | 1118 | isexe@^2.0.0: 1119 | version "2.0.0" 1120 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1121 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1122 | 1123 | isstream@~0.1.2: 1124 | version "0.1.2" 1125 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1126 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 1127 | 1128 | jsbn@~0.1.0: 1129 | version "0.1.1" 1130 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1131 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 1132 | 1133 | json-schema-traverse@^0.4.1: 1134 | version "0.4.1" 1135 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1136 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1137 | 1138 | json-schema@0.2.3: 1139 | version "0.2.3" 1140 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1141 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 1142 | 1143 | json-stable-stringify@~0.0.0: 1144 | version "0.0.1" 1145 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" 1146 | integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= 1147 | dependencies: 1148 | jsonify "~0.0.0" 1149 | 1150 | json-stringify-safe@~5.0.1: 1151 | version "5.0.1" 1152 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1153 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 1154 | 1155 | jsonify@~0.0.0: 1156 | version "0.0.0" 1157 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1158 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= 1159 | 1160 | jsonparse@^1.2.0: 1161 | version "1.3.1" 1162 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 1163 | integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= 1164 | 1165 | jsprim@^1.2.2: 1166 | version "1.4.1" 1167 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1168 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 1169 | dependencies: 1170 | assert-plus "1.0.0" 1171 | extsprintf "1.3.0" 1172 | json-schema "0.2.3" 1173 | verror "1.10.0" 1174 | 1175 | labeled-stream-splicer@^2.0.0: 1176 | version "2.0.2" 1177 | resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" 1178 | integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== 1179 | dependencies: 1180 | inherits "^2.0.1" 1181 | stream-splicer "^2.0.0" 1182 | 1183 | lodash.memoize@~3.0.3: 1184 | version "3.0.4" 1185 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" 1186 | integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= 1187 | 1188 | lodash@^4.17.10, lodash@^4.17.15: 1189 | version "4.17.19" 1190 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 1191 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 1192 | 1193 | lower-case@^1.1.1: 1194 | version "1.1.4" 1195 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" 1196 | integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= 1197 | 1198 | md5.js@^1.3.4: 1199 | version "1.3.5" 1200 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" 1201 | integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== 1202 | dependencies: 1203 | hash-base "^3.0.0" 1204 | inherits "^2.0.1" 1205 | safe-buffer "^5.1.2" 1206 | 1207 | miller-rabin@^4.0.0: 1208 | version "4.0.1" 1209 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 1210 | integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== 1211 | dependencies: 1212 | bn.js "^4.0.0" 1213 | brorand "^1.0.1" 1214 | 1215 | mime-db@1.44.0: 1216 | version "1.44.0" 1217 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1218 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1219 | 1220 | mime-types@^2.1.12, mime-types@~2.1.19: 1221 | version "2.1.27" 1222 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1223 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1224 | dependencies: 1225 | mime-db "1.44.0" 1226 | 1227 | mimic-response@^2.0.0: 1228 | version "2.1.0" 1229 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 1230 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 1231 | 1232 | minify@^5.1.0: 1233 | version "5.1.0" 1234 | resolved "https://registry.yarnpkg.com/minify/-/minify-5.1.0.tgz#ccfd406c8b37eecc32db49cb894f6e87d7cd4efd" 1235 | integrity sha512-qlvHtYYjhDpdp05jfxFEdZ7u37tqaltOuuH4TbqyEcjubpY5BBOesJa513wBwjOFI0GmrLVENLooGRX/j2IoDQ== 1236 | dependencies: 1237 | clean-css "^4.1.6" 1238 | css-b64-images "~0.2.5" 1239 | debug "^4.1.0" 1240 | html-minifier "^4.0.0" 1241 | terser "^4.0.0" 1242 | try-catch "^2.0.0" 1243 | try-to-catch "^2.0.0" 1244 | 1245 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1246 | version "1.0.1" 1247 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1248 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1249 | 1250 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: 1251 | version "1.0.1" 1252 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1253 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 1254 | 1255 | minimatch@^3.0.4: 1256 | version "3.0.4" 1257 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1258 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1259 | dependencies: 1260 | brace-expansion "^1.1.7" 1261 | 1262 | minimist@0.0.8: 1263 | version "0.0.8" 1264 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1265 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1266 | 1267 | minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@~1.2.0: 1268 | version "1.2.5" 1269 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1270 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1271 | 1272 | minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: 1273 | version "2.9.0" 1274 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 1275 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 1276 | dependencies: 1277 | safe-buffer "^5.1.2" 1278 | yallist "^3.0.0" 1279 | 1280 | minizlib@^1.2.1: 1281 | version "1.3.3" 1282 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 1283 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 1284 | dependencies: 1285 | minipass "^2.9.0" 1286 | 1287 | mkdirp-classic@^0.5.2: 1288 | version "0.5.3" 1289 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 1290 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 1291 | 1292 | mkdirp@^0.5.0: 1293 | version "0.5.1" 1294 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1295 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1296 | dependencies: 1297 | minimist "0.0.8" 1298 | 1299 | mkdirp@^0.5.1: 1300 | version "0.5.5" 1301 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1302 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1303 | dependencies: 1304 | minimist "^1.2.5" 1305 | 1306 | module-deps@^6.0.0: 1307 | version "6.2.2" 1308 | resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.2.tgz#d8a15c2265dfc119153c29bb47386987d0ee423b" 1309 | integrity sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w== 1310 | dependencies: 1311 | JSONStream "^1.0.3" 1312 | browser-resolve "^1.7.0" 1313 | cached-path-relative "^1.0.2" 1314 | concat-stream "~1.6.0" 1315 | defined "^1.0.0" 1316 | detective "^5.2.0" 1317 | duplexer2 "^0.1.2" 1318 | inherits "^2.0.1" 1319 | parents "^1.0.0" 1320 | readable-stream "^2.0.2" 1321 | resolve "^1.4.0" 1322 | stream-combiner2 "^1.1.1" 1323 | subarg "^1.0.0" 1324 | through2 "^2.0.0" 1325 | xtend "^4.0.0" 1326 | 1327 | ms@^2.1.1: 1328 | version "2.1.2" 1329 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1330 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1331 | 1332 | nan@^2.14.1: 1333 | version "2.14.1" 1334 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" 1335 | integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== 1336 | 1337 | napi-build-utils@^1.0.1: 1338 | version "1.0.2" 1339 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" 1340 | integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== 1341 | 1342 | no-case@^2.2.0: 1343 | version "2.3.2" 1344 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" 1345 | integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== 1346 | dependencies: 1347 | lower-case "^1.1.1" 1348 | 1349 | node-abi@^2.16.0, node-abi@^2.7.0: 1350 | version "2.18.0" 1351 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.18.0.tgz#1f5486cfd7d38bd4f5392fa44a4ad4d9a0dffbf4" 1352 | integrity sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw== 1353 | dependencies: 1354 | semver "^5.4.1" 1355 | 1356 | node-gyp@^6.1.0: 1357 | version "6.1.0" 1358 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" 1359 | integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== 1360 | dependencies: 1361 | env-paths "^2.2.0" 1362 | glob "^7.1.4" 1363 | graceful-fs "^4.2.2" 1364 | mkdirp "^0.5.1" 1365 | nopt "^4.0.1" 1366 | npmlog "^4.1.2" 1367 | request "^2.88.0" 1368 | rimraf "^2.6.3" 1369 | semver "^5.7.1" 1370 | tar "^4.4.12" 1371 | which "^1.3.1" 1372 | 1373 | noop-logger@^0.1.1: 1374 | version "0.1.1" 1375 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 1376 | integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= 1377 | 1378 | nopt@^4.0.1: 1379 | version "4.0.3" 1380 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" 1381 | integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== 1382 | dependencies: 1383 | abbrev "1" 1384 | osenv "^0.1.4" 1385 | 1386 | npmlog@^4.0.1, npmlog@^4.1.2: 1387 | version "4.1.2" 1388 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1389 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1390 | dependencies: 1391 | are-we-there-yet "~1.1.2" 1392 | console-control-strings "~1.1.0" 1393 | gauge "~2.7.3" 1394 | set-blocking "~2.0.0" 1395 | 1396 | number-is-nan@^1.0.0: 1397 | version "1.0.1" 1398 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1399 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1400 | 1401 | oauth-sign@~0.9.0: 1402 | version "0.9.0" 1403 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1404 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1405 | 1406 | object-assign@^4.1.0, object-assign@^4.1.1: 1407 | version "4.1.1" 1408 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1409 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1410 | 1411 | object-inspect@^1.7.0, object-inspect@~1.7.0: 1412 | version "1.7.0" 1413 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1414 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 1415 | 1416 | object-is@^1.0.1: 1417 | version "1.0.2" 1418 | resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" 1419 | integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== 1420 | 1421 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1422 | version "1.1.1" 1423 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1424 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1425 | 1426 | object.assign@^4.1.0: 1427 | version "4.1.0" 1428 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1429 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1430 | dependencies: 1431 | define-properties "^1.1.2" 1432 | function-bind "^1.1.1" 1433 | has-symbols "^1.0.0" 1434 | object-keys "^1.0.11" 1435 | 1436 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1437 | version "1.4.0" 1438 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1439 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1440 | dependencies: 1441 | wrappy "1" 1442 | 1443 | os-browserify@~0.3.0: 1444 | version "0.3.0" 1445 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 1446 | integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= 1447 | 1448 | os-homedir@^1.0.0: 1449 | version "1.0.2" 1450 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1451 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1452 | 1453 | os-tmpdir@^1.0.0: 1454 | version "1.0.2" 1455 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1456 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1457 | 1458 | osenv@^0.1.4: 1459 | version "0.1.5" 1460 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1461 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1462 | dependencies: 1463 | os-homedir "^1.0.0" 1464 | os-tmpdir "^1.0.0" 1465 | 1466 | pako@~1.0.5: 1467 | version "1.0.11" 1468 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1469 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1470 | 1471 | param-case@^2.1.1: 1472 | version "2.1.1" 1473 | resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" 1474 | integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= 1475 | dependencies: 1476 | no-case "^2.2.0" 1477 | 1478 | parents@^1.0.0, parents@^1.0.1: 1479 | version "1.0.1" 1480 | resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" 1481 | integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= 1482 | dependencies: 1483 | path-platform "~0.11.15" 1484 | 1485 | parse-asn1@^5.0.0: 1486 | version "5.1.5" 1487 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" 1488 | integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== 1489 | dependencies: 1490 | asn1.js "^4.0.0" 1491 | browserify-aes "^1.0.0" 1492 | create-hash "^1.1.0" 1493 | evp_bytestokey "^1.0.0" 1494 | pbkdf2 "^3.0.3" 1495 | safe-buffer "^5.1.1" 1496 | 1497 | parse-ms@^1.0.0: 1498 | version "1.0.1" 1499 | resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" 1500 | integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= 1501 | 1502 | path-browserify@~0.0.0: 1503 | version "0.0.1" 1504 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" 1505 | integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== 1506 | 1507 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 1508 | version "1.0.1" 1509 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1510 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1511 | 1512 | path-parse@^1.0.6: 1513 | version "1.0.6" 1514 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1515 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1516 | 1517 | path-platform@~0.11.15: 1518 | version "0.11.15" 1519 | resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" 1520 | integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= 1521 | 1522 | pbkdf2@^3.0.3: 1523 | version "3.0.17" 1524 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" 1525 | integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== 1526 | dependencies: 1527 | create-hash "^1.1.2" 1528 | create-hmac "^1.1.4" 1529 | ripemd160 "^2.0.1" 1530 | safe-buffer "^5.0.1" 1531 | sha.js "^2.4.8" 1532 | 1533 | performance-now@^2.1.0: 1534 | version "2.1.0" 1535 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1536 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1537 | 1538 | plur@^1.0.0: 1539 | version "1.0.0" 1540 | resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" 1541 | integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= 1542 | 1543 | prebuild-install@^5.1.0: 1544 | version "5.3.5" 1545 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.5.tgz#e7e71e425298785ea9d22d4f958dbaccf8bb0e1b" 1546 | integrity sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw== 1547 | dependencies: 1548 | detect-libc "^1.0.3" 1549 | expand-template "^2.0.3" 1550 | github-from-package "0.0.0" 1551 | minimist "^1.2.3" 1552 | mkdirp "^0.5.1" 1553 | napi-build-utils "^1.0.1" 1554 | node-abi "^2.7.0" 1555 | noop-logger "^0.1.1" 1556 | npmlog "^4.0.1" 1557 | pump "^3.0.0" 1558 | rc "^1.2.7" 1559 | simple-get "^3.0.3" 1560 | tar-fs "^2.0.0" 1561 | tunnel-agent "^0.6.0" 1562 | which-pm-runs "^1.0.0" 1563 | 1564 | pretty-ms@^2.1.0: 1565 | version "2.1.0" 1566 | resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" 1567 | integrity sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw= 1568 | dependencies: 1569 | is-finite "^1.0.1" 1570 | parse-ms "^1.0.0" 1571 | plur "^1.0.0" 1572 | 1573 | process-nextick-args@~1.0.6: 1574 | version "1.0.7" 1575 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1576 | integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= 1577 | 1578 | process-nextick-args@~2.0.0: 1579 | version "2.0.1" 1580 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1581 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1582 | 1583 | process@~0.11.0: 1584 | version "0.11.10" 1585 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1586 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 1587 | 1588 | psl@^1.1.28: 1589 | version "1.8.0" 1590 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 1591 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 1592 | 1593 | public-encrypt@^4.0.0: 1594 | version "4.0.3" 1595 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" 1596 | integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== 1597 | dependencies: 1598 | bn.js "^4.1.0" 1599 | browserify-rsa "^4.0.0" 1600 | create-hash "^1.1.0" 1601 | parse-asn1 "^5.0.0" 1602 | randombytes "^2.0.1" 1603 | safe-buffer "^5.1.2" 1604 | 1605 | pump@^3.0.0: 1606 | version "3.0.0" 1607 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1608 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1609 | dependencies: 1610 | end-of-stream "^1.1.0" 1611 | once "^1.3.1" 1612 | 1613 | punycode@1.3.2: 1614 | version "1.3.2" 1615 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1616 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 1617 | 1618 | punycode@^1.3.2: 1619 | version "1.4.1" 1620 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1621 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1622 | 1623 | punycode@^2.1.0, punycode@^2.1.1: 1624 | version "2.1.1" 1625 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1626 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1627 | 1628 | qs@~6.5.2: 1629 | version "6.5.2" 1630 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1631 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1632 | 1633 | querystring-es3@~0.2.0: 1634 | version "0.2.1" 1635 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 1636 | integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= 1637 | 1638 | querystring@0.2.0: 1639 | version "0.2.0" 1640 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1641 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 1642 | 1643 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 1644 | version "2.1.0" 1645 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1646 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1647 | dependencies: 1648 | safe-buffer "^5.1.0" 1649 | 1650 | randomfill@^1.0.3: 1651 | version "1.0.4" 1652 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" 1653 | integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== 1654 | dependencies: 1655 | randombytes "^2.0.5" 1656 | safe-buffer "^5.1.0" 1657 | 1658 | rc@^1.2.7: 1659 | version "1.2.8" 1660 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1661 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1662 | dependencies: 1663 | deep-extend "^0.6.0" 1664 | ini "~1.3.0" 1665 | minimist "^1.2.0" 1666 | strip-json-comments "~2.0.1" 1667 | 1668 | re-emitter@1.1.3: 1669 | version "1.1.3" 1670 | resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" 1671 | integrity sha1-+p4xn/3u6zWycpbvDz03TawvUqc= 1672 | 1673 | read-only-stream@^2.0.0: 1674 | version "2.0.0" 1675 | resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" 1676 | integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= 1677 | dependencies: 1678 | readable-stream "^2.0.2" 1679 | 1680 | readable-stream@2.2.9: 1681 | version "2.2.9" 1682 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" 1683 | integrity sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g= 1684 | dependencies: 1685 | buffer-shims "~1.0.0" 1686 | core-util-is "~1.0.0" 1687 | inherits "~2.0.1" 1688 | isarray "~1.0.0" 1689 | process-nextick-args "~1.0.6" 1690 | string_decoder "~1.0.0" 1691 | util-deprecate "~1.0.1" 1692 | 1693 | "readable-stream@>=1.0.33-1 <1.1.0-0": 1694 | version "1.0.34" 1695 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 1696 | integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= 1697 | dependencies: 1698 | core-util-is "~1.0.0" 1699 | inherits "~2.0.1" 1700 | isarray "0.0.1" 1701 | string_decoder "~0.10.x" 1702 | 1703 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: 1704 | version "2.3.7" 1705 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1706 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1707 | dependencies: 1708 | core-util-is "~1.0.0" 1709 | inherits "~2.0.3" 1710 | isarray "~1.0.0" 1711 | process-nextick-args "~2.0.0" 1712 | safe-buffer "~5.1.1" 1713 | string_decoder "~1.1.1" 1714 | util-deprecate "~1.0.1" 1715 | 1716 | readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: 1717 | version "3.6.0" 1718 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1719 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1720 | dependencies: 1721 | inherits "^2.0.3" 1722 | string_decoder "^1.1.1" 1723 | util-deprecate "^1.0.1" 1724 | 1725 | readline-sync@^1.4.10: 1726 | version "1.4.10" 1727 | resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" 1728 | integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== 1729 | 1730 | regexp.prototype.flags@^1.2.0: 1731 | version "1.3.0" 1732 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" 1733 | integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== 1734 | dependencies: 1735 | define-properties "^1.1.3" 1736 | es-abstract "^1.17.0-next.1" 1737 | 1738 | relateurl@^0.2.7: 1739 | version "0.2.7" 1740 | resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" 1741 | integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= 1742 | 1743 | repeat-string@^1.5.2: 1744 | version "1.6.1" 1745 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1746 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1747 | 1748 | request@^2.88.0: 1749 | version "2.88.2" 1750 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 1751 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 1752 | dependencies: 1753 | aws-sign2 "~0.7.0" 1754 | aws4 "^1.8.0" 1755 | caseless "~0.12.0" 1756 | combined-stream "~1.0.6" 1757 | extend "~3.0.2" 1758 | forever-agent "~0.6.1" 1759 | form-data "~2.3.2" 1760 | har-validator "~5.1.3" 1761 | http-signature "~1.2.0" 1762 | is-typedarray "~1.0.0" 1763 | isstream "~0.1.2" 1764 | json-stringify-safe "~5.0.1" 1765 | mime-types "~2.1.19" 1766 | oauth-sign "~0.9.0" 1767 | performance-now "^2.1.0" 1768 | qs "~6.5.2" 1769 | safe-buffer "^5.1.2" 1770 | tough-cookie "~2.5.0" 1771 | tunnel-agent "^0.6.0" 1772 | uuid "^3.3.2" 1773 | 1774 | resolve@1.1.7: 1775 | version "1.1.7" 1776 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1777 | integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= 1778 | 1779 | resolve@^1.1.4, resolve@^1.4.0, resolve@~1.15.1: 1780 | version "1.15.1" 1781 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" 1782 | integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== 1783 | dependencies: 1784 | path-parse "^1.0.6" 1785 | 1786 | resumer@~0.0.0: 1787 | version "0.0.0" 1788 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" 1789 | integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= 1790 | dependencies: 1791 | through "~2.3.4" 1792 | 1793 | rimraf@^2.6.3: 1794 | version "2.7.1" 1795 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1796 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1797 | dependencies: 1798 | glob "^7.1.3" 1799 | 1800 | ripemd160@^2.0.0, ripemd160@^2.0.1: 1801 | version "2.0.2" 1802 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 1803 | integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== 1804 | dependencies: 1805 | hash-base "^3.0.0" 1806 | inherits "^2.0.1" 1807 | 1808 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2: 1809 | version "5.2.0" 1810 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1811 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1812 | 1813 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1814 | version "5.1.2" 1815 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1816 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1817 | 1818 | safe-buffer@~5.2.0: 1819 | version "5.2.1" 1820 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1821 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1822 | 1823 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1824 | version "2.1.2" 1825 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1826 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1827 | 1828 | semver@^5.4.1, semver@^5.7.1: 1829 | version "5.7.1" 1830 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1831 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1832 | 1833 | set-blocking@~2.0.0: 1834 | version "2.0.0" 1835 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1836 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1837 | 1838 | sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: 1839 | version "2.4.11" 1840 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1841 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1842 | dependencies: 1843 | inherits "^2.0.1" 1844 | safe-buffer "^5.0.1" 1845 | 1846 | shasum-object@^1.0.0: 1847 | version "1.0.0" 1848 | resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" 1849 | integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== 1850 | dependencies: 1851 | fast-safe-stringify "^2.0.7" 1852 | 1853 | shasum@^1.0.0: 1854 | version "1.0.2" 1855 | resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" 1856 | integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= 1857 | dependencies: 1858 | json-stable-stringify "~0.0.0" 1859 | sha.js "~2.4.4" 1860 | 1861 | shell-quote@^1.6.1: 1862 | version "1.7.2" 1863 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" 1864 | integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== 1865 | 1866 | signal-exit@^3.0.0: 1867 | version "3.0.3" 1868 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1869 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1870 | 1871 | simple-concat@^1.0.0: 1872 | version "1.0.0" 1873 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 1874 | integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= 1875 | 1876 | simple-get@^3.0.3: 1877 | version "3.1.0" 1878 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" 1879 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== 1880 | dependencies: 1881 | decompress-response "^4.2.0" 1882 | once "^1.3.1" 1883 | simple-concat "^1.0.0" 1884 | 1885 | source-map-support@~0.5.12: 1886 | version "0.5.16" 1887 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" 1888 | integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== 1889 | dependencies: 1890 | buffer-from "^1.0.0" 1891 | source-map "^0.6.0" 1892 | 1893 | source-map@^0.6.0, source-map@~0.6.0, source-map@~0.6.1: 1894 | version "0.6.1" 1895 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1896 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1897 | 1898 | source-map@~0.5.3: 1899 | version "0.5.7" 1900 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1901 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1902 | 1903 | split@1.0.0: 1904 | version "1.0.0" 1905 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 1906 | integrity sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64= 1907 | dependencies: 1908 | through "2" 1909 | 1910 | sshpk@^1.7.0: 1911 | version "1.16.1" 1912 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 1913 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 1914 | dependencies: 1915 | asn1 "~0.2.3" 1916 | assert-plus "^1.0.0" 1917 | bcrypt-pbkdf "^1.0.0" 1918 | dashdash "^1.12.0" 1919 | ecc-jsbn "~0.1.1" 1920 | getpass "^0.1.1" 1921 | jsbn "~0.1.0" 1922 | safer-buffer "^2.0.2" 1923 | tweetnacl "~0.14.0" 1924 | 1925 | stream-browserify@^2.0.0: 1926 | version "2.0.2" 1927 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" 1928 | integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== 1929 | dependencies: 1930 | inherits "~2.0.1" 1931 | readable-stream "^2.0.2" 1932 | 1933 | stream-combiner2@^1.1.1: 1934 | version "1.1.1" 1935 | resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" 1936 | integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= 1937 | dependencies: 1938 | duplexer2 "~0.1.0" 1939 | readable-stream "^2.0.2" 1940 | 1941 | stream-http@^3.0.0: 1942 | version "3.1.0" 1943 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" 1944 | integrity sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw== 1945 | dependencies: 1946 | builtin-status-codes "^3.0.0" 1947 | inherits "^2.0.1" 1948 | readable-stream "^3.0.6" 1949 | xtend "^4.0.0" 1950 | 1951 | stream-splicer@^2.0.0: 1952 | version "2.0.1" 1953 | resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" 1954 | integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== 1955 | dependencies: 1956 | inherits "^2.0.1" 1957 | readable-stream "^2.0.2" 1958 | 1959 | string-width@^1.0.1: 1960 | version "1.0.2" 1961 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1962 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1963 | dependencies: 1964 | code-point-at "^1.0.0" 1965 | is-fullwidth-code-point "^1.0.0" 1966 | strip-ansi "^3.0.0" 1967 | 1968 | "string-width@^1.0.2 || 2": 1969 | version "2.1.1" 1970 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1971 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1972 | dependencies: 1973 | is-fullwidth-code-point "^2.0.0" 1974 | strip-ansi "^4.0.0" 1975 | 1976 | string.prototype.trim@~1.2.1: 1977 | version "1.2.1" 1978 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" 1979 | integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== 1980 | dependencies: 1981 | define-properties "^1.1.3" 1982 | es-abstract "^1.17.0-next.1" 1983 | function-bind "^1.1.1" 1984 | 1985 | string.prototype.trimleft@^2.1.1: 1986 | version "2.1.1" 1987 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" 1988 | integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== 1989 | dependencies: 1990 | define-properties "^1.1.3" 1991 | function-bind "^1.1.1" 1992 | 1993 | string.prototype.trimright@^2.1.1: 1994 | version "2.1.1" 1995 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" 1996 | integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== 1997 | dependencies: 1998 | define-properties "^1.1.3" 1999 | function-bind "^1.1.1" 2000 | 2001 | string_decoder@^1.1.1: 2002 | version "1.3.0" 2003 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2004 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2005 | dependencies: 2006 | safe-buffer "~5.2.0" 2007 | 2008 | string_decoder@~0.10.x: 2009 | version "0.10.31" 2010 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2011 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 2012 | 2013 | string_decoder@~1.0.0: 2014 | version "1.0.3" 2015 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2016 | integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== 2017 | dependencies: 2018 | safe-buffer "~5.1.0" 2019 | 2020 | string_decoder@~1.1.1: 2021 | version "1.1.1" 2022 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2023 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2024 | dependencies: 2025 | safe-buffer "~5.1.0" 2026 | 2027 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2028 | version "3.0.1" 2029 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2030 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2031 | dependencies: 2032 | ansi-regex "^2.0.0" 2033 | 2034 | strip-ansi@^4.0.0: 2035 | version "4.0.0" 2036 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2037 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2038 | dependencies: 2039 | ansi-regex "^3.0.0" 2040 | 2041 | strip-json-comments@~2.0.1: 2042 | version "2.0.1" 2043 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2044 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2045 | 2046 | subarg@^1.0.0: 2047 | version "1.0.0" 2048 | resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" 2049 | integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= 2050 | dependencies: 2051 | minimist "^1.1.0" 2052 | 2053 | supports-color@^2.0.0: 2054 | version "2.0.0" 2055 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2056 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 2057 | 2058 | syntax-error@^1.1.1: 2059 | version "1.4.0" 2060 | resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" 2061 | integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== 2062 | dependencies: 2063 | acorn-node "^1.2.0" 2064 | 2065 | tap-out@^2.1.0: 2066 | version "2.1.0" 2067 | resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-2.1.0.tgz#c093079a915036de8b835bfa3297f14458b15358" 2068 | integrity sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw== 2069 | dependencies: 2070 | re-emitter "1.1.3" 2071 | readable-stream "2.2.9" 2072 | split "1.0.0" 2073 | trim "0.0.1" 2074 | 2075 | tap-spec@^5.0.0: 2076 | version "5.0.0" 2077 | resolved "https://registry.yarnpkg.com/tap-spec/-/tap-spec-5.0.0.tgz#7329e4e66e8aa68da2a164215abbb903a7c5d352" 2078 | integrity sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw== 2079 | dependencies: 2080 | chalk "^1.0.0" 2081 | duplexer "^0.1.1" 2082 | figures "^1.4.0" 2083 | lodash "^4.17.10" 2084 | pretty-ms "^2.1.0" 2085 | repeat-string "^1.5.2" 2086 | tap-out "^2.1.0" 2087 | through2 "^2.0.0" 2088 | 2089 | tape@^4.10.1: 2090 | version "4.13.2" 2091 | resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.2.tgz#eb419b9d9bc004025b1a81a5b63093e07f425629" 2092 | integrity sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ== 2093 | dependencies: 2094 | deep-equal "~1.1.1" 2095 | defined "~1.0.0" 2096 | dotignore "~0.1.2" 2097 | for-each "~0.3.3" 2098 | function-bind "~1.1.1" 2099 | glob "~7.1.6" 2100 | has "~1.0.3" 2101 | inherits "~2.0.4" 2102 | is-regex "~1.0.5" 2103 | minimist "~1.2.0" 2104 | object-inspect "~1.7.0" 2105 | resolve "~1.15.1" 2106 | resumer "~0.0.0" 2107 | string.prototype.trim "~1.2.1" 2108 | through "~2.3.8" 2109 | 2110 | tar-fs@^2.0.0: 2111 | version "2.1.0" 2112 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" 2113 | integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== 2114 | dependencies: 2115 | chownr "^1.1.1" 2116 | mkdirp-classic "^0.5.2" 2117 | pump "^3.0.0" 2118 | tar-stream "^2.0.0" 2119 | 2120 | tar-stream@^2.0.0: 2121 | version "2.1.3" 2122 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.3.tgz#1e2022559221b7866161660f118255e20fa79e41" 2123 | integrity sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA== 2124 | dependencies: 2125 | bl "^4.0.1" 2126 | end-of-stream "^1.4.1" 2127 | fs-constants "^1.0.0" 2128 | inherits "^2.0.3" 2129 | readable-stream "^3.1.1" 2130 | 2131 | tar@^4.4.12: 2132 | version "4.4.13" 2133 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" 2134 | integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== 2135 | dependencies: 2136 | chownr "^1.1.1" 2137 | fs-minipass "^1.2.5" 2138 | minipass "^2.8.6" 2139 | minizlib "^1.2.1" 2140 | mkdirp "^0.5.0" 2141 | safe-buffer "^5.1.2" 2142 | yallist "^3.0.3" 2143 | 2144 | terser@^4.0.0: 2145 | version "4.6.6" 2146 | resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" 2147 | integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== 2148 | dependencies: 2149 | commander "^2.20.0" 2150 | source-map "~0.6.1" 2151 | source-map-support "~0.5.12" 2152 | 2153 | through2@^0.6.3: 2154 | version "0.6.5" 2155 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 2156 | integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= 2157 | dependencies: 2158 | readable-stream ">=1.0.33-1 <1.1.0-0" 2159 | xtend ">=4.0.0 <4.1.0-0" 2160 | 2161 | through2@^2.0.0: 2162 | version "2.0.5" 2163 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 2164 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 2165 | dependencies: 2166 | readable-stream "~2.3.6" 2167 | xtend "~4.0.1" 2168 | 2169 | through@2, "through@>=2.2.7 <3", through@~2.3.4, through@~2.3.8: 2170 | version "2.3.8" 2171 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2172 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 2173 | 2174 | timers-browserify@^1.0.1: 2175 | version "1.4.2" 2176 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" 2177 | integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= 2178 | dependencies: 2179 | process "~0.11.0" 2180 | 2181 | tough-cookie@~2.5.0: 2182 | version "2.5.0" 2183 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 2184 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 2185 | dependencies: 2186 | psl "^1.1.28" 2187 | punycode "^2.1.1" 2188 | 2189 | trim@0.0.1: 2190 | version "0.0.1" 2191 | resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" 2192 | integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= 2193 | 2194 | try-catch@^2.0.0: 2195 | version "2.0.1" 2196 | resolved "https://registry.yarnpkg.com/try-catch/-/try-catch-2.0.1.tgz#a35d354187c422f291a0bcfd9eb77e3a4f90c1e5" 2197 | integrity sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg== 2198 | 2199 | try-to-catch@^2.0.0: 2200 | version "2.0.1" 2201 | resolved "https://registry.yarnpkg.com/try-to-catch/-/try-to-catch-2.0.1.tgz#4a943ba6f2921bd3ba945ea5d4459119ec3ec079" 2202 | integrity sha512-QYH/PR3ogChy82e2l1UgrEgutcf6Jtfu3TAQWC+Vs6MKpoaFs1atDHUPzfaERugZlESb2Xku7J2my6iUQ7+tcQ== 2203 | 2204 | tty-browserify@0.0.1: 2205 | version "0.0.1" 2206 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" 2207 | integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== 2208 | 2209 | tunnel-agent@^0.6.0: 2210 | version "0.6.0" 2211 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2212 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2213 | dependencies: 2214 | safe-buffer "^5.0.1" 2215 | 2216 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2217 | version "0.14.5" 2218 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2219 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2220 | 2221 | typedarray@^0.0.6: 2222 | version "0.0.6" 2223 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2224 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2225 | 2226 | uglify-js@^3.5.1: 2227 | version "3.8.0" 2228 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805" 2229 | integrity sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ== 2230 | dependencies: 2231 | commander "~2.20.3" 2232 | source-map "~0.6.1" 2233 | 2234 | umd@^3.0.0: 2235 | version "3.0.3" 2236 | resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" 2237 | integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== 2238 | 2239 | undeclared-identifiers@^1.1.2: 2240 | version "1.1.3" 2241 | resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" 2242 | integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== 2243 | dependencies: 2244 | acorn-node "^1.3.0" 2245 | dash-ast "^1.0.0" 2246 | get-assigned-identifiers "^1.2.0" 2247 | simple-concat "^1.0.0" 2248 | xtend "^4.0.1" 2249 | 2250 | upper-case@^1.1.1: 2251 | version "1.1.3" 2252 | resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" 2253 | integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= 2254 | 2255 | uri-js@^4.2.2: 2256 | version "4.2.2" 2257 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 2258 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 2259 | dependencies: 2260 | punycode "^2.1.0" 2261 | 2262 | url@~0.11.0: 2263 | version "0.11.0" 2264 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 2265 | integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= 2266 | dependencies: 2267 | punycode "1.3.2" 2268 | querystring "0.2.0" 2269 | 2270 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2271 | version "1.0.2" 2272 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2273 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2274 | 2275 | util@0.10.3: 2276 | version "0.10.3" 2277 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 2278 | integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= 2279 | dependencies: 2280 | inherits "2.0.1" 2281 | 2282 | util@~0.10.1: 2283 | version "0.10.4" 2284 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 2285 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 2286 | dependencies: 2287 | inherits "2.0.3" 2288 | 2289 | uuid@^3.3.2: 2290 | version "3.4.0" 2291 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 2292 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 2293 | 2294 | verror@1.10.0: 2295 | version "1.10.0" 2296 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2297 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 2298 | dependencies: 2299 | assert-plus "^1.0.0" 2300 | core-util-is "1.0.2" 2301 | extsprintf "^1.2.0" 2302 | 2303 | vm-browserify@^1.0.0: 2304 | version "1.1.2" 2305 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" 2306 | integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== 2307 | 2308 | which-pm-runs@^1.0.0: 2309 | version "1.0.0" 2310 | resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" 2311 | integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= 2312 | 2313 | which@^1.3.1: 2314 | version "1.3.1" 2315 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2316 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2317 | dependencies: 2318 | isexe "^2.0.0" 2319 | 2320 | wide-align@^1.1.0: 2321 | version "1.1.3" 2322 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2323 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2324 | dependencies: 2325 | string-width "^1.0.2 || 2" 2326 | 2327 | wrappy@1: 2328 | version "1.0.2" 2329 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2330 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2331 | 2332 | "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: 2333 | version "4.0.2" 2334 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2335 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2336 | 2337 | yallist@^3.0.0, yallist@^3.0.3: 2338 | version "3.1.1" 2339 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2340 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2341 | --------------------------------------------------------------------------------