From 9a8a767656f7156b2f5efc9843b2f2153b93754f Mon Sep 17 00:00:00 2001 From: 51hhh Date: Thu, 14 Aug 2025 11:02:56 +0800 Subject: [PATCH] =?UTF-8?q?[MF]=E4=BF=AE=E6=94=B9=E5=A7=BF=E6=80=81?= =?UTF-8?q?=E5=92=8C=E9=9F=B3=E9=A2=91=E5=AE=9E=E7=8E=B0[DOC]=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=A7=BF=E6=80=81=E6=96=87=E6=A1=A3[CF]=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E9=9F=B3=E9=A2=91=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 姿态分类/README.md | 9 + 姿态分类/script.js | 1 - 音频分类/README.md | 50 + 音频分类/speech-commands/.gitignore | 18 + 音频分类/speech-commands/.npmignore | 16 + .../speech-commands/.vscode/settings.json | 26 + 音频分类/speech-commands/README.md | 319 + 音频分类/speech-commands/cloudbuild.yml | 48 + 音频分类/speech-commands/demo/.babelrc | 18 + 音频分类/speech-commands/demo/dataset-vis.js | 321 + 音频分类/speech-commands/demo/index.html | 98 + 音频分类/speech-commands/demo/index.js | 713 ++ 音频分类/speech-commands/demo/package.json | 60 + 音频分类/speech-commands/demo/style.css | 183 + 音频分类/speech-commands/demo/ui.js | 216 + 音频分类/speech-commands/demo/yarn.lock | 6437 +++++++++++++++++ 音频分类/speech-commands/package.json | 56 + 音频分类/speech-commands/rollup.config.js | 77 + 音频分类/speech-commands/run_tests.ts | 21 + .../speech-commands/src/browser_fft_extractor.ts | 331 + .../src/browser_fft_extractor_test.ts | 327 + .../speech-commands/src/browser_fft_recognizer.ts | 1431 ++++ .../src/browser_fft_recognizer_test.ts | 1666 +++++ .../speech-commands/src/browser_fft_utils.ts | 131 + .../speech-commands/src/browser_fft_utils_test.ts | 56 + .../speech-commands/src/browser_test_utils.ts | 77 + 音频分类/speech-commands/src/dataset.ts | 977 +++ 音频分类/speech-commands/src/dataset_test.ts | 1325 ++++ 音频分类/speech-commands/src/generic_utils.ts | 92 + .../speech-commands/src/generic_utils_test.ts | 81 + 音频分类/speech-commands/src/index.ts | 91 + 音频分类/speech-commands/src/index_test.ts | 69 + 音频分类/speech-commands/src/test_utils.ts | 46 + .../speech-commands/src/training_utils.ts | 164 + .../speech-commands/src/training_utils_test.ts | 60 + 音频分类/speech-commands/src/types.ts | 754 ++ 音频分类/speech-commands/src/version.ts | 5 + 音频分类/speech-commands/src/version_test.ts | 26 + .../training/browser-fft/README.md | 22 + .../training/browser-fft/tflite_conversion.ipynb | 349 + .../training_custom_audio_model_in_python.ipynb | 860 +++ .../speech-commands/training/soft-fft/README.md | 125 + .../training/soft-fft/audio_model.ts | 229 + .../speech-commands/training/soft-fft/cli.ts | 139 + .../speech-commands/training/soft-fft/dataset.ts | 54 + .../training/soft-fft/package.json | 38 + .../training/soft-fft/tsconfig.json | 26 + .../training/soft-fft/types/node-wav.d.ts | 17 + .../training/soft-fft/types/vorpal.d.ts | 18 + .../training/soft-fft/utils/audio_utils.ts | 259 + .../soft-fft/utils/circular_audio_buffer.ts | 108 + .../training/soft-fft/utils/dataset.ts | 60 + .../training/soft-fft/utils/types.ts | 53 + .../training/soft-fft/utils/types/dct.d.ts | 17 + .../training/soft-fft/utils/types/kissfft-js.d.ts | 17 + .../soft-fft/wav_file_feature_extractor.ts | 95 + .../speech-commands/training/soft-fft/yarn.lock | 2690 +++++++ 音频分类/speech-commands/tsconfig.json | 13 + 音频分类/speech-commands/tsconfig.test.json | 14 + 音频分类/speech-commands/tslint.json | 3 + 音频分类/speech-commands/yarn.lock | 1572 ++++ 音频分类/voice.html | 7 +- 62 files changed, 23177 insertions(+), 4 deletions(-) create mode 100644 音频分类/README.md create mode 100644 音频分类/speech-commands/.gitignore create mode 100644 音频分类/speech-commands/.npmignore create mode 100644 音频分类/speech-commands/.vscode/settings.json create mode 100644 音频分类/speech-commands/README.md create mode 100644 音频分类/speech-commands/cloudbuild.yml create mode 100644 音频分类/speech-commands/demo/.babelrc create mode 100644 音频分类/speech-commands/demo/dataset-vis.js create mode 100644 音频分类/speech-commands/demo/index.html create mode 100644 音频分类/speech-commands/demo/index.js create mode 100644 音频分类/speech-commands/demo/package.json create mode 100644 音频分类/speech-commands/demo/style.css create mode 100644 音频分类/speech-commands/demo/ui.js create mode 100644 音频分类/speech-commands/demo/yarn.lock create mode 100644 音频分类/speech-commands/package.json create mode 100644 音频分类/speech-commands/rollup.config.js create mode 100644 音频分类/speech-commands/run_tests.ts create mode 100644 音频分类/speech-commands/src/browser_fft_extractor.ts create mode 100644 音频分类/speech-commands/src/browser_fft_extractor_test.ts create mode 100644 音频分类/speech-commands/src/browser_fft_recognizer.ts create mode 100644 音频分类/speech-commands/src/browser_fft_recognizer_test.ts create mode 100644 音频分类/speech-commands/src/browser_fft_utils.ts create mode 100644 音频分类/speech-commands/src/browser_fft_utils_test.ts create mode 100644 音频分类/speech-commands/src/browser_test_utils.ts create mode 100644 音频分类/speech-commands/src/dataset.ts create mode 100644 音频分类/speech-commands/src/dataset_test.ts create mode 100644 音频分类/speech-commands/src/generic_utils.ts create mode 100644 音频分类/speech-commands/src/generic_utils_test.ts create mode 100644 音频分类/speech-commands/src/index.ts create mode 100644 音频分类/speech-commands/src/index_test.ts create mode 100644 音频分类/speech-commands/src/test_utils.ts create mode 100644 音频分类/speech-commands/src/training_utils.ts create mode 100644 音频分类/speech-commands/src/training_utils_test.ts create mode 100644 音频分类/speech-commands/src/types.ts create mode 100644 音频分类/speech-commands/src/version.ts create mode 100644 音频分类/speech-commands/src/version_test.ts create mode 100644 音频分类/speech-commands/training/browser-fft/README.md create mode 100644 音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb create mode 100644 音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb create mode 100644 音频分类/speech-commands/training/soft-fft/README.md create mode 100644 音频分类/speech-commands/training/soft-fft/audio_model.ts create mode 100644 音频分类/speech-commands/training/soft-fft/cli.ts create mode 100644 音频分类/speech-commands/training/soft-fft/dataset.ts create mode 100644 音频分类/speech-commands/training/soft-fft/package.json create mode 100644 音频分类/speech-commands/training/soft-fft/tsconfig.json create mode 100644 音频分类/speech-commands/training/soft-fft/types/node-wav.d.ts create mode 100644 音频分类/speech-commands/training/soft-fft/types/vorpal.d.ts create mode 100644 音频分类/speech-commands/training/soft-fft/utils/audio_utils.ts create mode 100644 音频分类/speech-commands/training/soft-fft/utils/circular_audio_buffer.ts create mode 100644 音频分类/speech-commands/training/soft-fft/utils/dataset.ts create mode 100644 音频分类/speech-commands/training/soft-fft/utils/types.ts create mode 100644 音频分类/speech-commands/training/soft-fft/utils/types/dct.d.ts create mode 100644 音频分类/speech-commands/training/soft-fft/utils/types/kissfft-js.d.ts create mode 100644 音频分类/speech-commands/training/soft-fft/wav_file_feature_extractor.ts create mode 100644 音频分类/speech-commands/training/soft-fft/yarn.lock create mode 100644 音频分类/speech-commands/tsconfig.json create mode 100644 音频分类/speech-commands/tsconfig.test.json create mode 100644 音频分类/speech-commands/tslint.json create mode 100644 音频分类/speech-commands/yarn.lock diff --git a/姿态分类/README.md b/姿态分类/README.md index 094fcd5..673ab93 100644 --- a/姿态分类/README.md +++ b/姿态分类/README.md @@ -29,6 +29,15 @@ - 应用将开始实时分析你的姿态,并在下方显示预测结果。 - 再次点击“停止预测”可暂停。 + +建议使用live server插件开启本地服务器,并访问index.html文件。 + +## 存在问题 +css样式中描绘关节骨架与实际对比偏小,现在使用的方法是模型输出关节后与视频大小一起缩放。暂时不清楚是缩放导致还是模型输出。 + + + + ## 📁 项目结构 ``` diff --git a/姿态分类/script.js b/姿态分类/script.js index 56c1b0d..e5b942b 100644 --- a/姿态分类/script.js +++ b/姿态分类/script.js @@ -318,7 +318,6 @@ function flattenPose(pose) { } function drawPose(pose) { - // ... (此函数无需修改, 省略以保持简洁) // 绘制关键点和骨骼... if (pose.keypoints) { // 绘制关键点 diff --git a/音频分类/README.md b/音频分类/README.md new file mode 100644 index 0000000..3c9d69d --- /dev/null +++ b/音频分类/README.md @@ -0,0 +1,50 @@ +# 浏览器音频分类器 (背景噪音分离增强版) + +## 简介 + +这个项目是一个基于浏览器的音频分类器,它利用 TensorFlow.js 和 Speech Commands 模型,可以识别用户自定义的声音类别。**与传统音频分类器不同的是,此版本特别强调了背景噪音的分离和处理,从而提升分类准确率。** + +此应用允许用户: + +1. **录制背景噪音样本:** 用于训练模型,区分目标声音和环境噪音。 +2. **添加自定义声音类别:** 例如 "拍手"、"响指"、"警告音" 等。 +3. **录制自定义声音样本:** 用于训练模型,识别特定声音。 +4. **训练模型:** 使用录制的背景噪音和自定义声音数据,训练分类模型。 +5. **实时识别:** 使用训练好的模型,实时识别麦克风输入的声音类别。 + + +## 特性 + +* **背景噪音分离:** 通过录制和学习背景噪音,提高分类器在嘈杂环境中的准确性。 +* **自定义类别:** 用户可以根据自己的需求添加和训练任意声音类别。 +* **实时识别:** 模型训练完成后,可以立即进行实时声音识别。 +* **浏览器端运行:** 所有处理都在浏览器端完成,无需服务器支持。 +* **用户友好的界面:** 简单直观的界面,易于操作和使用。 + +## 技术栈 + +* **TensorFlow.js:** 用于在浏览器端运行机器学习模型。 +* **Speech Commands Model:** TensorFlow.js 提供的预训练语音命令模型,用于迁移学习。 + +## 快速上手 + +建议使用live server插件开启本地服务器,并访问voice.html文件。 + +**注:直接打开index.html文件会需要重复授权麦克风权限,请使用live server插件开启本地服务器可以解决** + + + + +## 音频切片 +TODO + +需要查看speech-commands接口实现传入`collectExample` + +.\speech-commands\src\browser_fft_recognizer.ts + 667,9: async collectExample(word: string, options?: ExampleCollectionOptions): + +现在实现的方法是调用`collectExample`方法,传入`word`参数,然后会自动录制音频文件,统一码率,生成频谱图,传入模型,并没有给出可以直接传入音频接口。 + +**如果需要实现一次性录制,需要实现手动将音频文件转换成频谱图,传入模型。** + +目录下speech-commands文件夹是导入的`https://cdn.jsdelivr.net/npm/@tensorflow-models/speech-commands@latest/dist/speech-commands.min.js`js文件仓库 \ No newline at end of file diff --git a/音频分类/speech-commands/.gitignore b/音频分类/speech-commands/.gitignore new file mode 100644 index 0000000..d5a9a8f --- /dev/null +++ b/音频分类/speech-commands/.gitignore @@ -0,0 +1,18 @@ +node_modules/ +coverage/ +package-lock.json +npm-debug.log +yarn-error.log +.DS_Store +dist/ +.idea/ +*.tgz +.cache + +bazel-* + +*.pyc + +model.json +metadata.json +weights.bin diff --git a/音频分类/speech-commands/.npmignore b/音频分类/speech-commands/.npmignore new file mode 100644 index 0000000..1297519 --- /dev/null +++ b/音频分类/speech-commands/.npmignore @@ -0,0 +1,16 @@ +.yalc/ +.vscode/ +.rpt2_cache/ +demo/ +scripts/ +src/ +training/ +coverage/ +node_modules/ +karma.conf.js +*.tgz +.travis.yml +.npmignore +tslint.json +yarn.lock +yalc.lock diff --git a/音频分类/speech-commands/.vscode/settings.json b/音频分类/speech-commands/.vscode/settings.json new file mode 100644 index 0000000..3e5e8f9 --- /dev/null +++ b/音频分类/speech-commands/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "search.exclude": { + "**/node_modules": true, + "coverage/": true, + "**/dist/": true, + "**/yarn.lock": true, + "**/.rpt2_cache/": true, + "**/.yalc/": true + }, + "tslint.enable": true, + "tslint.run": "onType", + "tslint.configFile": "tslint.json", + "files.trimTrailingWhitespace": true, + "editor.tabSize": 2, + "editor.insertSpaces": true, + "[typescript]": { + "editor.formatOnSave": true + }, + "editor.rulers": [80], + "clang-format.style": "Google", + "files.insertFinalNewline": true, + "editor.detectIndentation": false, + "editor.wrappingIndent": "none", + "typescript.tsdk": "./node_modules/typescript/lib", + "clang-format.executable": "${workspaceRoot}/node_modules/.bin/clang-format" +} diff --git a/音频分类/speech-commands/README.md b/音频分类/speech-commands/README.md new file mode 100644 index 0000000..fb44291 --- /dev/null +++ b/音频分类/speech-commands/README.md @@ -0,0 +1,319 @@ +# Speech Command Recognizer + +The Speech Command Recognizer is a JavaScript module that enables +recognition of spoken commands comprised of simple isolated English +words from a small vocabulary. The default vocabulary includes the following +words: the ten digits from "zero" to "nine", "up", "down", "left", "right", +"go", "stop", "yes", "no", as well as the additional categories of +"unknown word" and "background noise". + +It uses the web browser's +[WebAudio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API). +It is built on top of [TensorFlow.js](https://js.tensorflow.org) and can +perform inference and transfer learning entirely in the browser, using +WebGL GPU acceleration. + +The underlying deep neural network has been trained using the +[TensorFlow Speech Commands Dataset](https://www.tensorflow.org/datasets/catalog/speech_commands). + +For more details on the data set, see: + +Warden, P. (2018) "Speech commands: A dataset for limited-vocabulary +speech recognition" https://arxiv.org/pdf/1804.03209.pdf + +## API Usage + +A speech command recognizer can be used in two ways: + +1. **Online streaming recognition**, during which the library automatically + opens an audio input channel using the browser's + [`getUserMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia) + and + [WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) + APIs (requesting permission from user) and performs real-time recognition on + the audio input. +2. **Offline recognition**, in which you provide a pre-constructed TensorFlow.js + [Tensor](https://js.tensorflow.org/api/latest/#tensor) object or a + `Float32Array` and the recognizer will return the recognition results. + +### Online streaming recognition + +To use the speech-command recognizer, first create a recognizer instance, +then start the streaming recognition by calling its `listen()` method. + +```js +const tf = require('@tensorflow/tfjs'); +const speechCommands = require('@tensorflow-models/speech-commands'); + +// When calling `create()`, you must provide the type of the audio input. +// The two available options are `BROWSER_FFT` and `SOFT_FFT`. +// - BROWSER_FFT uses the browser's native Fourier transform. +// - SOFT_FFT uses JavaScript implementations of Fourier transform +// (not implemented yet). +const recognizer = speechCommands.create('BROWSER_FFT'); + +// Make sure that the underlying model and metadata are loaded via HTTPS +// requests. +await recognizer.ensureModelLoaded(); + +// See the array of words that the recognizer is trained to recognize. +console.log(recognizer.wordLabels()); + +// `listen()` takes two arguments: +// 1. A callback function that is invoked anytime a word is recognized. +// 2. A configuration object with adjustable fields such a +// - includeSpectrogram +// - probabilityThreshold +// - includeEmbedding +recognizer.listen(result => { + // - result.scores contains the probability scores that correspond to + // recognizer.wordLabels(). + // - result.spectrogram contains the spectrogram of the recognized word. +}, { + includeSpectrogram: true, + probabilityThreshold: 0.75 +}); + +// Stop the recognition in 10 seconds. +setTimeout(() => recognizer.stopListening(), 10e3); +``` + +#### Vocabularies + +When calling `speechCommands.create()`, you can specify the vocabulary +the loaded model will be able to recognize. This is specified as the second, +optional argument to `speechCommands.create()`. For example: + +```js +const recognizer = speechCommands.create('BROWSER_FFT', 'directional4w'); +``` + +Currently, the supported vocabularies are: + - '18w' (default): The 20 item vocaulbary, consisting of: + 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', + 'eight', 'nine', 'up', 'down', 'left', 'right', 'go', 'stop', + 'yes', and 'no', in addition to '_background_noise_' and '_unknown_'. + - 'directional4w': The four directional words: 'up', 'down', 'left', and + 'right', in addition to '_background_noise_' and '_unknown_'. + +'18w' is the default vocabulary. + +#### Parameters for online streaming recognition + +As the example above shows, you can specify optional parameters when calling +`listen()`. The supported parameters are: + +* `overlapFactor`: Controls how often the recognizer performs prediction on + spectrograms. Must be >=0 and <1 (default: 0.5). For example, + if each spectrogram is 1000 ms long and `overlapFactor` is set to 0.25, + the prediction will happen every 250 ms. +* `includeSpectrogram`: Let the callback function be invoked with the + spectrogram data included in the argument. Default: `false`. +* `probabilityThreshold`: The callback function will be invoked if and only if + the maximum probability score of all the words is greater than this threshold. + Default: `0`. +* `invokeCallbackOnNoiseAndUnknown`: Whether the callback function will be + invoked if the "word" with the maximum probability score is the "unknown" + or "background noise" token. Default: `false`. +* `includeEmbedding`: Whether an internal activation from the underlying model + will be included in the callback argument, in addition to the probability + scores. Note: if this field is set as `true`, the value of + `invokeCallbackOnNoiseAndUnknown` will be overridden to `true` and the + value of `probabilityThreshold` will be overridden to `0`. + +### Offline recognition + +To perform offline recognition, you need to have obtained the spectrogram +of an audio snippet through a certain means, e.g., by loading the data +from a .wav file or synthesizing the spectrogram programmatically. +Assuming you have the spectrogram stored in an Array of numbers or +a Float32Array, you can create a `tf.Tensor` object. Note that the +shape of the Tensor must match the expectation of the recognizer instance. +E.g., + +```js +const tf = require('@tensorflow/tfjs'); +const speechCommands = require('@tensorflow-models/speech-commands'); + +const recognizer = speechCommands.create('BROWSER_FFT'); + +// Inspect the input shape of the recognizer's underlying tf.Model. +console.log(recognizer.modelInputShape()); +// You will get something like [null, 43, 232, 1]. +// - The first dimension (null) is an undetermined batch dimension. +// - The second dimension (e.g., 43) is the number of audio frames. +// - The third dimension (e.g., 232) is the number of frequency data points in +// every frame (i.e., column) of the spectrogram +// - The last dimension (e.g., 1) is fixed at 1. This follows the convention of +// convolutional neural networks in TensorFlow.js and Keras. + +// Inspect the sampling frequency and FFT size: +console.log(recognizer.params().sampleRateHz); +console.log(recognizer.params().fftSize); + + +const x = tf.tensor4d( + mySpectrogramData, [1].concat(recognizer.modelInputShape().slice(1))); +const output = await recognizer.recognize(x); +// output has the same format as `result` in the online streaming example +// above: the `scores` field contains the probabilities of the words. + +tf.dispose([x, output]); +``` + +Note that you must provide a spectrogram value to the `recognize()` call +in order to perform the offline recognition. If `recognize()` is called +without a first argument, it will perform one-shot online recognition +by collecting a frame of audio via WebAudio. + +### Preloading model + +By default, a recognizer object will load the underlying +tf.Model via HTTP requests to a centralized location, when its +`listen()` or `recognize()` method is called the first time. +You can pre-load the model to reduce the latency of the first calls +to these methods. To do that, use the `ensureModelLoaded()` method of the +recognizer object. The `ensureModelLoaded()` method also "warms up" model after +the model is loaded. "Warm up" means running a few dummy examples through the +model for inference to make sure that the necessary states are set up, so that +subsequent inferences can be fast. + +### Transfer learning + +**Transfer learning** is the process of taking a model trained +previously on a dataset (say dataset A) and applying it on a +different dataset (say dataset B). +To achieve transfer learning, the model needs to be slightly modified and +re-trained on dataset B. However, thanks to the training on +the original dataset (A), the training on the new dataset (B) takes much less +time and computational resource, in addition to requiring a much smaller amount of +data than the original training data. The modification process involves removing the +top (output) dense layer of the original model and keeping the "base" of the +model. Due to its previous training, the base can be used as a good feature +extractor for any data similar to the original training data. +The removed dense layer is replaced with a new dense layer configured +specifically for the new dataset. + +The speech-command model is a model suitable for transfer learning on +previously unseen spoken words. The original model has been trained on a relatively +large dataset (~50k examples from 20 classes). It can be used for transfer learning on +words different from the original vocabulary. We provide an API to perform +this type of transfer learning. The steps are listed in the example +code snippet below + +```js +const baseRecognizer = speechCommands.create('BROWSER_FFT'); +await baseRecognizer.ensureModelLoaded(); + +// Each instance of speech-command recognizer supports multiple +// transfer-learning models, each of which can be trained for a different +// new vocabulary. +// Therefore we give a name to the transfer-learning model we are about to +// train ('colors' in this case). +const transferRecognizer = baseRecognizer.createTransfer('colors'); + +// Call `collectExample()` to collect a number of audio examples +// via WebAudio. +await transferRecognizer.collectExample('red'); +await transferRecognizer.collectExample('green'); +await transferRecognizer.collectExample('blue'); +await transferRecognizer.collectExample('red'); +// Don't forget to collect some background-noise examples, so that the +// transfer-learned model will be able to detect moments of silence. +await transferRecognizer.collectExample('_background_noise_'); +await transferRecognizer.collectExample('green'); +await transferRecognizer.collectExample('blue'); +await transferRecognizer.collectExample('_background_noise_'); +// ... You would typically want to put `collectExample` +// in the callback of a UI button to allow the user to collect +// any desired number of examples in random order. + +// You can check the counts of examples for different words that have been +// collect for this transfer-learning model. +console.log(transferRecognizer.countExamples()); +// e.g., {'red': 2, 'green': 2', 'blue': 2, '_background_noise': 2}; + +// Start training of the transfer-learning model. +// You can specify `epochs` (number of training epochs) and `callback` +// (the Model.fit callback to use during training), among other configuration +// fields. +await transferRecognizer.train({ + epochs: 25, + callback: { + onEpochEnd: async (epoch, logs) => { + console.log(`Epoch ${epoch}: loss=${logs.loss}, accuracy=${logs.acc}`); + } + } +}); + +// After the transfer learning completes, you can start online streaming +// recognition using the new model. +await transferRecognizer.listen(result => { + // - result.scores contains the scores for the new vocabulary, which + // can be checked with: + const words = transferRecognizer.wordLabels(); + // `result.scores` contains the scores for the new words, not the original + // words. + for (let i = 0; i < words.length; ++i) { + console.log(`score for word '${words[i]}' = ${result.scores[i]}`); + } +}, {probabilityThreshold: 0.75}); + +// Stop the recognition in 10 seconds. +setTimeout(() => transferRecognizer.stopListening(), 10e3); +``` + +### Serialize examples from a transfer recognizer. + +Once examples has been collected with a transfer recognizer, +you can export the examples in serialized form with the `serielizedExamples()` +method, e.g., + +```js +const serialized = transferRecognizer.serializeExamples(); +``` + +`serialized` is a binary `ArrayBuffer` amenable to storage and transmission. +It contains the spectrogram data of the examples, as well as metadata such +as word labels. + +You can also serialize the examples from a subset of the words in the +transfer recognizer's vocabulary, e.g., + +```js +const serializedWithOnlyFoo = transferRecognizer.serializeExamples('foo'); +// Or +const serializedWithOnlyFooAndBar = transferRecognizer.serializeExamples(['foo', 'bar']); +``` + +The serialized examples can later be loaded into another instance of +transfer recognizer with the `loadExamples()` method, e.g., + +```js +const clearExisting = false; +newTransferRecognizer.loadExamples(serialized, clearExisting); +``` + +Theo `clearExisting` flag ensures that the examples that `newTransferRecognizer` +already holds are preserved. If `true`, the existing exampels will be cleared. +If `clearExisting` is not specified, it'll default to `false`. + +## Live demo + +A developer-oriented live demo is available at +[this address](https://storage.googleapis.com/tfjs-speech-model-test/2019-01-03a/dist/index.html). + +## How to run the demo from source code + +The demo/ folder contains a live demo of the speech-command recognizer. +To run it, do + +```sh +cd speech-commands +yarn +yarn publish-local +cd demo +yarn +yarn link-local +yarn watch +``` diff --git a/音频分类/speech-commands/cloudbuild.yml b/音频分类/speech-commands/cloudbuild.yml new file mode 100644 index 0000000..80bf843 --- /dev/null +++ b/音频分类/speech-commands/cloudbuild.yml @@ -0,0 +1,48 @@ +steps: + +# Install common dependencies. +- name: 'node:16' + id: 'yarn-common' + entrypoint: 'yarn' + args: ['install'] + +# Install tfjs dependencies. +- name: 'node:16' + dir: 'speech-commands' + entrypoint: 'yarn' + id: 'yarn' + args: ['install'] + waitFor: ['yarn-common'] + +# Lint. +- name: 'node:16' + dir: 'speech-commands' + entrypoint: 'yarn' + id: 'lint' + args: ['lint'] + waitFor: ['yarn'] + +# Build. +- name: 'node:16' + dir: 'speech-commands' + entrypoint: 'yarn' + id: 'build' + args: ['build'] + waitFor: ['yarn'] + +# Run tests. +- name: 'node:16' + dir: 'speech-commands' + entrypoint: 'yarn' + id: 'test' + args: ['test'] + waitFor: ['yarn'] + +# General configuration +timeout: 1800s +logsBucket: 'gs://tfjs-build-logs' +substitutions: + _NIGHTLY: '' +options: + logStreamingOption: 'STREAM_ON' + substitution_option: 'ALLOW_LOOSE' diff --git a/音频分类/speech-commands/demo/.babelrc b/音频分类/speech-commands/demo/.babelrc new file mode 100644 index 0000000..4d30251 --- /dev/null +++ b/音频分类/speech-commands/demo/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + [ + "env", + { + "esmodules": false, + "targets": { + "browsers": [ + "> 3%" + ] + } + } + ] + ], + "plugins": [ + "@babel/plugin-transform-runtime" + ] +} diff --git a/音频分类/speech-commands/demo/dataset-vis.js b/音频分类/speech-commands/demo/dataset-vis.js new file mode 100644 index 0000000..dbfbbaf --- /dev/null +++ b/音频分类/speech-commands/demo/dataset-vis.js @@ -0,0 +1,321 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as speechCommands from '../src'; + +import {plotSpectrogram} from './ui'; + +/** Remove the children of a div that do not have the isFixed attribute. */ +export function removeNonFixedChildrenFromWordDiv(wordDiv) { + for (let i = wordDiv.children.length - 1; i >= 0; --i) { + if (wordDiv.children[i].getAttribute('isFixed') == null) { + wordDiv.removeChild(wordDiv.children[i]); + } else { + break; + } + } +} + +/** + * Get the relative x-coordinate of a click event in a canvas. + * + * @param {HTMLCanvasElement} canvasElement The canvas in which the click + * event happened. + * @param {Event} event The click event object. + * @return {number} The relative x-coordinate: a `number` between 0 and 1. + */ +function getCanvasClickRelativeXCoordinate(canvasElement, event) { + let x; + if (event.pageX) { + x = event.pageX; + } else { + x = event.clientX + document.body.scrollLeft + + document.documentElement.scrollLeft; + } + x -= canvasElement.offsetLeft; + return x / canvasElement.width; +} + +/** + * Dataset visualizer that supports + * + * - Display of words and spectrograms + * - Navigation through examples + * - Deletion of examples + */ +export class DatasetViz { + /** + * Constructor of DatasetViz + * + * @param {Object} transferRecognizer An instance of + * `speechCommands.TransferSpeechCommandRecognizer`. + * @param {HTMLDivElement} topLevelContainer The div element that + * holds the div elements for the individual words. It is assumed + * that each element has its "word" attribute set to the word. + * @param {number} minExamplesPerClass Minimum number of examples + * per word class required for the start-transfer-learning button + * to be enabled. + * @param {HTMLButtonElement} startTransferLearnButton The button + * which starts the transfer learning when clicked. + * @param {HTMLBUttonElement} downloadAsFileButton The button + * that triggers downloading of the dataset as a file when clicked. + * @param {number} transferDurationMultiplier Optional duration + * multiplier (the ratio between the length of the example + * and the length expected by the model.) Defaults to 1. + */ + constructor( + transferRecognizer, topLevelContainer, minExamplesPerClass, + startTransferLearnButton, downloadAsFileButton, + transferDurationMultiplier = 1) { + this.transferRecognizer = transferRecognizer; + this.container = topLevelContainer; + this.minExamplesPerClass = minExamplesPerClass; + this.startTransferLearnButton = startTransferLearnButton; + this.downloadAsFileButton = downloadAsFileButton; + this.transferDurationMultiplier = transferDurationMultiplier; + + // Navigation indices for the words. + this.navIndices = {}; + } + + /** Get the set of words in the dataset visualizer. */ + words_() { + const words = []; + for (const element of this.container.children) { + words.push(element.getAttribute('word')); + } + return words; + } + + /** + * Draw an example. + * + * @param {HTMLDivElement} wordDiv The div element for the word. It is assumed + * that it contains the word button as the first child and the canvas as the + * second. + * @param {string} word The word of the example being added. + * @param {SpectrogramData} spectrogram Optional spectrogram data. + * If provided, will use it as is. If not provided, will use WebAudio + * to collect an example. + * @param {RawAudio} rawAudio Raw audio waveform. Optional + * @param {string} uid UID of the example being drawn. Must match the UID + * of the example from `this.transferRecognizer`. + */ + async drawExample(wordDiv, word, spectrogram, rawAudio, uid) { + if (uid == null) { + throw new Error('Error: UID is not provided for pre-existing example.'); + } + + removeNonFixedChildrenFromWordDiv(wordDiv); + + // Create the left and right nav buttons. + const leftButton = document.createElement('button'); + leftButton.textContent = '←'; + wordDiv.appendChild(leftButton); + + const rightButton = document.createElement('button'); + rightButton.textContent = '→'; + wordDiv.appendChild(rightButton); + + // Determine the position of the example in the word of the dataset. + const exampleUIDs = + this.transferRecognizer.getExamples(word).map(ex => ex.uid); + const position = exampleUIDs.indexOf(uid); + this.navIndices[word] = exampleUIDs.indexOf(uid); + + if (position > 0) { + leftButton.addEventListener('click', () => { + this.redraw(word, exampleUIDs[position - 1]); + }); + } else { + leftButton.disabled = true; + } + + if (position < exampleUIDs.length - 1) { + rightButton.addEventListener('click', () => { + this.redraw(word, exampleUIDs[position + 1]); + }); + } else { + rightButton.disabled = true; + } + + // Spectrogram canvas. + const exampleCanvas = document.createElement('canvas'); + exampleCanvas.style['display'] = 'inline-block'; + exampleCanvas.style['vertical-align'] = 'middle'; + exampleCanvas.height = 60; + exampleCanvas.width = 80; + exampleCanvas.style['padding'] = '3px'; + + // Set up the click callback for the spectrogram canvas. When clicked, + // the keyFrameIndex will be set. + if (word !== speechCommands.BACKGROUND_NOISE_TAG) { + exampleCanvas.addEventListener('click', event => { + const relativeX = + getCanvasClickRelativeXCoordinate(exampleCanvas, event); + const numFrames = spectrogram.data.length / spectrogram.frameSize; + const keyFrameIndex = Math.floor(numFrames * relativeX); + console.log( + `relativeX=${relativeX}; ` + + `changed keyFrameIndex to ${keyFrameIndex}`); + this.transferRecognizer.setExampleKeyFrameIndex(uid, keyFrameIndex); + this.redraw(word, uid); + }); + } + + wordDiv.appendChild(exampleCanvas); + + const modelNumFrames = this.transferRecognizer.modelInputShape()[1]; + await plotSpectrogram( + exampleCanvas, spectrogram.data, spectrogram.frameSize, + spectrogram.frameSize, { + pixelsPerFrame: exampleCanvas.width / modelNumFrames, + maxPixelWidth: Math.round(0.4 * window.innerWidth), + markKeyFrame: this.transferDurationMultiplier > 1 && + word !== speechCommands.BACKGROUND_NOISE_TAG, + keyFrameIndex: spectrogram.keyFrameIndex + }); + + if (rawAudio != null) { + const playButton = document.createElement('button'); + playButton.textContent = '▶️'; + playButton.addEventListener('click', () => { + playButton.disabled = true; + speechCommands.utils.playRawAudio( + rawAudio, () => playButton.disabled = false); + }); + wordDiv.appendChild(playButton); + } + + // Create Delete button. + const deleteButton = document.createElement('button'); + deleteButton.textContent = 'X'; + wordDiv.appendChild(deleteButton); + + // Callback for delete button. + deleteButton.addEventListener('click', () => { + this.transferRecognizer.removeExample(uid); + // TODO(cais): Smarter logic for which example to draw after deletion. + // Right now it always redraws the last available one. + this.redraw(word); + }); + + this.updateButtons_(); + } + + /** + * Redraw the spectrogram and buttons for a word. + * + * @param {string} word The word being redrawn. This must belong to the + * vocabulary currently held by the transferRecognizer. + * @param {string} uid Optional UID for the example to render. If not + * specified, the last available example of the dataset will be drawn. + */ + async redraw(word, uid) { + if (word == null) { + throw new Error('word is not specified'); + } + let divIndex; + for (divIndex = 0; divIndex < this.container.children.length; ++divIndex) { + if (this.container.children[divIndex].getAttribute('word') === word) { + break; + } + } + if (divIndex === this.container.children.length) { + throw new Error(`Cannot find div corresponding to word ${word}`); + } + const wordDiv = this.container.children[divIndex]; + const exampleCounts = this.transferRecognizer.isDatasetEmpty() ? + {} : + this.transferRecognizer.countExamples(); + + if (word in exampleCounts) { + const examples = this.transferRecognizer.getExamples(word); + let example; + if (uid == null) { + // Example UID is not specified. Draw the last one available. + example = examples[examples.length - 1]; + } else { + // Example UID is specified. Find the example and update navigation + // indices. + for (let index = 0; index < examples.length; ++index) { + if (examples[index].uid === uid) { + example = examples[index]; + } + } + } + + const spectrogram = example.example.spectrogram; + await this.drawExample( + wordDiv, word, spectrogram, example.example.rawAudio, example.uid); + } else { + removeNonFixedChildrenFromWordDiv(wordDiv); + } + + this.updateButtons_(); + } + + /** + * Redraw the spectrograms and buttons for all words. + * + * For each word, the last available example is rendered. + **/ + redrawAll() { + for (const word of this.words_()) { + this.redraw(word); + } + } + + /** Update the button states according to the state of transferRecognizer. */ + updateButtons_() { + const exampleCounts = this.transferRecognizer.isDatasetEmpty() ? + {} : + this.transferRecognizer.countExamples(); + const minCountByClass = + this.words_() + .map(word => exampleCounts[word] || 0) + .reduce((prev, current) => current < prev ? current : prev); + + for (const element of this.container.children) { + const word = element.getAttribute('word'); + const button = element.children[0]; + const displayWord = + word === speechCommands.BACKGROUND_NOISE_TAG ? 'noise' : word; + const exampleCount = exampleCounts[word] || 0; + if (exampleCount === 0) { + button.textContent = `${displayWord} (${exampleCount})`; + } else { + const pos = this.navIndices[word] + 1; + button.textContent = `${displayWord} (${pos}/${exampleCount})`; + } + } + + const requiredMinCountPerClass = + Math.ceil(this.minExamplesPerClass / this.transferDurationMultiplier); + if (minCountByClass >= requiredMinCountPerClass) { + this.startTransferLearnButton.textContent = 'Start transfer learning'; + this.startTransferLearnButton.disabled = false; + } else { + this.startTransferLearnButton.textContent = + `Need at least ${requiredMinCountPerClass} examples per word`; + this.startTransferLearnButton.disabled = true; + } + + this.downloadAsFileButton.disabled = + this.transferRecognizer.isDatasetEmpty(); + } +} diff --git a/音频分类/speech-commands/demo/index.html b/音频分类/speech-commands/demo/index.html new file mode 100644 index 0000000..95f16ab --- /dev/null +++ b/音频分类/speech-commands/demo/index.html @@ -0,0 +1,98 @@ + + + + + + + TensorFlow.js Speech Commands Model Demo + + + + + +
+ + +
+
+
+ Prob. threshold: + +
+
+
+ +
+ + + + + + Include audio waveform + + + +
+
+ +
+ +
+
+ +
+ + + +
+
+
+
+ +
+ Epochs: + + Fine-tuning (FT) epochs: + + Augment by mixing noise: + + +
+ +
+
+
+
+
+ +
+
+
+
+ +
+ +
+
+ + + +
+
+ +
+
+
+
+ + + + + diff --git a/音频分类/speech-commands/demo/index.js b/音频分类/speech-commands/demo/index.js new file mode 100644 index 0000000..d42c1a3 --- /dev/null +++ b/音频分类/speech-commands/demo/index.js @@ -0,0 +1,713 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs'; +import Plotly from 'plotly.js-dist'; + +import * as SpeechCommands from '@tensorflow-models/speech-commands'; + +import {DatasetViz, removeNonFixedChildrenFromWordDiv} from './dataset-vis'; +import {hideCandidateWords, logToStatusDisplay, plotPredictions, plotSpectrogram, populateCandidateWords, showCandidateWords} from './ui'; + +const startButton = document.getElementById('start'); +const stopButton = document.getElementById('stop'); +const predictionCanvas = document.getElementById('prediction-canvas'); + +const probaThresholdInput = document.getElementById('proba-threshold'); +const epochsInput = document.getElementById('epochs'); +const fineTuningEpochsInput = document.getElementById('fine-tuning-epochs'); + +const datasetIOButton = document.getElementById('dataset-io'); +const datasetIOInnerDiv = document.getElementById('dataset-io-inner'); +const downloadAsFileButton = document.getElementById('download-dataset'); +const datasetFileInput = document.getElementById('dataset-file-input'); +const uploadFilesButton = document.getElementById('upload-dataset'); + +const evalModelOnDatasetButton = + document.getElementById('eval-model-on-dataset'); +const evalResultsSpan = document.getElementById('eval-results'); + +const modelIOButton = document.getElementById('model-io'); +const transferModelSaveLoadInnerDiv = + document.getElementById('transfer-model-save-load-inner'); +const loadTransferModelButton = document.getElementById('load-transfer-model'); +const saveTransferModelButton = document.getElementById('save-transfer-model'); +const savedTransferModelsSelect = + document.getElementById('saved-transfer-models'); +const deleteTransferModelButton = + document.getElementById('delete-transfer-model'); + +const BACKGROUND_NOISE_TAG = SpeechCommands.BACKGROUND_NOISE_TAG; + +/** + * Transfer learning-related UI componenets. + */ +const transferModelNameInput = document.getElementById('transfer-model-name'); +const learnWordsInput = document.getElementById('learn-words'); +const durationMultiplierSelect = document.getElementById('duration-multiplier'); +const enterLearnWordsButton = document.getElementById('enter-learn-words'); +const includeTimeDomainWaveformCheckbox = + document.getElementById('include-audio-waveform'); +const collectButtonsDiv = document.getElementById('collect-words'); +const startTransferLearnButton = + document.getElementById('start-transfer-learn'); + +const XFER_MODEL_NAME = 'xfer-model'; + +// Minimum required number of examples per class for transfer learning. +const MIN_EXAMPLES_PER_CLASS = 8; + +let recognizer; +let transferWords; +let transferRecognizer; +let transferDurationMultiplier; + +(async function() { + logToStatusDisplay('Creating recognizer...'); + recognizer = SpeechCommands.create('BROWSER_FFT'); + + await populateSavedTransferModelsSelect(); + + // Make sure the tf.Model is loaded through HTTP. If this is not + // called here, the tf.Model will be loaded the first time + // `listen()` is called. + recognizer.ensureModelLoaded() + .then(() => { + startButton.disabled = false; + enterLearnWordsButton.disabled = false; + loadTransferModelButton.disabled = false; + deleteTransferModelButton.disabled = false; + + transferModelNameInput.value = `model-${getDateString()}`; + + logToStatusDisplay('Model loaded.'); + + const params = recognizer.params(); + logToStatusDisplay(`sampleRateHz: ${params.sampleRateHz}`); + logToStatusDisplay(`fftSize: ${params.fftSize}`); + logToStatusDisplay( + `spectrogramDurationMillis: ` + + `${params.spectrogramDurationMillis.toFixed(2)}`); + logToStatusDisplay( + `tf.Model input shape: ` + + `${JSON.stringify(recognizer.modelInputShape())}`); + }) + .catch(err => { + logToStatusDisplay( + 'Failed to load model for recognizer: ' + err.message); + }); +})(); + +startButton.addEventListener('click', () => { + const activeRecognizer = + transferRecognizer == null ? recognizer : transferRecognizer; + populateCandidateWords(activeRecognizer.wordLabels()); + + const suppressionTimeMillis = 1000; + activeRecognizer + .listen( + result => { + plotPredictions( + predictionCanvas, activeRecognizer.wordLabels(), result.scores, + 3, suppressionTimeMillis); + }, + { + includeSpectrogram: true, + suppressionTimeMillis, + probabilityThreshold: Number.parseFloat(probaThresholdInput.value) + }) + .then(() => { + startButton.disabled = true; + stopButton.disabled = false; + showCandidateWords(); + logToStatusDisplay('Streaming recognition started.'); + }) + .catch(err => { + logToStatusDisplay( + 'ERROR: Failed to start streaming display: ' + err.message); + }); +}); + +stopButton.addEventListener('click', () => { + const activeRecognizer = + transferRecognizer == null ? recognizer : transferRecognizer; + activeRecognizer.stopListening() + .then(() => { + startButton.disabled = false; + stopButton.disabled = true; + hideCandidateWords(); + logToStatusDisplay('Streaming recognition stopped.'); + }) + .catch(err => { + logToStatusDisplay( + 'ERROR: Failed to stop streaming display: ' + err.message); + }); +}); + +/** + * Transfer learning logic. + */ + +/** Scroll to the bottom of the page */ +function scrollToPageBottom() { + const scrollingElement = (document.scrollingElement || document.body); + scrollingElement.scrollTop = scrollingElement.scrollHeight; +} + +let collectWordButtons = {}; +let datasetViz; + +function createProgressBarAndIntervalJob(parentElement, durationSec) { + const progressBar = document.createElement('progress'); + progressBar.value = 0; + progressBar.style['width'] = `${Math.round(window.innerWidth * 0.25)}px`; + // Update progress bar in increments. + const intervalJob = setInterval(() => { + progressBar.value += 0.05; + }, durationSec * 1e3 / 20); + parentElement.appendChild(progressBar); + return {progressBar, intervalJob}; +} + +/** + * Create div elements for transfer words. + * + * @param {string[]} transferWords The array of transfer words. + * @returns {Object} An object mapping word to th div element created for it. + */ +function createWordDivs(transferWords) { + // Clear collectButtonsDiv first. + while (collectButtonsDiv.firstChild) { + collectButtonsDiv.removeChild(collectButtonsDiv.firstChild); + } + datasetViz = new DatasetViz( + transferRecognizer, collectButtonsDiv, MIN_EXAMPLES_PER_CLASS, + startTransferLearnButton, downloadAsFileButton, + transferDurationMultiplier); + + const wordDivs = {}; + for (const word of transferWords) { + const wordDiv = document.createElement('div'); + wordDiv.classList.add('word-div'); + wordDivs[word] = wordDiv; + wordDiv.setAttribute('word', word); + const button = document.createElement('button'); + button.setAttribute('isFixed', 'true'); + button.style['display'] = 'inline-block'; + button.style['vertical-align'] = 'middle'; + + const displayWord = word === BACKGROUND_NOISE_TAG ? 'noise' : word; + + button.textContent = `${displayWord} (0)`; + wordDiv.appendChild(button); + wordDiv.className = 'transfer-word'; + collectButtonsDiv.appendChild(wordDiv); + collectWordButtons[word] = button; + + let durationInput; + if (word === BACKGROUND_NOISE_TAG) { + // Create noise duration input. + durationInput = document.createElement('input'); + durationInput.setAttribute('isFixed', 'true'); + durationInput.value = '10'; + durationInput.style['width'] = '100px'; + wordDiv.appendChild(durationInput); + // Create time-unit span for noise duration. + const timeUnitSpan = document.createElement('span'); + timeUnitSpan.setAttribute('isFixed', 'true'); + timeUnitSpan.classList.add('settings'); + timeUnitSpan.style['vertical-align'] = 'middle'; + timeUnitSpan.textContent = 'seconds'; + wordDiv.appendChild(timeUnitSpan); + } + + button.addEventListener('click', async () => { + disableAllCollectWordButtons(); + removeNonFixedChildrenFromWordDiv(wordDiv); + + const collectExampleOptions = {}; + let durationSec; + let intervalJob; + let progressBar; + + if (word === BACKGROUND_NOISE_TAG) { + // If the word type is background noise, display a progress bar during + // sound collection and do not show an incrementally updating + // spectrogram. + // _background_noise_ examples are special, in that user can specify + // the length of the recording (in seconds). + collectExampleOptions.durationSec = + Number.parseFloat(durationInput.value); + durationSec = collectExampleOptions.durationSec; + + const barAndJob = createProgressBarAndIntervalJob(wordDiv, durationSec); + progressBar = barAndJob.progressBar; + intervalJob = barAndJob.intervalJob; + } else { + // If this is not a background-noise word type and if the duration + // multiplier is >1 (> ~1 s recoding), show an incrementally + // updating spectrogram in real time. + collectExampleOptions.durationMultiplier = transferDurationMultiplier; + let tempSpectrogramData; + const tempCanvas = document.createElement('canvas'); + tempCanvas.style['margin-left'] = '132px'; + tempCanvas.height = 50; + wordDiv.appendChild(tempCanvas); + + collectExampleOptions.snippetDurationSec = 0.1; + collectExampleOptions.onSnippet = async (spectrogram) => { + if (tempSpectrogramData == null) { + tempSpectrogramData = spectrogram.data; + } else { + tempSpectrogramData = SpeechCommands.utils.concatenateFloat32Arrays( + [tempSpectrogramData, spectrogram.data]); + } + plotSpectrogram( + tempCanvas, tempSpectrogramData, spectrogram.frameSize, + spectrogram.frameSize, {pixelsPerFrame: 2}); + } + } + + collectExampleOptions.includeRawAudio = + includeTimeDomainWaveformCheckbox.checked; + const spectrogram = + await transferRecognizer.collectExample(word, collectExampleOptions); + + + if (intervalJob != null) { + clearInterval(intervalJob); + } + if (progressBar != null) { + wordDiv.removeChild(progressBar); + } + const examples = transferRecognizer.getExamples(word) + const example = examples[examples.length - 1]; + await datasetViz.drawExample( + wordDiv, word, spectrogram, example.example.rawAudio, example.uid); + enableAllCollectWordButtons(); + }); + } + return wordDivs; +} + +enterLearnWordsButton.addEventListener('click', () => { + const modelName = transferModelNameInput.value; + if (modelName == null || modelName.length === 0) { + enterLearnWordsButton.textContent = 'Need model name!'; + setTimeout(() => { + enterLearnWordsButton.textContent = 'Enter transfer words'; + }, 2000); + return; + } + + // We disable the option to upload an existing dataset from files + // once the "Enter transfer words" button has been clicked. + // However, the user can still load an existing dataset from + // files first and keep appending examples to it. + disableFileUploadControls(); + enterLearnWordsButton.disabled = true; + + transferDurationMultiplier = durationMultiplierSelect.value; + + learnWordsInput.disabled = true; + enterLearnWordsButton.disabled = true; + transferWords = learnWordsInput.value.trim().split(',').map(w => w.trim()); + transferWords.sort(); + if (transferWords == null || transferWords.length <= 1) { + logToStatusDisplay('ERROR: Invalid list of transfer words.'); + return; + } + + transferRecognizer = recognizer.createTransfer(modelName); + createWordDivs(transferWords); + + scrollToPageBottom(); +}); + +function disableAllCollectWordButtons() { + for (const word in collectWordButtons) { + collectWordButtons[word].disabled = true; + } +} + +function enableAllCollectWordButtons() { + for (const word in collectWordButtons) { + collectWordButtons[word].disabled = false; + } +} + +function disableFileUploadControls() { + datasetFileInput.disabled = true; + uploadFilesButton.disabled = true; +} + +startTransferLearnButton.addEventListener('click', async () => { + startTransferLearnButton.disabled = true; + startButton.disabled = true; + startTransferLearnButton.textContent = 'Transfer learning starting...'; + await tf.nextFrame(); + + const INITIAL_PHASE = 'initial'; + const FINE_TUNING_PHASE = 'fineTuningPhase'; + + const epochs = parseInt(epochsInput.value); + const fineTuningEpochs = parseInt(fineTuningEpochsInput.value); + const trainLossValues = {}; + const valLossValues = {}; + const trainAccValues = {}; + const valAccValues = {}; + + for (const phase of [INITIAL_PHASE, FINE_TUNING_PHASE]) { + const phaseSuffix = phase === FINE_TUNING_PHASE ? ' (FT)' : ''; + const lineWidth = phase === FINE_TUNING_PHASE ? 2 : 1; + trainLossValues[phase] = { + x: [], + y: [], + name: 'train' + phaseSuffix, + mode: 'lines', + line: {width: lineWidth} + }; + valLossValues[phase] = { + x: [], + y: [], + name: 'val' + phaseSuffix, + mode: 'lines', + line: {width: lineWidth} + }; + trainAccValues[phase] = { + x: [], + y: [], + name: 'train' + phaseSuffix, + mode: 'lines', + line: {width: lineWidth} + }; + valAccValues[phase] = { + x: [], + y: [], + name: 'val' + phaseSuffix, + mode: 'lines', + line: {width: lineWidth} + }; + } + + function plotLossAndAccuracy(epoch, loss, acc, val_loss, val_acc, phase) { + const displayEpoch = phase === FINE_TUNING_PHASE ? (epoch + epochs) : epoch; + trainLossValues[phase].x.push(displayEpoch); + trainLossValues[phase].y.push(loss); + trainAccValues[phase].x.push(displayEpoch); + trainAccValues[phase].y.push(acc); + valLossValues[phase].x.push(displayEpoch); + valLossValues[phase].y.push(val_loss); + valAccValues[phase].x.push(displayEpoch); + valAccValues[phase].y.push(val_acc); + + Plotly.newPlot( + 'loss-plot', + [ + trainLossValues[INITIAL_PHASE], valLossValues[INITIAL_PHASE], + trainLossValues[FINE_TUNING_PHASE], valLossValues[FINE_TUNING_PHASE] + ], + { + width: 480, + height: 360, + xaxis: {title: 'Epoch #'}, + yaxis: {title: 'Loss'}, + font: {size: 18} + }); + Plotly.newPlot( + 'accuracy-plot', + [ + trainAccValues[INITIAL_PHASE], valAccValues[INITIAL_PHASE], + trainAccValues[FINE_TUNING_PHASE], valAccValues[FINE_TUNING_PHASE] + ], + { + width: 480, + height: 360, + xaxis: {title: 'Epoch #'}, + yaxis: {title: 'Accuracy'}, + font: {size: 18} + }); + startTransferLearnButton.textContent = phase === INITIAL_PHASE ? + `Transfer-learning... (${(epoch / epochs * 1e2).toFixed(0)}%)` : + `Transfer-learning (fine-tuning)... (${ + (epoch / fineTuningEpochs * 1e2).toFixed(0)}%)` + + scrollToPageBottom(); + } + + disableAllCollectWordButtons(); + const augmentByMixingNoiseRatio = + document.getElementById('augment-by-mixing-noise').checked ? 0.5 : null; + console.log(`augmentByMixingNoiseRatio = ${augmentByMixingNoiseRatio}`); + await transferRecognizer.train({ + epochs, + validationSplit: 0.25, + augmentByMixingNoiseRatio, + callback: { + onEpochEnd: async (epoch, logs) => { + plotLossAndAccuracy( + epoch, logs.loss, logs.acc, logs.val_loss, logs.val_acc, + INITIAL_PHASE); + } + }, + fineTuningEpochs, + fineTuningCallback: { + onEpochEnd: async (epoch, logs) => { + plotLossAndAccuracy( + epoch, logs.loss, logs.acc, logs.val_loss, logs.val_acc, + FINE_TUNING_PHASE); + } + } + }); + saveTransferModelButton.disabled = false; + transferModelNameInput.value = transferRecognizer.name; + transferModelNameInput.disabled = true; + startTransferLearnButton.textContent = 'Transfer learning complete.'; + transferModelNameInput.disabled = false; + startButton.disabled = false; + evalModelOnDatasetButton.disabled = false; +}); + +downloadAsFileButton.addEventListener('click', () => { + const basename = getDateString(); + const artifacts = transferRecognizer.serializeExamples(); + + // Trigger downloading of the data .bin file. + const anchor = document.createElement('a'); + anchor.download = `${basename}.bin`; + anchor.href = window.URL.createObjectURL( + new Blob([artifacts], {type: 'application/octet-stream'})); + anchor.click(); +}); + +/** Get the base name of the downloaded files based on current dataset. */ +function getDateString() { + const d = new Date(); + const year = `${d.getFullYear()}`; + let month = `${d.getMonth() + 1}`; + let day = `${d.getDate()}`; + if (month.length < 2) { + month = `0${month}`; + } + if (day.length < 2) { + day = `0${day}`; + } + let hour = `${d.getHours()}`; + if (hour.length < 2) { + hour = `0${hour}`; + } + let minute = `${d.getMinutes()}`; + if (minute.length < 2) { + minute = `0${minute}`; + } + let second = `${d.getSeconds()}`; + if (second.length < 2) { + second = `0${second}`; + } + return `${year}-${month}-${day}T${hour}.${minute}.${second}`; +} + +uploadFilesButton.addEventListener('click', async () => { + const files = datasetFileInput.files; + if (files == null || files.length !== 1) { + throw new Error('Must select exactly one file.'); + } + const datasetFileReader = new FileReader(); + datasetFileReader.onload = async event => { + try { + await loadDatasetInTransferRecognizer(event.target.result); + } catch (err) { + const originalTextContent = uploadFilesButton.textContent; + uploadFilesButton.textContent = err.message; + setTimeout(() => { + uploadFilesButton.textContent = originalTextContent; + }, 2000); + } + durationMultiplierSelect.value = `${transferDurationMultiplier}`; + durationMultiplierSelect.disabled = true; + enterLearnWordsButton.disabled = true; + }; + datasetFileReader.onerror = () => + console.error(`Failed to binary data from file '${dataFile.name}'.`); + datasetFileReader.readAsArrayBuffer(files[0]); +}); + +async function loadDatasetInTransferRecognizer(serialized) { + const modelName = transferModelNameInput.value; + if (modelName == null || modelName.length === 0) { + throw new Error('Need model name!'); + } + + if (transferRecognizer == null) { + transferRecognizer = recognizer.createTransfer(modelName); + } + transferRecognizer.loadExamples(serialized); + const exampleCounts = transferRecognizer.countExamples(); + transferWords = []; + const modelNumFrames = transferRecognizer.modelInputShape()[1]; + const durationMultipliers = []; + for (const word in exampleCounts) { + transferWords.push(word); + const examples = transferRecognizer.getExamples(word); + for (const example of examples) { + const spectrogram = example.example.spectrogram; + // Ignore _background_noise_ examples when determining the duration + // multiplier of the dataset. + if (word !== BACKGROUND_NOISE_TAG) { + durationMultipliers.push(Math.round( + spectrogram.data.length / spectrogram.frameSize / modelNumFrames)); + } + } + } + transferWords.sort(); + learnWordsInput.value = transferWords.join(','); + + // Determine the transferDurationMultiplier value from the dataset. + transferDurationMultiplier = + durationMultipliers.length > 0 ? Math.max(...durationMultipliers) : 1; + console.log( + `Deteremined transferDurationMultiplier from uploaded ` + + `dataset: ${transferDurationMultiplier}`); + + createWordDivs(transferWords); + datasetViz.redrawAll(); +} + +evalModelOnDatasetButton.addEventListener('click', async () => { + const files = datasetFileInput.files; + if (files == null || files.length !== 1) { + throw new Error('Must select exactly one file.'); + } + evalModelOnDatasetButton.disabled = true; + const datasetFileReader = new FileReader(); + datasetFileReader.onload = async event => { + try { + if (transferRecognizer == null) { + throw new Error('There is no model!'); + } + + // Load the dataset and perform evaluation of the transfer + // model using the dataset. + transferRecognizer.loadExamples(event.target.result); + const evalResult = await transferRecognizer.evaluate({ + windowHopRatio: 0.25, + wordProbThresholds: [ + 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.5, + 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0 + ] + }); + // Plot the ROC curve. + const rocDataForPlot = {x: [], y: []}; + evalResult.rocCurve.forEach(item => { + rocDataForPlot.x.push(item.fpr); + rocDataForPlot.y.push(item.tpr); + }); + + Plotly.newPlot('roc-plot', [rocDataForPlot], { + width: 360, + height: 360, + mode: 'markers', + marker: {size: 7}, + xaxis: {title: 'False positive rate (FPR)', range: [0, 1]}, + yaxis: {title: 'True positive rate (TPR)', range: [0, 1]}, + font: {size: 18} + }); + evalResultsSpan.textContent = `AUC = ${evalResult.auc}`; + } catch (err) { + const originalTextContent = evalModelOnDatasetButton.textContent; + evalModelOnDatasetButton.textContent = err.message; + setTimeout(() => { + evalModelOnDatasetButton.textContent = originalTextContent; + }, 2000); + } + evalModelOnDatasetButton.disabled = false; + }; + datasetFileReader.onerror = () => + console.error(`Failed to binary data from file '${dataFile.name}'.`); + datasetFileReader.readAsArrayBuffer(files[0]); +}); + +async function populateSavedTransferModelsSelect() { + const savedModelKeys = await SpeechCommands.listSavedTransferModels(); + while (savedTransferModelsSelect.firstChild) { + savedTransferModelsSelect.removeChild(savedTransferModelsSelect.firstChild); + } + if (savedModelKeys.length > 0) { + for (const key of savedModelKeys) { + const option = document.createElement('option'); + option.textContent = key; + option.id = key; + savedTransferModelsSelect.appendChild(option); + } + loadTransferModelButton.disabled = false; + } +} + +saveTransferModelButton.addEventListener('click', async () => { + await transferRecognizer.save(); + await populateSavedTransferModelsSelect(); + saveTransferModelButton.textContent = 'Model saved!'; + saveTransferModelButton.disabled = true; +}); + +loadTransferModelButton.addEventListener('click', async () => { + const transferModelName = savedTransferModelsSelect.value; + await recognizer.ensureModelLoaded(); + transferRecognizer = recognizer.createTransfer(transferModelName); + await transferRecognizer.load(); + transferModelNameInput.value = transferModelName; + transferModelNameInput.disabled = true; + learnWordsInput.value = transferRecognizer.wordLabels().join(','); + learnWordsInput.disabled = true; + durationMultiplierSelect.disabled = true; + enterLearnWordsButton.disabled = true; + saveTransferModelButton.disabled = true; + loadTransferModelButton.disabled = true; + loadTransferModelButton.textContent = 'Model loaded!'; +}); + +modelIOButton.addEventListener('click', () => { + if (modelIOButton.textContent.endsWith(' >>')) { + transferModelSaveLoadInnerDiv.style.display = 'inline-block'; + modelIOButton.textContent = modelIOButton.textContent.replace(' >>', ' <<'); + } else { + transferModelSaveLoadInnerDiv.style.display = 'none'; + modelIOButton.textContent = modelIOButton.textContent.replace(' <<', ' >>'); + } +}); + +deleteTransferModelButton.addEventListener('click', async () => { + const transferModelName = savedTransferModelsSelect.value; + await recognizer.ensureModelLoaded(); + transferRecognizer = recognizer.createTransfer(transferModelName); + await SpeechCommands.deleteSavedTransferModel(transferModelName); + deleteTransferModelButton.disabled = true; + deleteTransferModelButton.textContent = `Deleted "${transferModelName}"`; + await populateSavedTransferModelsSelect(); +}); + +datasetIOButton.addEventListener('click', () => { + if (datasetIOButton.textContent.endsWith(' >>')) { + datasetIOInnerDiv.style.display = 'inline-block'; + datasetIOButton.textContent = + datasetIOButton.textContent.replace(' >>', ' <<'); + } else { + datasetIOInnerDiv.style.display = 'none'; + datasetIOButton.textContent = + datasetIOButton.textContent.replace(' <<', ' >>'); + } +}); diff --git a/音频分类/speech-commands/demo/package.json b/音频分类/speech-commands/demo/package.json new file mode 100644 index 0000000..5e95842 --- /dev/null +++ b/音频分类/speech-commands/demo/package.json @@ -0,0 +1,60 @@ +{ + "name": "tfjs-models-speech-commands-demo", + "version": "0.0.1", + "description": "", + "main": "index.js", + "license": "Apache-2.0", + "private": true, + "engines": { + "node": ">=8.9.0" + }, + "dependencies": { + "@tensorflow-models/speech-commands": "file:../dist", + "stats.js": "^0.17.0" + }, + "scripts": { + "build-model": "cd .. && yarn && yarn build", + "watch": "yarn build-model && cross-env NODE_OPTIONS=--max_old_space_size=4096 NODE_ENV=development parcel index.html --no-hmr --open", + "build": "yarn build-model && cross-env NODE_OPTIONS=--max_old_space_size=4096 NODE_ENV=production parcel build index.html --public-url ./", + "lint": "eslint .", + "link-local": "yalc link @tensorflow-models/speech-commands" + }, + "browser": { + "crypto": false + }, + "devDependencies": { + "@babel/core": "^7.0.0-0", + "@babel/plugin-transform-runtime": "^7.1.0", + "babel-polyfill": "~6.26.0", + "babel-preset-env": "~1.6.1", + "babel-preset-es2017": "^6.24.1", + "clang-format": "~1.2.2", + "cross-env": "^5.2.0", + "dat.gui": "^0.7.1", + "eslint": "^4.19.1", + "eslint-config-google": "^0.9.1", + "parcel-bundler": "~1.12.5", + "plotly.js-dist": "^1.39.4", + "yalc": "~1.0.0-pre.50" + }, + "resolutions": { + "is-svg": "4.3.1" + }, + "eslintConfig": { + "extends": "google", + "rules": { + "require-jsdoc": 0, + "valid-jsdoc": 0 + }, + "env": { + "es6": true + }, + "parserOptions": { + "ecmaVersion": 8, + "sourceType": "module" + } + }, + "eslintIgnore": [ + "dist/" + ] +} diff --git a/音频分类/speech-commands/demo/style.css b/音频分类/speech-commands/demo/style.css new file mode 100644 index 0000000..d8629d9 --- /dev/null +++ b/音频分类/speech-commands/demo/style.css @@ -0,0 +1,183 @@ +body { + margin: 30px 0 0 30px; + font: 400 11px system-ui; +} + +button { + color: #ff8300; + background-color: #ffffff; + border-style: solid; + border-width: 2px; + border-color: #ff8300; + border-radius: 10px; + font-size: 20px; + margin: 5px; + padding: 15px; +} + +button:disabled { + color: #a0a0a0; + border-color: #a0a0a0; +} + +input:disabled { + color: #a0a0a0; + border-color: #a0a0a0; +} + +select:disabled { + color: #a0a0a0; + border-color: #a0a0a0; +} + +select { + color: #ff8300; + background-color: #ffffff; + border-style: solid; + border-width: 2px; + border-color: #ff8300; + border-radius: 10px; + font-size: 20px; + margin: 5px; + padding: 15px; +} + +.transfer-learn-section input { + color: #0000ff; + background-color: #ffffff; + border-style: solid; + border-width: 2px; + border-color: #0000ff; + border-radius: 10px; + font-size: 20px; + margin: 5px; + padding: 15px; + position: relative; +} + +textarea { + font-size: 20px; + width: 90%; + height: 80%; + border: 2px solid #888; + border-radius: 10px; + resize: none; +} + +.footer { + height: 20%; +} + +.transfer-learn { + position: absolute; + top: 40%; +} + +.word-div { + border-radius: 10px; + margin: 3px; +} + +.candidate-word { + border: 1px solid gray; + background-color: lightyellow; + margin: 5px; + border-radius: 3px; + width: 10vw; + padding: 15px; + text-align: center; +} + +.candidate-word-active { + border: 2px solid gray; + background-color: lightgreen; +} + +.candidate-word-label { + font-weight: bold; + background-color: orange; + width: 250px; +} + +.candidate-words-hidden { + display: none !important; +} + +#candidate-words { + display: flex; + flex-wrap: wrap; + font-size: 20px; +} + +#collect-words { + display: flex; + flex-wrap: wrap; + flex-direction: column; +} + +#plots { + display: flex; +} + +.settings { + font-size: 17px; +} + +.collapsible-region { + font-size: 17px; + border-style: solid; + border-width: 1px; + border-color: #808080; + border-radius: 10px; +} + +.collapsible-region-inner { + display: none; +} + +#model-io { + vertical-align: top; +} + +#dataset-io { + vertical-align: top; +} + +.start-stop { + font-size: 17px; +} + +.settings input { + color: #0000ff; + background-color: #ffffff; + border-style: solid; + border-width: 2px; + border-color: #0000ff; + border-radius: 10px; + margin: 5px; + font-size: 17px; +} + +.transfer-word { + display: flex; + width: 100%; + justify-content: left; + vertical-align: middle; + text-align: center; +} + +.eval-results { + font-size: 17px; +} + +input[type=checkbox] { + transform: scale(2); +} + +#include-audio-waveform { + margin-left: 20px; +} + +#include-audio-waveform-label { + font-size: 17px; +} diff --git a/音频分类/speech-commands/demo/ui.js b/音频分类/speech-commands/demo/ui.js new file mode 100644 index 0000000..33aca15 --- /dev/null +++ b/音频分类/speech-commands/demo/ui.js @@ -0,0 +1,216 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as SpeechCommands from '../src'; + +import {BACKGROUND_NOISE_TAG, UNKNOWN_TAG} from '../src'; + +const statusDisplay = document.getElementById('status-display'); +const candidateWordsContainer = document.getElementById('candidate-words'); + +/** + * Log a message to a textarea. + * + * @param {string} message Message to be logged. + */ +export function logToStatusDisplay(message) { + const date = new Date(); + statusDisplay.value += `[${date.toISOString()}] ` + message + '\n'; + statusDisplay.scrollTop = statusDisplay.scrollHeight; +} + +let candidateWordSpans; + +/** + * Display candidate words in the UI. + * + * The background-noise "word" will be omitted. + * + * @param {*} words Candidate words. + */ +export function populateCandidateWords(words) { + candidateWordSpans = {}; + while (candidateWordsContainer.firstChild) { + candidateWordsContainer.removeChild(candidateWordsContainer.firstChild); + } + + for (const word of words) { + if (word === BACKGROUND_NOISE_TAG || word === UNKNOWN_TAG) { + continue; + } + const wordSpan = document.createElement('span'); + wordSpan.textContent = word; + wordSpan.classList.add('candidate-word'); + candidateWordsContainer.appendChild(wordSpan); + candidateWordSpans[word] = wordSpan; + } +} + +export function showCandidateWords() { + candidateWordsContainer.classList.remove('candidate-words-hidden'); +} + +export function hideCandidateWords() { + candidateWordsContainer.classList.add('candidate-words-hidden'); +} + +/** + * Show an audio spectrogram in a canvas. + * + * @param {HTMLCanvasElement} canvas The canvas element to draw the + * spectrogram in. + * @param {Float32Array} frequencyData The flat array for the spectrogram + * data. + * @param {number} fftSize Number of frequency points per frame. + * @param {number} fftDisplaySize Number of frequency points to show. Must be + * @param {Object} config Optional configuration object, with the following + * supported fields: + * - pixelsPerFrame {number} Number of pixels along the width dimension of + * the canvas for each frame of spectrogram. + * - maxPixelWidth {number} Maximum width in pixels. + * - markKeyFrame {bool} Whether to mark the index of the frame + * with the maximum intensity or a predetermined key frame. + * - keyFrameIndex {index?} Predetermined key frame index. + * + * <= fftSize. + */ +export async function plotSpectrogram( + canvas, frequencyData, fftSize, fftDisplaySize, config) { + if (fftDisplaySize == null) { + fftDisplaySize = fftSize; + } + if (config == null) { + config = {}; + } + + // Get the maximum and minimum. + let min = Infinity; + let max = -Infinity; + for (let i = 0; i < frequencyData.length; ++i) { + const x = frequencyData[i]; + if (x !== -Infinity) { + if (x < min) { + min = x; + } + if (x > max) { + max = x; + } + } + } + if (min >= max) { + return; + } + + const context = canvas.getContext('2d'); + context.clearRect(0, 0, canvas.width, canvas.height); + + const numFrames = frequencyData.length / fftSize; + if (config.pixelsPerFrame != null) { + let realWidth = Math.round(config.pixelsPerFrame * numFrames); + if (config.maxPixelWidth != null && realWidth > config.maxPixelWidth) { + realWidth = config.maxPixelWidth; + } + canvas.width = realWidth; + } + + const pixelWidth = canvas.width / numFrames; + const pixelHeight = canvas.height / fftDisplaySize; + for (let i = 0; i < numFrames; ++i) { + const x = pixelWidth * i; + const spectrum = frequencyData.subarray(i * fftSize, (i + 1) * fftSize); + if (spectrum[0] === -Infinity) { + break; + } + for (let j = 0; j < fftDisplaySize; ++j) { + const y = canvas.height - (j + 1) * pixelHeight; + + let colorValue = (spectrum[j] - min) / (max - min); + colorValue = Math.pow(colorValue, 3); + colorValue = Math.round(255 * colorValue); + const fillStyle = + `rgb(${colorValue},${255 - colorValue},${255 - colorValue})`; + context.fillStyle = fillStyle; + context.fillRect(x, y, pixelWidth, pixelHeight); + } + } + + if (config.markKeyFrame) { + const keyFrameIndex = config.keyFrameIndex == null ? + await SpeechCommands + .getMaxIntensityFrameIndex( + {data: frequencyData, frameSize: fftSize}) + .data() : + config.keyFrameIndex; + // Draw lines to mark the maximum-intensity frame. + context.strokeStyle = 'black'; + context.beginPath(); + context.moveTo(pixelWidth * keyFrameIndex, 0); + context.lineTo(pixelWidth * keyFrameIndex, canvas.height * 0.1); + context.stroke(); + context.beginPath(); + context.moveTo(pixelWidth * keyFrameIndex, canvas.height * 0.9); + context.lineTo(pixelWidth * keyFrameIndex, canvas.height); + context.stroke(); + } +} + +/** + * Plot top-K predictions from a speech command recognizer. + * + * @param {HTMLCanvasElement} canvas The canvas to render the predictions in. + * @param {string[]} candidateWords Candidate word array. + * @param {Float32Array | number[]} probabilities Probability scores from the + * speech command recognizer. Must be of the same length as `candidateWords`. + * @param {number} timeToLiveMillis Optional time to live for the active label + * highlighting. If not provided, will the highlighting will live + * indefinitely till the next highlighting. + * @param {number} topK Top _ scores to render. + */ +export function plotPredictions( + canvas, candidateWords, probabilities, topK, timeToLiveMillis) { + if (topK != null) { + let wordsAndProbs = []; + for (let i = 0; i < candidateWords.length; ++i) { + wordsAndProbs.push([candidateWords[i], probabilities[i]]); + } + wordsAndProbs.sort((a, b) => (b[1] - a[1])); + wordsAndProbs = wordsAndProbs.slice(0, topK); + candidateWords = wordsAndProbs.map(item => item[0]); + probabilities = wordsAndProbs.map(item => item[1]); + + // Highlight the top word. + const topWord = wordsAndProbs[0][0]; + console.log( + `"${topWord}" (p=${wordsAndProbs[0][1].toFixed(6)}) @ ` + + new Date().toTimeString()); + for (const word in candidateWordSpans) { + if (word === topWord) { + candidateWordSpans[word].classList.add('candidate-word-active'); + if (timeToLiveMillis != null) { + setTimeout(() => { + if (candidateWordSpans[word]) { + candidateWordSpans[word].classList.remove( + 'candidate-word-active'); + } + }, timeToLiveMillis); + } + } else { + candidateWordSpans[word].classList.remove('candidate-word-active'); + } + } + } +} diff --git a/音频分类/speech-commands/demo/yarn.lock b/音频分类/speech-commands/demo/yarn.lock new file mode 100644 index 0000000..49688fd --- /dev/null +++ b/音频分类/speech-commands/demo/yarn.lock @@ -0,0 +1,6437 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.12", "@babel/compat-data@^7.13.8": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1" + integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== + +"@babel/core@^7.0.0-0", "@babel/core@^7.4.4": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.13.tgz#bc44c4a2be2288ec4ddf56b66fc718019c76ac29" + integrity sha512-1xEs9jZAyKIouOoCmpsgk/I26PoKyvzQ2ixdRpRzfbcp1fL+ozw7TUgdDgwonbTovqRaTfRh50IXuw4QrWO0GA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-compilation-targets" "^7.13.13" + "@babel/helper-module-transforms" "^7.13.12" + "@babel/helpers" "^7.13.10" + "@babel/parser" "^7.13.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.13" + "@babel/types" "^7.13.13" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.13.9", "@babel/generator@^7.4.4": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== + dependencies: + "@babel/types" "^7.13.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.10", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" + integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ== + dependencies: + "@babel/compat-data" "^7.13.12" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.13.0": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" + integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" + +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" + integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== + dependencies: + "@babel/types" "^7.13.0" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-hoist-variables@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" + integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== + dependencies: + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + +"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz#600e58350490828d82282631a1422268e982ba96" + integrity sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.12" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + +"@babel/helper-remap-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" + integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.13.0" + "@babel/types" "^7.13.0" + +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" + integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.12" + +"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helper-wrap-function@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" + integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + +"@babel/helpers@^7.13.10": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8" + integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + +"@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.13", "@babel/parser@^7.13.13", "@babel/parser@^7.4.4": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df" + integrity sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw== + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" + integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + +"@babel/plugin-proposal-async-generator-functions@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1" + integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-dynamic-import@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" + integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" + integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" + integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" + integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" + integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== + dependencies: + "@babel/compat-data" "^7.13.8" + "@babel/helper-compilation-targets" "^7.13.8" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.13.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" + integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" + integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" + integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-arrow-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" + integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-async-to-generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-classes@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" + integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" + integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-destructuring@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" + integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-flow-strip-types@^7.4.4": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3" + integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-flow" "^7.12.13" + +"@babel/plugin-transform-for-of@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" + integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-modules-amd@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" + integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== + dependencies: + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" + integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== + dependencies: + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.13.8": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" + integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== + dependencies: + "@babel/helper-hoist-variables" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" + integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== + dependencies: + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + +"@babel/plugin-transform-parameters@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz#1df5dfaf0f4b784b43e96da6f28d630e775f68b3" + integrity sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.13.12" + +"@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-runtime@^7.1.0": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz#a1e40d22e2bf570c591c9c7e5ab42d6bf1e419e1" + integrity sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.1.4" + babel-plugin-polyfill-corejs3 "^0.1.3" + babel-plugin-polyfill-regenerator "^0.1.2" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-spread@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" + integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-template-literals@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" + integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@^7.4.4": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.12.tgz#6dff470478290582ac282fb77780eadf32480237" + integrity sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA== + dependencies: + "@babel/compat-data" "^7.13.12" + "@babel/helper-compilation-targets" "^7.13.10" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.13.8" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-dynamic-import" "^7.13.8" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.13.8" + "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.13.8" + "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.0" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/plugin-transform-modules-systemjs" "^7.13.8" + "@babel/plugin-transform-modules-umd" "^7.13.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.13.12" + babel-plugin-polyfill-corejs2 "^0.1.4" + babel-plugin-polyfill-corejs3 "^0.1.3" + babel-plugin-polyfill-regenerator "^0.1.2" + core-js-compat "^3.9.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.4.4", "@babel/runtime@^7.8.4": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" + integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.13", "@babel/template@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.4.4": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d" + integrity sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.13" + "@babel/types" "^7.13.13" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.4.4": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.13.tgz#dcd8b815b38f537a3697ce84c8e3cc62197df96f" + integrity sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@iarna/toml@^2.2.0": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@parcel/fs@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-1.11.0.tgz#fb8a2be038c454ad46a50dc0554c1805f13535cd" + integrity sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA== + dependencies: + "@parcel/utils" "^1.11.0" + mkdirp "^0.5.1" + rimraf "^2.6.2" + +"@parcel/logger@^1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-1.11.1.tgz#c55b0744bcbe84ebc291155627f0ec406a23e2e6" + integrity sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA== + dependencies: + "@parcel/workers" "^1.11.0" + chalk "^2.1.0" + grapheme-breaker "^0.3.2" + ora "^2.1.0" + strip-ansi "^4.0.0" + +"@parcel/utils@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-1.11.0.tgz#539e08fff8af3b26eca11302be80b522674b51ea" + integrity sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ== + +"@parcel/watcher@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-1.12.1.tgz#b98b3df309fcab93451b5583fc38e40826696dad" + integrity sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA== + dependencies: + "@parcel/utils" "^1.11.0" + chokidar "^2.1.5" + +"@parcel/workers@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-1.11.0.tgz#7b8dcf992806f4ad2b6cecf629839c41c2336c59" + integrity sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ== + dependencies: + "@parcel/utils" "^1.11.0" + physical-cpu-count "^2.0.0" + +"@tensorflow-models/speech-commands@file:../dist": + version "0.0.0" + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +abab@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + dependencies: + acorn "^3.0.4" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^5.5.0: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.0.4: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + +ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-to-html@^0.6.4: + version "0.6.14" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" + integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA== + dependencies: + entities "^1.1.2" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.1.4: + version "0.1.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1" + integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA== + dependencies: + "@babel/compat-data" "^7.13.0" + "@babel/helper-define-polyfill-provider" "^0.1.5" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-regenerator@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f" + integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@~6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-es2017@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" + integrity sha1-WXvq37n38gi8/YoS6bKym4svFNE= + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.24.1" + +babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.15.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon-walk@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce" + integrity sha1-OxWl3btIKni0zpwByLoYFwLZ1s4= + dependencies: + babel-runtime "^6.11.6" + babel-types "^6.15.0" + lodash.clone "^4.5.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brfs@^1.2.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" + integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== + dependencies: + quote-stream "^1.0.1" + resolve "^1.1.5" + static-module "^2.2.0" + through2 "^2.0.0" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^2.1.2: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + +browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.14.5, browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30001181: + version "1.0.30001204" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa" + integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chokidar@^2.1.5: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + +clang-format@~1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.2.4.tgz#4bb4b0a98180428deb093cf20982e9fc1af20b6c" + integrity sha512-sw+nrGUp3hvmANd1qF8vZPuezSYQAiXgGBiEtkXTtJnnu6b00fCqkkDIsnRKrNgg4nv6NYZE92ejvOMIXZoejw== + dependencies: + async "^1.5.2" + glob "^7.0.0" + resolve "^1.1.6" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" + integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.6: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.11.0, commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.8.1, core-js-compat@^3.9.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" + integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-env@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" + integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ== + dependencies: + cross-spawn "^6.0.5" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.4, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.0.0, cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@0.3.x, cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +dat.gui@^0.7.1: + version "0.7.7" + resolved "https://registry.yarnpkg.com/dat.gui/-/dat.gui-0.7.7.tgz#7f96dbd21621a76385203659aebfa264ee6ae89b" + integrity sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw== + +data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +deasync@^0.1.14: + version "0.1.21" + resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.21.tgz#bb11eabd4466c0d8776f0d82deb8a6126460d30f" + integrity sha512-kUmM8Y+PZpMpQ+B4AuOW9k2Pfx/mSupJtxOsLzmnHY2WqZUYRFccFn2RhzPAqt3Xb+sorK/badW2D4zNzqZz5w== + dependencies: + bindings "^1.5.0" + node-addon-api "^1.7.1" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== + +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.649: + version "1.3.701" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz#5e796ed7ce88cd77bc7bf831cf311ef6b067c389" + integrity sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +entities@^1.1.1, entities@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.3.1: + version "7.7.4" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" + integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.2, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.11.0, escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@~1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-google@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.9.1.tgz#83353c3dba05f72bb123169a4094f4ff120391eb" + integrity sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA== + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-xml-parser@^3.19.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz#cb637ec3f3999f51406dd8ff0e6fc4d83e520d01" + integrity sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg== + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-port@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.0.1, globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +grapheme-breaker@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac" + integrity sha1-W55reMODJFLSuiuxy4MPlidkEKw= + dependencies: + brfs "^1.2.0" + unicode-trie "^0.3.1" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-tags@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98" + integrity sha1-x43mW1Zjqll5id0rerSSANfk25g= + +htmlnano@^0.2.2: + version "0.2.8" + resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.2.8.tgz#d9c22daa18c8ea7675a0bf07cc904793ccaeb56f" + integrity sha512-q5gbo4SIDAE5sfJ5V0UD6uu+n1dcO/Mpr0B6SlDlJBoV7xKPne4uG4UwrT8vUWjdjIPJl95TY8EDuEbBW2TG0A== + dependencies: + cssnano "^4.1.10" + posthtml "^0.13.4" + posthtml-render "^1.3.0" + purgecss "^2.3.0" + relateurl "^0.2.7" + srcset "^3.0.0" + svgo "^1.3.2" + terser "^4.8.0" + timsort "^0.3.0" + uncss "^0.17.3" + +htmlparser2@^3.9.2: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@^0.4.17: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^5.0.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-html@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464" + integrity sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ= + dependencies: + html-tags "^1.0.0" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@4.3.1, is-svg@^3.0.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-4.3.1.tgz#8c63ec8c67c8c7f0a8de0a71c8c7d58eccf4406b" + integrity sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA== + dependencies: + fast-xml-parser "^3.19.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-url@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.9.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +magic-string@^0.22.4: + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== + dependencies: + vlq "^0.2.2" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +merge-source-map@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= + dependencies: + source-map "^0.5.6" + +merge2@^1.2.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + dependencies: + mime-db "1.46.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^1.7.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-libs-browser@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.4.1: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-inspect@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" + integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== + +object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opn@^5.1.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ora@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" + integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== + dependencies: + chalk "^2.3.1" + cli-cursor "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parcel-bundler@~1.12.5: + version "1.12.5" + resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.5.tgz#91f7de1c1fbfe5111616d3211c749c85c4d8acf0" + integrity sha512-hpku8mW67U6PXQIenW6NBbphBOMb8XzW6B9r093DUhYj5GN2FUB/CXCiz5hKoPYUsusZ35BpProH8AUF9bh5IQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.4.4" + "@babel/generator" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/plugin-transform-flow-strip-types" "^7.4.4" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/preset-env" "^7.4.4" + "@babel/runtime" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + "@iarna/toml" "^2.2.0" + "@parcel/fs" "^1.11.0" + "@parcel/logger" "^1.11.1" + "@parcel/utils" "^1.11.0" + "@parcel/watcher" "^1.12.1" + "@parcel/workers" "^1.11.0" + ansi-to-html "^0.6.4" + babylon-walk "^1.0.2" + browserslist "^4.1.0" + chalk "^2.1.0" + clone "^2.1.1" + command-exists "^1.2.6" + commander "^2.11.0" + core-js "^2.6.5" + cross-spawn "^6.0.4" + css-modules-loader-core "^1.1.0" + cssnano "^4.0.0" + deasync "^0.1.14" + dotenv "^5.0.0" + dotenv-expand "^5.1.0" + envinfo "^7.3.1" + fast-glob "^2.2.2" + filesize "^3.6.0" + get-port "^3.2.0" + htmlnano "^0.2.2" + is-glob "^4.0.0" + is-url "^1.2.2" + js-yaml "^3.10.0" + json5 "^1.0.1" + micromatch "^3.0.4" + mkdirp "^0.5.1" + node-forge "^0.10.0" + node-libs-browser "^2.0.0" + opn "^5.1.0" + postcss "^7.0.11" + postcss-value-parser "^3.3.1" + posthtml "^0.11.2" + posthtml-parser "^0.4.0" + posthtml-render "^1.1.3" + resolve "^1.4.0" + semver "^5.4.1" + serialize-to-js "^3.0.0" + serve-static "^1.12.4" + source-map "0.6.1" + terser "^3.7.3" + v8-compile-cache "^2.0.0" + ws "^5.1.1" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +physical-cpu-count@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" + integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA= + +plotly.js-dist@^1.39.4: + version "1.58.4" + resolved "https://registry.yarnpkg.com/plotly.js-dist/-/plotly.js-dist-1.58.4.tgz#d57b73d27af57a0d6cd2cf9428a001962889cf5b" + integrity sha512-oXCTRJFN8FBsHZSQPYoM3LuJQchPUrf6sOXFC0EFdvcr5lmJmLcAsW74jDy9PkRpm3PB+A+2oY1hsUMmk2eZbw== + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.17, postcss@^7.0.27: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +posthtml-parser@^0.4.0, posthtml-parser@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1" + integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg== + dependencies: + htmlparser2 "^3.9.2" + +posthtml-parser@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.5.3.tgz#e95b92e57d98da50b443e116fcee39466cd9012e" + integrity sha512-uHosRn0y+1wbnlYKrqMjBPoo/kK5LPYImLtiETszNFYfFwAD3cQdD1R2E13Mh5icBxkHj+yKtlIHozCsmVWD/Q== + dependencies: + htmlparser2 "^3.9.2" + +posthtml-render@^1.1.3, posthtml-render@^1.1.5, posthtml-render@^1.2.3, posthtml-render@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.3.1.tgz#260f15bc43cdf7ea008bf0cc35253fb27e4d03fd" + integrity sha512-eSToKjNLu0FiF76SSGMHjOFXYzAc/CJqi677Sq6hYvcvFCBtD6de/W5l+0IYPf7ypscqAfjCttxvTdMJt5Gj8Q== + +posthtml@^0.11.2: + version "0.11.6" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.6.tgz#e349d51af7929d0683b9d8c3abd8166beecc90a8" + integrity sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw== + dependencies: + posthtml-parser "^0.4.1" + posthtml-render "^1.1.5" + +posthtml@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.13.4.tgz#ad81b3fa62b85f81ccdb5710f4ec375a4ed94934" + integrity sha512-i2oTo/+dwXGC6zaAQSF6WZEQSbEqu10hsvg01DWzGAfZmy31Iiy9ktPh9nnXDfZiYytjxTIvxoK4TI0uk4QWpw== + dependencies: + posthtml-parser "^0.5.0" + posthtml-render "^1.2.3" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +purgecss@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.3.0.tgz#5327587abf5795e6541517af8b190a6fb5488bb3" + integrity sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ== + dependencies: + commander "^5.0.0" + glob "^7.0.0" + postcss "7.0.32" + postcss-selector-parser "^6.0.2" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +quote-stream@^1.0.1, quote-stream@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= + dependencies: + buffer-equal "0.0.1" + minimist "^1.1.3" + through2 "^2.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.6.4: + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.5, resolve@^1.1.6, resolve@^1.14.2, resolve@^1.4.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-to-js@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-3.1.1.tgz#b3e77d0568ee4a60bfe66287f991e104d3a1a4ac" + integrity sha512-F+NGU0UHMBO4Q965tjw7rvieNVjlH6Lqi2emq/Lc9LUURYJbiCzmpi4Cy1OOjjVPtxu0c+NE85LU6968Wko5ZA== + +serve-static@^1.12.4: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.10, source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +srcset@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-3.0.0.tgz#8afd8b971362dfc129ae9c1a99b3897301ce6441" + integrity sha512-D59vF08Qzu/C4GAOXVgMTLfgryt5fyWo93FZyhEWANo0PokFz/iWdDe13mX3O5TRf6l8vMTqckAfR4zPiaH0yQ== + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-eval@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +static-module@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" + integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== + dependencies: + concat-stream "~1.6.0" + convert-source-map "^1.5.1" + duplexer2 "~0.1.4" + escodegen "~1.9.0" + falafel "^2.1.0" + has "^1.0.1" + magic-string "^0.22.4" + merge-source-map "1.0.4" + object-inspect "~1.4.0" + quote-stream "~1.0.2" + readable-stream "~2.3.3" + shallow-copy "~0.0.1" + static-eval "^2.0.0" + through2 "~2.0.3" + +stats.js@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d" + integrity sha1-scPcRtlEmLV4t/05hbgaznExzH0= + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0, svgo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +terser@^3.7.3: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +terser@^4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0, through2@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-inflate@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.5.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +uncss@^0.17.3: + version "0.17.3" + resolved "https://registry.yarnpkg.com/uncss/-/uncss-0.17.3.tgz#50fc1eb4ed573ffff763458d801cd86e4d69ea11" + integrity sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog== + dependencies: + commander "^2.20.0" + glob "^7.1.4" + is-absolute-url "^3.0.1" + is-html "^1.1.0" + jsdom "^14.1.0" + lodash "^4.17.15" + postcss "^7.0.17" + postcss-selector-parser "6.0.2" + request "^2.88.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unicode-trie@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" + integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU= + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + +ws@^5.1.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yalc@~1.0.0-pre.50: + version "1.0.0-pre.50" + resolved "https://registry.yarnpkg.com/yalc/-/yalc-1.0.0-pre.50.tgz#e654e5af5f739cf255eedad1d66ba05a17de78f9" + integrity sha512-HGFjFFUhXSpQcxyOwJQl3jhERMn7XBgSCCoJ1k3dDPMbH6n56onv6Cp6cDGMiTho8tLIF4x02/Kb4g6pHavzgA== + dependencies: + chalk "^4.1.0" + detect-indent "^6.0.0" + fs-extra "^8.0.1" + glob "^7.1.4" + ignore "^5.0.4" + ini "^2.0.0" + npm-packlist "^1.4.1" + yargs "^16.1.1" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" diff --git a/音频分类/speech-commands/package.json b/音频分类/speech-commands/package.json new file mode 100644 index 0000000..08c0fc3 --- /dev/null +++ b/音频分类/speech-commands/package.json @@ -0,0 +1,56 @@ +{ + "name": "@tensorflow-models/speech-commands", + "version": "0.5.4", + "description": "Speech-command recognizer in TensorFlow.js", + "main": "dist/index.js", + "unpkg": "dist/speech-commands.min.js", + "jsdelivr": "dist/speech-commands.min.js", + "jsnext:main": "dist/speech-commands.esm.js", + "module": "dist/speech-commands.esm.js", + "types": "dist/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/tensorflow/tfjs-models.git" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "^4.13.0", + "@tensorflow/tfjs-data": "^4.13.0", + "@tensorflow/tfjs-layers": "^4.13.0" + }, + "devDependencies": { + "@tensorflow/tfjs-core": "^4.13.0", + "@tensorflow/tfjs-data": "^4.13.0", + "@tensorflow/tfjs-layers": "^4.13.0", + "@tensorflow/tfjs-node": "^4.13.0", + "@types/jasmine": "~2.8.8", + "@types/rimraf": "^2.0.2", + "@types/tempfile": "^2.0.0", + "babel-core": "~6.26.0", + "babel-plugin-transform-runtime": "~6.23.0", + "clang-format": "^1.2.4", + "dct": "^0.0.3", + "jasmine": "^3.2.0", + "jasmine-core": "^3.2.1", + "kissfft-js": "^0.1.8", + "rimraf": "2.6.2", + "rollup": "~0.58.2", + "rollup-plugin-node-resolve": "~3.3.0", + "rollup-plugin-typescript2": "~0.13.0", + "rollup-plugin-uglify": "~3.0.0", + "tempfile": "2.0.0", + "ts-node": "~5.0.0", + "tslib": "1.8.0", + "tslint": "~5.18.0", + "tslint-no-circular-imports": "^0.6.1", + "typescript": "~3.5.3", + "yalc": "~1.0.0-pre.21" + }, + "scripts": { + "build": "tsc", + "lint": "tslint -p . -t verbose", + "publish-local": "yarn build && rollup -c && yalc push", + "build-npm": "yarn build && rollup -c", + "test": "ts-node --skip-ignore --project tsconfig.test.json run_tests.ts" + }, + "license": "Apache-2.0" +} diff --git a/音频分类/speech-commands/rollup.config.js b/音频分类/speech-commands/rollup.config.js new file mode 100644 index 0000000..9559d4a --- /dev/null +++ b/音频分类/speech-commands/rollup.config.js @@ -0,0 +1,77 @@ +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +import node from 'rollup-plugin-node-resolve'; +import typescript from 'rollup-plugin-typescript2'; +import uglify from 'rollup-plugin-uglify'; + +const PREAMBLE = `/** + * @license + * Copyright ${(new Date).getFullYear()} Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */`; + +function minify() { + return uglify({ output: { preamble: PREAMBLE } }); +} + +function config({ plugins = [], output = {} }) { + return { + input: 'src/index.ts', + plugins: [ + typescript({ tsconfigOverride: { compilerOptions: { module: 'ES2015' } } }), + node(), ...plugins + ], + output: { + banner: PREAMBLE, + globals: { + '@tensorflow/tfjs-core': 'tf', + '@tensorflow/tfjs-layers': 'tf', + '@tensorflow/tfjs-data': 'tf.data', + }, + ...output + }, + external: [ + '@tensorflow/tfjs-core', + '@tensorflow/tfjs-layers', + '@tensorflow/tfjs-data', + ] + }; +} + +const packageName = 'speechCommands'; +export default [ + config({output: {format: 'umd', name: packageName, file: 'dist/speech-commands.js'}}), + config({ + plugins: [minify()], + output: {format: 'umd', name: packageName, file: 'dist/speech-commands.min.js'} + }), + config({ + plugins: [minify()], + output: {format: 'es', file: 'dist/speech-commands.esm.js'} + }) +]; diff --git a/音频分类/speech-commands/run_tests.ts b/音频分类/speech-commands/run_tests.ts new file mode 100644 index 0000000..880d57a --- /dev/null +++ b/音频分类/speech-commands/run_tests.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as jasmine_util from '@tensorflow/tfjs-core/dist/jasmine_util'; +import {runTests} from '../test_util'; + +runTests(jasmine_util); diff --git a/音频分类/speech-commands/src/browser_fft_extractor.ts b/音频分类/speech-commands/src/browser_fft_extractor.ts new file mode 100644 index 0000000..37be9ae --- /dev/null +++ b/音频分类/speech-commands/src/browser_fft_extractor.ts @@ -0,0 +1,331 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Audio FFT Feature Extractor based on Browser-Native FFT. + */ + +import * as tf from '@tensorflow/tfjs-core'; + +import {getAudioContextConstructor, getAudioMediaStream} from './browser_fft_utils'; +import {FeatureExtractor, RecognizerParams} from './types'; + +export type SpectrogramCallback = (freqData: tf.Tensor, timeData?: tf.Tensor) => + Promise; + +/** + * Configurations for constructing BrowserFftFeatureExtractor. + */ +export interface BrowserFftFeatureExtractorConfig extends RecognizerParams { + /** + * Number of audio frames (i.e., frequency columns) per spectrogram. + */ + numFramesPerSpectrogram: number; + + /** + * Suppression period in milliseconds. + * + * How much time to rest (not call the spectrogramCallback) every time + * a word with probability score above threshold is recognized. + */ + suppressionTimeMillis: number; + + /** + * A callback that is invoked every time a full spectrogram becomes + * available. + * + * `x` is a single-example tf.Tensor instance that includes the batch + * dimension. + * The return value is assumed to be whether a flag for whether the + * suppression period should initiate, e.g., when a word is recognized. + */ + spectrogramCallback: SpectrogramCallback; + + /** + * Truncate each spectrogram column at how many frequency points. + * + * If `null` or `undefined`, will do no truncation. + */ + columnTruncateLength?: number; + + /** + * Overlap factor. Must be >=0 and <1. + * For example, if the model takes a frame length of 1000 ms, + * and if overlap factor is 0.4, there will be a 400ms + * overlap between two successive frames, i.e., frames + * will be taken every 600 ms. + */ + overlapFactor: number; + + /** + * Whether to collect the raw time-domain audio waveform in addition to the + * spectrogram. + * + * Default: `false`. + */ + includeRawAudio?: boolean; +} + +/** + * Audio feature extractor based on Browser-native FFT. + * + * Uses AudioContext and analyser node. + */ +export class BrowserFftFeatureExtractor implements FeatureExtractor { + // Number of frames (i.e., columns) per spectrogram used for classification. + readonly numFrames: number; + + // Audio sampling rate in Hz. + readonly sampleRateHz: number; + + // The FFT length for each spectrogram column. + readonly fftSize: number; + + // Truncation length for spectrogram columns. + readonly columnTruncateLength: number; + + // Overlapping factor: the ratio between the temporal spacing between + // consecutive spectrograms and the length of each individual spectrogram. + readonly overlapFactor: number; + readonly includeRawAudio: boolean; + + private readonly spectrogramCallback: SpectrogramCallback; + + private stream: MediaStream; + // tslint:disable-next-line:no-any + private audioContextConstructor: any; + private audioContext: AudioContext; + private analyser: AnalyserNode; + private tracker: Tracker; + private freqData: Float32Array; + private timeData: Float32Array; + private freqDataQueue: Float32Array[]; + private timeDataQueue: Float32Array[]; + // tslint:disable-next-line:no-any + private frameIntervalTask: any; + private frameDurationMillis: number; + + private suppressionTimeMillis: number; + + /** + * Constructor of BrowserFftFeatureExtractor. + * + * @param config Required configuration object. + */ + constructor(config: BrowserFftFeatureExtractorConfig) { + if (config == null) { + throw new Error( + `Required configuration object is missing for ` + + `BrowserFftFeatureExtractor constructor`); + } + + if (config.spectrogramCallback == null) { + throw new Error(`spectrogramCallback cannot be null or undefined`); + } + + if (!(config.numFramesPerSpectrogram > 0)) { + throw new Error( + `Invalid value in numFramesPerSpectrogram: ` + + `${config.numFramesPerSpectrogram}`); + } + + if (config.suppressionTimeMillis < 0) { + throw new Error( + `Expected suppressionTimeMillis to be >= 0, ` + + `but got ${config.suppressionTimeMillis}`); + } + this.suppressionTimeMillis = config.suppressionTimeMillis; + + this.spectrogramCallback = config.spectrogramCallback; + this.numFrames = config.numFramesPerSpectrogram; + this.sampleRateHz = config.sampleRateHz || 44100; + this.fftSize = config.fftSize || 1024; + this.frameDurationMillis = this.fftSize / this.sampleRateHz * 1e3; + this.columnTruncateLength = config.columnTruncateLength || this.fftSize; + this.overlapFactor = config.overlapFactor; + this.includeRawAudio = config.includeRawAudio; + + tf.util.assert( + this.overlapFactor >= 0 && this.overlapFactor < 1, + () => `Expected overlapFactor to be >= 0 and < 1, ` + + `but got ${this.overlapFactor}`); + + if (this.columnTruncateLength > this.fftSize) { + throw new Error( + `columnTruncateLength ${this.columnTruncateLength} exceeds ` + + `fftSize (${this.fftSize}).`); + } + + this.audioContextConstructor = getAudioContextConstructor(); + } + + async start(audioTrackConstraints?: MediaTrackConstraints): + Promise { + if (this.frameIntervalTask != null) { + throw new Error( + 'Cannot start already-started BrowserFftFeatureExtractor'); + } + + this.stream = await getAudioMediaStream(audioTrackConstraints); + this.audioContext = new this.audioContextConstructor( + {sampleRate: this.sampleRateHz}) as AudioContext; + + const streamSource = this.audioContext.createMediaStreamSource(this.stream); + this.analyser = this.audioContext.createAnalyser(); + this.analyser.fftSize = this.fftSize * 2; + this.analyser.smoothingTimeConstant = 0.0; + streamSource.connect(this.analyser); + // Reset the queue. + this.freqDataQueue = []; + this.freqData = new Float32Array(this.fftSize); + if (this.includeRawAudio) { + this.timeDataQueue = []; + this.timeData = new Float32Array(this.fftSize); + } + const period = + Math.max(1, Math.round(this.numFrames * (1 - this.overlapFactor))); + this.tracker = new Tracker( + period, + Math.round(this.suppressionTimeMillis / this.frameDurationMillis)); + this.frameIntervalTask = setInterval( + this.onAudioFrame.bind(this), this.fftSize / this.sampleRateHz * 1e3); + } + + private async onAudioFrame() { + this.analyser.getFloatFrequencyData(this.freqData); + if (this.freqData[0] === -Infinity) { + return; + } + + this.freqDataQueue.push(this.freqData.slice(0, this.columnTruncateLength)); + if (this.includeRawAudio) { + this.analyser.getFloatTimeDomainData(this.timeData); + this.timeDataQueue.push(this.timeData.slice()); + } + if (this.freqDataQueue.length > this.numFrames) { + // Drop the oldest frame (least recent). + this.freqDataQueue.shift(); + } + const shouldFire = this.tracker.tick(); + if (shouldFire) { + const freqData = flattenQueue(this.freqDataQueue); + const freqDataTensor = getInputTensorFromFrequencyData( + freqData, [1, this.numFrames, this.columnTruncateLength, 1]); + let timeDataTensor: tf.Tensor; + if (this.includeRawAudio) { + const timeData = flattenQueue(this.timeDataQueue); + timeDataTensor = getInputTensorFromFrequencyData( + timeData, [1, this.numFrames * this.fftSize]); + } + const shouldRest = + await this.spectrogramCallback(freqDataTensor, timeDataTensor); + if (shouldRest) { + this.tracker.suppress(); + } + tf.dispose([freqDataTensor, timeDataTensor]); + } + } + + async stop(): Promise { + if (this.frameIntervalTask == null) { + throw new Error( + 'Cannot stop because there is no ongoing streaming activity.'); + } + clearInterval(this.frameIntervalTask); + this.frameIntervalTask = null; + this.analyser.disconnect(); + this.audioContext.close(); + if (this.stream != null && this.stream.getTracks().length > 0) { + this.stream.getTracks()[0].stop(); + } + } + + setConfig(params: RecognizerParams) { + throw new Error( + 'setConfig() is not implemented for BrowserFftFeatureExtractor.'); + } + + getFeatures(): Float32Array[] { + throw new Error( + 'getFeatures() is not implemented for ' + + 'BrowserFftFeatureExtractor. Use the spectrogramCallback ' + + 'field of the constructor config instead.'); + } +} + +export function flattenQueue(queue: Float32Array[]): Float32Array { + const frameSize = queue[0].length; + const freqData = new Float32Array(queue.length * frameSize); + queue.forEach((data, i) => freqData.set(data, i * frameSize)); + return freqData; +} + +export function getInputTensorFromFrequencyData( + freqData: Float32Array, shape: number[]): tf.Tensor { + const vals = new Float32Array(tf.util.sizeFromShape(shape)); + // If the data is less than the output shape, the rest is padded with zeros. + vals.set(freqData, vals.length - freqData.length); + return tf.tensor(vals, shape); +} + +/** + * A class that manages the firing of events based on periods + * and suppression time. + */ +export class Tracker { + readonly period: number; + readonly suppressionTime: number; + + private counter: number; + private suppressionOnset: number; + + /** + * Constructor of Tracker. + * + * @param period The event-firing period, in number of frames. + * @param suppressionPeriod The suppression period, in number of frames. + */ + constructor(period: number, suppressionPeriod: number) { + this.period = period; + this.suppressionTime = suppressionPeriod == null ? 0 : suppressionPeriod; + this.counter = 0; + + tf.util.assert( + this.period > 0, + () => `Expected period to be positive, but got ${this.period}`); + } + + /** + * Mark a frame. + * + * @returns Whether the event should be fired at the current frame. + */ + tick(): boolean { + this.counter++; + const shouldFire = (this.counter % this.period === 0) && + (this.suppressionOnset == null || + this.counter - this.suppressionOnset > this.suppressionTime); + return shouldFire; + } + + /** + * Order the beginning of a supression period. + */ + suppress() { + this.suppressionOnset = this.counter; + } +} diff --git a/音频分类/speech-commands/src/browser_fft_extractor_test.ts b/音频分类/speech-commands/src/browser_fft_extractor_test.ts new file mode 100644 index 0000000..1a30046 --- /dev/null +++ b/音频分类/speech-commands/src/browser_fft_extractor_test.ts @@ -0,0 +1,327 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +// tslint:disable-next-line: no-imports-from-dist +import {describeWithFlags, NODE_ENVS} from '@tensorflow/tfjs-core/dist/jasmine_util'; +import {BrowserFftFeatureExtractor, flattenQueue, getInputTensorFromFrequencyData} from './browser_fft_extractor'; +import * as BrowserFftUtils from './browser_fft_utils'; +import {FakeAudioContext, FakeAudioMediaStream} from './browser_test_utils'; +import {expectTensorsClose} from './test_utils'; + +const testEnvs = NODE_ENVS; + +describeWithFlags('flattenQueue', testEnvs, () => { + it('3 frames, 2 values each', () => { + const queue = [[1, 1], [2, 2], [3, 3]].map(x => new Float32Array(x)); + expect(flattenQueue(queue)).toEqual(new Float32Array([1, 1, 2, 2, 3, 3])); + }); + + it('2 frames, 2 values each', () => { + const queue = [[1, 1], [2, 2]].map(x => new Float32Array(x)); + expect(flattenQueue(queue)).toEqual(new Float32Array([1, 1, 2, 2])); + }); + + it('1 frame, 2 values each', () => { + const queue = [[1, 1]].map(x => new Float32Array(x)); + expect(flattenQueue(queue)).toEqual(new Float32Array([1, 1])); + }); +}); + +describeWithFlags('getInputTensorFromFrequencyData', testEnvs, () => { + it('6 frames, 2 vals each', () => { + const freqData = new Float32Array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6]); + const numFrames = 6; + const fftSize = 2; + const tensor = + getInputTensorFromFrequencyData(freqData, [1, numFrames, fftSize, 1]); + expectTensorsClose(tensor, tf.tensor4d(freqData, [1, 6, 2, 1])); + }); +}); + +describeWithFlags('BrowserFftFeatureExtractor', testEnvs, () => { + function setUpFakes() { + spyOn(BrowserFftUtils, 'getAudioContextConstructor') + .and.callFake(() => FakeAudioContext.createInstance); + spyOn(BrowserFftUtils, 'getAudioMediaStream') + .and.callFake(() => new FakeAudioMediaStream()); + } + + it('constructor', () => { + setUpFakes(); + + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => false, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + suppressionTimeMillis: 1000, + overlapFactor: 0 + }); + + expect(extractor.fftSize).toEqual(1024); + expect(extractor.numFrames).toEqual(43); + expect(extractor.columnTruncateLength).toEqual(225); + expect(extractor.overlapFactor).toBeCloseTo(0); + }); + + it('constructor errors due to null config', () => { + expect(() => new BrowserFftFeatureExtractor(null)) + .toThrowError(/Required configuration object is missing/); + }); + + it('constructor errors due to missing spectrogramCallback', () => { + expect(() => new BrowserFftFeatureExtractor({ + spectrogramCallback: null, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + suppressionTimeMillis: 1000, + overlapFactor: 0 + })) + .toThrowError(/spectrogramCallback cannot be null or undefined/); + }); + + it('constructor errors due to invalid numFramesPerSpectrogram', () => { + expect(() => new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => false, + numFramesPerSpectrogram: -2, + columnTruncateLength: 225, + overlapFactor: 0, + suppressionTimeMillis: 1000 + })) + .toThrowError(/Invalid value in numFramesPerSpectrogram: -2/); + }); + + it('constructor errors due to negative overlapFactor', () => { + expect(() => new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => false, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + overlapFactor: -0.1, + suppressionTimeMillis: 1000 + })) + .toThrowError(/Expected overlapFactor/); + }); + + it('constructor errors due to columnTruncateLength too large', () => { + expect(() => new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => false, + numFramesPerSpectrogram: 43, + columnTruncateLength: 1600, // > 1024 and leads to Error. + overlapFactor: 0, + suppressionTimeMillis: 1000 + })) + .toThrowError(/columnTruncateLength .* exceeds fftSize/); + }); + + it('constructor errors due to negative suppressionTimeMillis', () => { + expect(() => new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => false, + numFramesPerSpectrogram: 43, + columnTruncateLength: 1600, + overlapFactor: 0, + suppressionTimeMillis: -1000 // <0 and leads to Error. + })) + .toThrowError(/Expected suppressionTimeMillis to be >= 0/); + }); + + it('start and stop: overlapFactor = 0', done => { + setUpFakes(); + const timeDelta = 50; + const spectrogramDurationMillis = 1024 / 44100 * 43 * 1e3 - timeDelta; + const numCallbacksToComplete = 3; + let numCallbacksCompleted = 0; + const tensorCounts: number[] = []; + const callbackTimestamps: number[] = []; + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => { + callbackTimestamps.push(tf.util.now()); + if (callbackTimestamps.length > 1) { + expect( + callbackTimestamps[callbackTimestamps.length - 1] - + callbackTimestamps[callbackTimestamps.length - 2]) + .toBeGreaterThanOrEqual(spectrogramDurationMillis); + } + + expect(x.shape).toEqual([1, 43, 225, 1]); + + tensorCounts.push(tf.memory().numTensors); + if (tensorCounts.length > 1) { + // Assert no memory leak. + expect(tensorCounts[tensorCounts.length - 1]) + .toEqual(tensorCounts[tensorCounts.length - 2]); + } + + if (++numCallbacksCompleted >= numCallbacksToComplete) { + await extractor.stop(); + done(); + } + return false; + }, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + overlapFactor: 0, + suppressionTimeMillis: 0 + }); + extractor.start(); + }); + + it('start and stop: correct rotating buffer size', done => { + setUpFakes(); + + const numFramesPerSpectrogram = 43; + const columnTruncateLength = 225; + const numCallbacksToComplete = 3; + let numCallbacksCompleted = 0; + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => { + const xData = await x.data(); + // Verify the correctness of the spectrogram data. + for (let i = 0; i < xData.length; ++i) { + const segment = Math.floor(i / columnTruncateLength); + const expected = segment * 1024 + (i % columnTruncateLength) + + 1024 * numFramesPerSpectrogram * numCallbacksCompleted; + expect(xData[i]).toEqual(expected); + } + if (++numCallbacksCompleted >= numCallbacksToComplete) { + await extractor.stop(); + done(); + } + return false; + }, + numFramesPerSpectrogram, + columnTruncateLength, + overlapFactor: 0, + suppressionTimeMillis: 0 + }); + extractor.start(); + }); + + it('start and stop: overlapFactor = 0.5', done => { + setUpFakes(); + + const numCallbacksToComplete = 5; + let numCallbacksCompleted = 0; + const spectrogramTensors: tf.Tensor[] = []; + const callbackTimestamps: number[] = []; + const spectrogramDurationMillis = 1024 / 44100 * 43 * 1e3; + const numFramesPerSpectrogram = 43; + const columnTruncateLength = 225; + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => { + callbackTimestamps.push(tf.util.now()); + if (callbackTimestamps.length > 1) { + expect( + callbackTimestamps[callbackTimestamps.length - 1] - + callbackTimestamps[callbackTimestamps.length - 2]) + .toBeGreaterThanOrEqual(spectrogramDurationMillis * 0.5); + // Verify the content of the spectrogram data. + const xData = await x.data(); + expect(xData[xData.length - 1]) + .toEqual(callbackTimestamps.length * 22 * 1024 - 800); + } + expect(x.shape).toEqual([1, 43, 225, 1]); + spectrogramTensors.push(tf.clone(x)); + + if (++numCallbacksCompleted >= numCallbacksToComplete) { + await extractor.stop(); + done(); + } + return false; + }, + numFramesPerSpectrogram, + columnTruncateLength, + overlapFactor: 0.5, + suppressionTimeMillis: 0 + }); + extractor.start(); + }); + + it('start and stop: the first frame is captured', done => { + setUpFakes(); + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => { + expect(x.shape).toEqual([1, 43, 225, 1]); + + const xData = x.dataSync(); + // Verify that the first frame is not all zero or any constant value + // We don't compare the values against zero directly, because the + // spectrogram data is normalized here. The assertions below are also + // based on the fact that the fake audio context outputs linearly + // increasing sample values. + expect(xData[1]).toBeGreaterThan(xData[0]); + expect(xData[2]).toBeGreaterThan(xData[1]); + + await extractor.stop(); + done(); + return false; + }, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + overlapFactor: 0, + suppressionTimeMillis: 0 + }); + extractor.start(); + }); + + it('start and stop: suppressionTimeMillis = 1000', done => { + setUpFakes(); + + const numCallbacksToComplete = 2; + const suppressionTimeMillis = 1500; + let numCallbacksCompleted = 0; + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => { + if (++numCallbacksCompleted >= numCallbacksToComplete) { + const tEnd = tf.util.now(); + // Due to the suppression time, the time elapsed between the two + // consecutive callbacks should be longer than it. + expect(tEnd - tBegin).toBeGreaterThanOrEqual(suppressionTimeMillis); + await extractor.stop(); + done(); + } + return true; // Returning true causes suppression. + }, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + overlapFactor: 0.25, + suppressionTimeMillis + }); + const tBegin = tf.util.now(); + extractor.start(); + }); + + it('stopping unstarted extractor leads to Error', async () => { + setUpFakes(); + + const extractor = new BrowserFftFeatureExtractor({ + spectrogramCallback: async (x: tf.Tensor) => false, + numFramesPerSpectrogram: 43, + columnTruncateLength: 225, + overlapFactor: 0, + suppressionTimeMillis: 1000 + }); + + let caughtError: Error; + try { + await extractor.stop(); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toMatch(/Cannot stop because there is no ongoing streaming activity/); + }); +}); diff --git a/音频分类/speech-commands/src/browser_fft_recognizer.ts b/音频分类/speech-commands/src/browser_fft_recognizer.ts new file mode 100644 index 0000000..c9c3298 --- /dev/null +++ b/音频分类/speech-commands/src/browser_fft_recognizer.ts @@ -0,0 +1,1431 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +import * as tfl from '@tensorflow/tfjs-layers'; +import * as tfd from '@tensorflow/tfjs-data'; + +import {BrowserFftFeatureExtractor, SpectrogramCallback} from './browser_fft_extractor'; +import {loadMetadataJson, normalize, normalizeFloat32Array} from './browser_fft_utils'; +import {BACKGROUND_NOISE_TAG, Dataset} from './dataset'; +import {concatenateFloat32Arrays} from './generic_utils'; +import {balancedTrainValSplit} from './training_utils'; +import {AudioDataAugmentationOptions, EvaluateConfig, EvaluateResult, Example, ExampleCollectionOptions, RecognizeConfig, RecognizerCallback, RecognizerParams, ROCCurve, SpectrogramData, SpeechCommandRecognizer, SpeechCommandRecognizerMetadata, SpeechCommandRecognizerResult, StreamingRecognitionConfig, TransferLearnConfig, TransferSpeechCommandRecognizer} from './types'; +import {version} from './version'; + +export const UNKNOWN_TAG = '_unknown_'; + +// Key to the local-storage item that holds a map from model name to word +// list. +export const SAVED_MODEL_METADATA_KEY = + 'tfjs-speech-commands-saved-model-metadata'; +export const SAVE_PATH_PREFIX = 'indexeddb://tfjs-speech-commands-model/'; + +// Export a variable for injection during unit testing. +// tslint:disable-next-line:no-any +export let localStorageWrapper = { + localStorage: typeof window === 'undefined' ? null : window.localStorage +}; + +export function getMajorAndMinorVersion(version: string) { + const versionItems = version.split('.'); + return versionItems.slice(0, 2).join('.'); +} + +/** + * Default window hop ratio used for extracting multiple + * windows from a long spectrogram. + */ +const DEFAULT_WINDOW_HOP_RATIO = 0.25; + +/** + * Speech-Command Recognizer using browser-native (WebAudio) spectral featutres. + */ +export class BrowserFftSpeechCommandRecognizer implements + SpeechCommandRecognizer { + static readonly VALID_VOCABULARY_NAMES: string[] = ['18w', 'directional4w']; + static readonly DEFAULT_VOCABULARY_NAME = '18w'; + + readonly MODEL_URL_PREFIX = + `https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v${ + getMajorAndMinorVersion(version)}/browser_fft`; + + private readonly SAMPLE_RATE_HZ = 44100; + private readonly FFT_SIZE = 1024; + private readonly DEFAULT_SUPPRESSION_TIME_MILLIS = 0; + + model: tfl.LayersModel; + modelWithEmbeddingOutput: tfl.LayersModel; + readonly vocabulary: string; + readonly parameters: RecognizerParams; + protected words: string[]; + + protected streaming = false; + + protected nonBatchInputShape: [number, number, number]; + private elementsPerExample: number; + protected audioDataExtractor: BrowserFftFeatureExtractor; + + private transferRecognizers: + {[name: string]: TransferBrowserFftSpeechCommandRecognizer} = {}; + + private modelArtifactsOrURL: tf.io.ModelArtifacts|string; + private metadataOrURL: SpeechCommandRecognizerMetadata|string; + + // The second-last dense layer in the base model. + // To be used for unfreezing during fine-tuning. + protected secondLastBaseDenseLayer: tfl.layers.Layer; + + /** + * Constructor of BrowserFftSpeechCommandRecognizer. + * + * @param vocabulary An optional vocabulary specifier. Mutually exclusive + * with `modelURL` and `metadataURL`. + * @param modelArtifactsOrURL An optional, custom model URL pointing to a + * model.json, or modelArtifacts in the format of `tf.io.ModelArtifacts`. + * file. Supported schemes: http://, https://, and node.js-only: file://. + * Mutually exclusive with `vocabulary`. If provided, `metadatURL` + * most also be provided. + * @param metadataOrURL A custom metadata URL pointing to a metadata.json + * file. Or it can be a metadata JSON object itself. Must be provided + * together with `modelArtifactsOrURL`. + */ + constructor( + vocabulary?: string, modelArtifactsOrURL?: tf.io.ModelArtifacts|string, + metadataOrURL?: SpeechCommandRecognizerMetadata|string) { + // TODO(cais): Consolidate the fields into a single config object when + // upgrading to v1.0. + tf.util.assert( + modelArtifactsOrURL == null && metadataOrURL == null || + modelArtifactsOrURL != null && metadataOrURL != null, + () => `modelURL and metadataURL must be both provided or ` + + `both not provided.`); + if (modelArtifactsOrURL == null) { + if (vocabulary == null) { + vocabulary = BrowserFftSpeechCommandRecognizer.DEFAULT_VOCABULARY_NAME; + } else { + tf.util.assert( + BrowserFftSpeechCommandRecognizer.VALID_VOCABULARY_NAMES.indexOf( + vocabulary) !== -1, + () => `Invalid vocabulary name: '${vocabulary}'`); + } + this.vocabulary = vocabulary; + this.modelArtifactsOrURL = + `${this.MODEL_URL_PREFIX}/${this.vocabulary}/model.json`; + this.metadataOrURL = + `${this.MODEL_URL_PREFIX}/${this.vocabulary}/metadata.json`; + } else { + tf.util.assert( + vocabulary == null, + () => `vocabulary name must be null or undefined when modelURL is ` + + `provided`); + this.modelArtifactsOrURL = modelArtifactsOrURL; + this.metadataOrURL = metadataOrURL; + } + + this.parameters = { + sampleRateHz: this.SAMPLE_RATE_HZ, + fftSize: this.FFT_SIZE + }; + } + + /** + * Start streaming recognition. + * + * To stop the recognition, use `stopListening()`. + * + * Example: TODO(cais): Add exapmle code snippet. + * + * @param callback The callback invoked whenever a word is recognized + * with a probability score greater than `config.probabilityThreshold`. + * It has the signature: + * (result: SpeechCommandRecognizerResult) => Promise + * wherein result has the two fields: + * - scores: A Float32Array that contains the probability scores for all + * the words. + * - spectrogram: The spectrogram data, provided only if + * `config.includeSpectrogram` is `true`. + * @param config The configurations for the streaming recognition to + * be started. + * The `modelName` field of `config` specifies the model to be used for + * online recognition. If not specified, it defaults to the name of the + * base model ('base'), i.e., the pretrained model not from transfer + * learning. If the recognizer instance has one or more transfer-learning + * models ready (as a result of calls to `collectTransferExample` + * and `trainTransferModel`), you can let this call use that + * model for prediction by specifying the corresponding `modelName`. + * @throws Error, if streaming recognition is already started or + * if `config` contains invalid values. + */ + async listen( + callback: RecognizerCallback, + config?: StreamingRecognitionConfig): Promise { + if (this.streaming) { + throw new Error( + 'Cannot start streaming again when streaming is ongoing.'); + } + + await this.ensureModelLoaded(); + + if (config == null) { + config = {}; + } + let probabilityThreshold = + config.probabilityThreshold == null ? 0 : config.probabilityThreshold; + if (config.includeEmbedding) { + // Override probability threshold to 0 if includeEmbedding is true. + probabilityThreshold = 0; + } + tf.util.assert( + probabilityThreshold >= 0 && probabilityThreshold <= 1, + () => `Invalid probabilityThreshold value: ${probabilityThreshold}`); + let invokeCallbackOnNoiseAndUnknown = + config.invokeCallbackOnNoiseAndUnknown == null ? + false : + config.invokeCallbackOnNoiseAndUnknown; + if (config.includeEmbedding) { + // Override invokeCallbackOnNoiseAndUnknown threshold to true if + // includeEmbedding is true. + invokeCallbackOnNoiseAndUnknown = true; + } + + if (config.suppressionTimeMillis < 0) { + throw new Error( + `suppressionTimeMillis is expected to be >= 0, ` + + `but got ${config.suppressionTimeMillis}`); + } + + const overlapFactor = + config.overlapFactor == null ? 0.5 : config.overlapFactor; + tf.util.assert( + overlapFactor >= 0 && overlapFactor < 1, + () => `Expected overlapFactor to be >= 0 and < 1, but got ${ + overlapFactor}`); + + const spectrogramCallback: SpectrogramCallback = + async (x: tf.Tensor, timeData?: tf.Tensor) => { + const normalizedX = normalize(x); + let y: tf.Tensor; + let embedding: tf.Tensor; + if (config.includeEmbedding) { + await this.ensureModelWithEmbeddingOutputCreated(); + [y, embedding] = + this.modelWithEmbeddingOutput.predict(normalizedX) as tf.Tensor[]; + } else { + y = this.model.predict(normalizedX) as tf.Tensor; + } + + const scores = await y.data() as Float32Array; + const maxIndexTensor = y.argMax(-1); + const maxIndex = (await maxIndexTensor.data())[0]; + const maxScore = Math.max(...scores); + tf.dispose([y, maxIndexTensor, normalizedX]); + + if (maxScore < probabilityThreshold) { + return false; + } else { + let spectrogram: SpectrogramData = undefined; + if (config.includeSpectrogram) { + spectrogram = { + data: await x.data() as Float32Array, + frameSize: this.nonBatchInputShape[1], + }; + } + + let wordDetected = true; + if (!invokeCallbackOnNoiseAndUnknown) { + // Skip background noise and unknown tokens. + if (this.words[maxIndex] === BACKGROUND_NOISE_TAG || + this.words[maxIndex] === UNKNOWN_TAG) { + wordDetected = false; + } + } + if (wordDetected) { + callback({scores, spectrogram, embedding}); + } + // Trigger suppression only if the word is neither unknown or + // background noise. + return wordDetected; + } + }; + + const suppressionTimeMillis = config.suppressionTimeMillis == null ? + this.DEFAULT_SUPPRESSION_TIME_MILLIS : + config.suppressionTimeMillis; + this.audioDataExtractor = new BrowserFftFeatureExtractor({ + sampleRateHz: this.parameters.sampleRateHz, + numFramesPerSpectrogram: this.nonBatchInputShape[0], + columnTruncateLength: this.nonBatchInputShape[1], + suppressionTimeMillis, + spectrogramCallback, + overlapFactor + }); + + await this.audioDataExtractor.start(config.audioTrackConstraints); + + this.streaming = true; + } + + /** + * Load the underlying tf.LayersModel instance and associated metadata. + * + * If the model and the metadata are already loaded, do nothing. + */ + async ensureModelLoaded() { + if (this.model != null) { + return; + } + + await this.ensureMetadataLoaded(); + + let model: tfl.LayersModel; + if (typeof this.modelArtifactsOrURL === 'string') { + model = await tfl.loadLayersModel(this.modelArtifactsOrURL); + } else { + // this.modelArtifactsOrURL is an instance of `tf.io.ModelArtifacts`. + model = await tfl.loadLayersModel(tf.io.fromMemory( + this.modelArtifactsOrURL.modelTopology, + this.modelArtifactsOrURL.weightSpecs, + this.modelArtifactsOrURL.weightData)); + } + + // Check the validity of the model's input shape. + if (model.inputs.length !== 1) { + throw new Error( + `Expected model to have 1 input, but got a model with ` + + `${model.inputs.length} inputs`); + } + if (model.inputs[0].shape.length !== 4) { + throw new Error( + `Expected model to have an input shape of rank 4, ` + + `but got an input shape of rank ${model.inputs[0].shape.length}`); + } + if (model.inputs[0].shape[3] !== 1) { + throw new Error( + `Expected model to have an input shape with 1 as the last ` + + `dimension, but got input shape` + + `${JSON.stringify(model.inputs[0].shape[3])}}`); + } + // Check the consistency between the word labels and the model's output + // shape. + const outputShape = model.outputShape as tfl.Shape; + if (outputShape.length !== 2) { + throw new Error( + `Expected loaded model to have an output shape of rank 2,` + + `but received shape ${JSON.stringify(outputShape)}`); + } + if (outputShape[1] !== this.words.length) { + throw new Error( + `Mismatch between the last dimension of model's output shape ` + + `(${outputShape[1]}) and number of words ` + + `(${this.words.length}).`); + } + + this.model = model; + this.freezeModel(); + + this.nonBatchInputShape = + model.inputs[0].shape.slice(1) as [number, number, number]; + this.elementsPerExample = 1; + model.inputs[0].shape.slice(1).forEach( + dimSize => this.elementsPerExample *= dimSize); + this.warmUpModel(); + const frameDurationMillis = + this.parameters.fftSize / this.parameters.sampleRateHz * 1e3; + const numFrames = model.inputs[0].shape[1]; + this.parameters.spectrogramDurationMillis = numFrames * frameDurationMillis; + } + + /** + * Construct a two-output model that includes the following outputs: + * + * 1. The same softmax probability output as the original model's output + * 2. The embedding, i.e., activation from the second-last dense layer of + * the original model. + */ + protected async ensureModelWithEmbeddingOutputCreated() { + if (this.modelWithEmbeddingOutput != null) { + return; + } + await this.ensureModelLoaded(); + + // Find the second last dense layer of the original model. + let secondLastDenseLayer: tfl.layers.Layer; + for (let i = this.model.layers.length - 2; i >= 0; --i) { + if (this.model.layers[i].getClassName() === 'Dense') { + secondLastDenseLayer = this.model.layers[i]; + break; + } + } + if (secondLastDenseLayer == null) { + throw new Error( + 'Failed to find second last dense layer in the original model.'); + } + this.modelWithEmbeddingOutput = tfl.model({ + inputs: this.model.inputs, + outputs: [ + this.model.outputs[0], secondLastDenseLayer.output as tfl.SymbolicTensor + ] + }); + } + + private warmUpModel() { + tf.tidy(() => { + const x = tf.zeros([1].concat(this.nonBatchInputShape)); + for (let i = 0; i < 3; ++i) { + this.model.predict(x); + } + }); + } + + private async ensureMetadataLoaded() { + if (this.words != null) { + return; + } + + const metadataJSON = typeof this.metadataOrURL === 'string' ? + await loadMetadataJson(this.metadataOrURL) : + this.metadataOrURL; + + if (metadataJSON.wordLabels == null) { + // In some legacy formats, the field 'words', instead of 'wordLabels', + // was populated. This branch ensures backward compatibility with those + // formats. + // tslint:disable-next-line:no-any + const legacyWords = (metadataJSON as any)['words'] as string[]; + if (legacyWords == null) { + throw new Error( + 'Cannot find field "words" or "wordLabels" in metadata JSON file'); + } + this.words = legacyWords; + } else { + this.words = metadataJSON.wordLabels; + } + } + + /** + * Stop streaming recognition. + * + * @throws Error if there is not ongoing streaming recognition. + */ + async stopListening(): Promise { + if (!this.streaming) { + throw new Error('Cannot stop streaming when streaming is not ongoing.'); + } + await this.audioDataExtractor.stop(); + this.streaming = false; + } + + /** + * Check if streaming recognition is ongoing. + */ + isListening(): boolean { + return this.streaming; + } + + /** + * Get the array of word labels. + * + * @throws Error If this model is called before the model is loaded. + */ + wordLabels(): string[] { + return this.words; + } + + /** + * Get the parameters of this instance of BrowserFftSpeechCommandRecognizer. + * + * @returns Parameters of this instance. + */ + params(): RecognizerParams { + return this.parameters; + } + + /** + * Get the input shape of the underlying tf.LayersModel. + * + * @returns The input shape. + */ + modelInputShape(): tfl.Shape { + if (this.model == null) { + throw new Error( + 'Model has not been loaded yet. Load model by calling ' + + 'ensureModelLoaded(), recognize(), or listen().'); + } + return this.model.inputs[0].shape; + } + + /** + * Run offline (non-streaming) recognition on a spectrogram. + * + * @param input Spectrogram. Either a `tf.Tensor` of a `Float32Array`. + * - If a `tf.Tensor`, must be rank-4 and match the model's expected + * input shape in 2nd dimension (# of spectrogram columns), the 3rd + * dimension (# of frequency-domain points per column), and the 4th + * dimension (always 1). The 1st dimension can be 1, for single-example + * recogntion, or any value >1, for batched recognition. + * - If a `Float32Array`, must have a length divisible by the number + * of elements per spectrogram, i.e., + * (# of spectrogram columns) * (# of frequency-domain points per column). + * @param config Optional configuration object. + * @returns Result of the recognition, with the following field: + * scores: + * - A `Float32Array` if there is only one input exapmle. + * - An `Array` of `Float32Array`, if there are multiple input examples. + */ + async recognize(input?: tf.Tensor|Float32Array, config?: RecognizeConfig): + Promise { + if (config == null) { + config = {}; + } + + await this.ensureModelLoaded(); + + if (input == null) { + // If `input` is not provided, draw audio data from WebAudio and us it + // for recognition. + const spectrogramData = await this.recognizeOnline(); + input = spectrogramData.data; + } + + let numExamples: number; + let inputTensor: tf.Tensor; + let outTensor: tf.Tensor; + if (input instanceof tf.Tensor) { + // Check input shape. + this.checkInputTensorShape(input); + inputTensor = input; + numExamples = input.shape[0]; + } else { + if (input.length % this.elementsPerExample) { + throw new Error( + `The length of the input Float32Array ${input.length} ` + + `is not divisible by the number of tensor elements per ` + + `per example expected by the model ${this.elementsPerExample}.`); + } + + numExamples = input.length / this.elementsPerExample; + inputTensor = tf.tensor4d(input, [ + numExamples + ].concat(this.nonBatchInputShape) as [number, number, number, number]); + } + + const output: SpeechCommandRecognizerResult = {scores: null}; + if (config.includeEmbedding) { + // Optional inclusion of embedding (internal activation). + await this.ensureModelWithEmbeddingOutputCreated(); + const outAndEmbedding = + this.modelWithEmbeddingOutput.predict(inputTensor) as tf.Tensor[]; + outTensor = outAndEmbedding[0]; + output.embedding = outAndEmbedding[1]; + } else { + outTensor = this.model.predict(inputTensor) as tf.Tensor; + } + + if (numExamples === 1) { + output.scores = await outTensor.data() as Float32Array; + } else { + const unstacked = tf.unstack(outTensor); + const scorePromises = unstacked.map(item => item.data()); + output.scores = await Promise.all(scorePromises) as Float32Array[]; + tf.dispose(unstacked); + } + + if (config.includeSpectrogram) { + output.spectrogram = { + data: (input instanceof tf.Tensor ? await input.data() : input) as + Float32Array, + frameSize: this.nonBatchInputShape[1], + }; + } + + tf.dispose(outTensor); + return output; + } + + private async recognizeOnline(): Promise { + return new Promise((resolve, reject) => { + const spectrogramCallback: SpectrogramCallback = async (x: tf.Tensor) => { + const normalizedX = normalize(x); + await this.audioDataExtractor.stop(); + resolve({ + data: await normalizedX.data() as Float32Array, + frameSize: this.nonBatchInputShape[1], + }); + normalizedX.dispose(); + return false; + }; + this.audioDataExtractor = new BrowserFftFeatureExtractor({ + sampleRateHz: this.parameters.sampleRateHz, + numFramesPerSpectrogram: this.nonBatchInputShape[0], + columnTruncateLength: this.nonBatchInputShape[1], + suppressionTimeMillis: 0, + spectrogramCallback, + overlapFactor: 0 + }); + this.audioDataExtractor.start(); + }); + } + + createTransfer(name: string): TransferSpeechCommandRecognizer { + if (this.model == null) { + throw new Error( + 'Model has not been loaded yet. Load model by calling ' + + 'ensureModelLoaded(), recognizer(), or listen().'); + } + tf.util.assert( + name != null && typeof name === 'string' && name.length > 1, + () => `Expected the name for a transfer-learning recognized to be a ` + + `non-empty string, but got ${JSON.stringify(name)}`); + tf.util.assert( + this.transferRecognizers[name] == null, + () => `There is already a transfer-learning model named '${name}'`); + const transfer = new TransferBrowserFftSpeechCommandRecognizer( + name, this.parameters, this.model); + this.transferRecognizers[name] = transfer; + return transfer; + } + + protected freezeModel(): void { + for (const layer of this.model.layers) { + layer.trainable = false; + } + } + + private checkInputTensorShape(input: tf.Tensor) { + const expectedRank = this.model.inputs[0].shape.length; + if (input.shape.length !== expectedRank) { + throw new Error( + `Expected input Tensor to have rank ${expectedRank}, ` + + `but got rank ${input.shape.length} that differs `); + } + const nonBatchedShape = input.shape.slice(1); + const expectedNonBatchShape = this.model.inputs[0].shape.slice(1); + if (!tf.util.arraysEqual(nonBatchedShape, expectedNonBatchShape)) { + throw new Error( + `Expected input to have shape [null,${expectedNonBatchShape}], ` + + `but got shape [null,${nonBatchedShape}]`); + } + } +} + +/** + * A subclass of BrowserFftSpeechCommandRecognizer: Transfer-learned model. + */ +class TransferBrowserFftSpeechCommandRecognizer extends + BrowserFftSpeechCommandRecognizer implements + TransferSpeechCommandRecognizer { + private dataset: Dataset; + private transferHead: tfl.Sequential; + + /** + * Constructor of TransferBrowserFftSpeechCommandRecognizer. + * + * @param name Name of the transfer-learned recognizer. Must be a non-empty + * string. + * @param parameters Parameters from the base recognizer. + * @param baseModel Model from the base recognizer. + */ + constructor( + readonly name: string, readonly parameters: RecognizerParams, + readonly baseModel: tfl.LayersModel) { + super(); + tf.util.assert( + name != null && typeof name === 'string' && name.length > 0, + () => `The name of a transfer model must be a non-empty string, ` + + `but got ${JSON.stringify(name)}`); + this.nonBatchInputShape = + this.baseModel.inputs[0].shape.slice(1) as [number, number, number]; + this.words = null; + this.dataset = new Dataset(); + } + + /** + * Collect an example for transfer learning via WebAudio. + * + * @param {string} word Name of the word. Must not overlap with any of the + * words the base model is trained to recognize. + * @param {ExampleCollectionOptions} + * @returns {SpectrogramData} The spectrogram of the acquired the example. + * @throws Error, if word belongs to the set of words the base model is + * trained to recognize. + */ + async collectExample(word: string, options?: ExampleCollectionOptions): + Promise { + tf.util.assert( + !this.streaming, + () => 'Cannot start collection of transfer-learning example because ' + + 'a streaming recognition or transfer-learning example collection ' + + 'is ongoing'); + tf.util.assert( + word != null && typeof word === 'string' && word.length > 0, + () => `Must provide a non-empty string when collecting transfer-` + + `learning example`); + + if (options == null) { + options = {}; + } + if (options.durationMultiplier != null && options.durationSec != null) { + throw new Error( + `durationMultiplier and durationSec are mutually exclusive, ` + + `but are both specified.`); + } + + let numFramesPerSpectrogram: number; + if (options.durationSec != null) { + tf.util.assert( + options.durationSec > 0, + () => + `Expected durationSec to be > 0, but got ${options.durationSec}`); + const frameDurationSec = + this.parameters.fftSize / this.parameters.sampleRateHz; + numFramesPerSpectrogram = + Math.ceil(options.durationSec / frameDurationSec); + } else if (options.durationMultiplier != null) { + tf.util.assert( + options.durationMultiplier >= 1, + () => `Expected duration multiplier to be >= 1, ` + + `but got ${options.durationMultiplier}`); + numFramesPerSpectrogram = + Math.round(this.nonBatchInputShape[0] * options.durationMultiplier); + } else { + numFramesPerSpectrogram = this.nonBatchInputShape[0]; + } + + if (options.snippetDurationSec != null) { + tf.util.assert( + options.snippetDurationSec > 0, + () => `snippetDurationSec is expected to be > 0, but got ` + + `${options.snippetDurationSec}`); + tf.util.assert( + options.onSnippet != null, + () => `onSnippet must be provided if snippetDurationSec ` + + `is provided.`); + } + if (options.onSnippet != null) { + tf.util.assert( + options.snippetDurationSec != null, + () => `snippetDurationSec must be provided if onSnippet ` + + `is provided.`); + } + const frameDurationSec = + this.parameters.fftSize / this.parameters.sampleRateHz; + const totalDurationSec = frameDurationSec * numFramesPerSpectrogram; + + this.streaming = true; + return new Promise(resolve => { + const stepFactor = options.snippetDurationSec == null ? + 1 : + options.snippetDurationSec / totalDurationSec; + const overlapFactor = 1 - stepFactor; + const callbackCountTarget = Math.round(1 / stepFactor); + let callbackCount = 0; + let lastIndex = -1; + const spectrogramSnippets: Float32Array[] = []; + + const spectrogramCallback: SpectrogramCallback = + async (freqData: tf.Tensor, timeData?: tf.Tensor) => { + // TODO(cais): can we consolidate the logic in the two branches? + if (options.onSnippet == null) { + const normalizedX = normalize(freqData); + this.dataset.addExample({ + label: word, + spectrogram: { + data: await normalizedX.data() as Float32Array, + frameSize: this.nonBatchInputShape[1], + }, + rawAudio: options.includeRawAudio ? { + data: await timeData.data() as Float32Array, + sampleRateHz: this.audioDataExtractor.sampleRateHz + } : + undefined + }); + normalizedX.dispose(); + await this.audioDataExtractor.stop(); + this.streaming = false; + this.collateTransferWords(); + resolve({ + data: await freqData.data() as Float32Array, + frameSize: this.nonBatchInputShape[1], + }); + } else { + const data = await freqData.data() as Float32Array; + if (lastIndex === -1) { + lastIndex = data.length; + } + let i = lastIndex - 1; + while (data[i] !== 0 && i >= 0) { + i--; + } + const increment = lastIndex - i - 1; + lastIndex = i + 1; + const snippetData = data.slice(data.length - increment, data.length); + spectrogramSnippets.push(snippetData); + + if (options.onSnippet != null) { + options.onSnippet( + {data: snippetData, frameSize: this.nonBatchInputShape[1]}); + } + + if (callbackCount++ === callbackCountTarget) { + await this.audioDataExtractor.stop(); + this.streaming = false; + this.collateTransferWords(); + + const normalized = normalizeFloat32Array( + concatenateFloat32Arrays(spectrogramSnippets)); + const finalSpectrogram: SpectrogramData = { + data: normalized, + frameSize: this.nonBatchInputShape[1] + }; + this.dataset.addExample({ + label: word, + spectrogram: finalSpectrogram, + rawAudio: options.includeRawAudio ? { + data: await timeData.data() as Float32Array, + sampleRateHz: this.audioDataExtractor.sampleRateHz + } : + undefined + }); + // TODO(cais): Fix 1-tensor memory leak. + resolve(finalSpectrogram); + } + } + return false; + }; + this.audioDataExtractor = new BrowserFftFeatureExtractor({ + sampleRateHz: this.parameters.sampleRateHz, + numFramesPerSpectrogram, + columnTruncateLength: this.nonBatchInputShape[1], + suppressionTimeMillis: 0, + spectrogramCallback, + overlapFactor, + includeRawAudio: options.includeRawAudio + }); + this.audioDataExtractor.start(options.audioTrackConstraints); + }); + } + + /** + * Clear all transfer learning examples collected so far. + */ + clearExamples(): void { + tf.util.assert( + this.words != null && this.words.length > 0 && !this.dataset.empty(), + () => + `No transfer learning examples exist for model name ${this.name}`); + this.dataset.clear(); + this.words = null; + } + + /** + * Get counts of the word examples that have been collected for a + * transfer-learning model. + * + * @returns {{[word: string]: number}} A map from word name to number of + * examples collected for that word so far. + */ + countExamples(): {[word: string]: number} { + if (this.dataset.empty()) { + throw new Error( + `No examples have been collected for transfer-learning model ` + + `named '${this.name}' yet.`); + } + return this.dataset.getExampleCounts(); + } + + /** + * Get examples currently held by the transfer-learning recognizer. + * + * @param label Label requested. + * @returns An array of `Example`s, along with their UIDs. + */ + getExamples(label: string): Array<{uid: string, example: Example}> { + return this.dataset.getExamples(label); + } + + /** Set the key frame index of a given example. */ + setExampleKeyFrameIndex(uid: string, keyFrameIndex: number): void { + this.dataset.setExampleKeyFrameIndex(uid, keyFrameIndex); + } + + /** + * Remove an example from the current dataset. + * + * @param uid The UID of the example to remove. + */ + removeExample(uid: string): void { + this.dataset.removeExample(uid); + this.collateTransferWords(); + } + + /** + * Check whether the underlying dataset is empty. + * + * @returns A boolean indicating whether the underlying dataset is empty. + */ + isDatasetEmpty(): boolean { + return this.dataset.empty(); + } + + /** + * Load an array of serialized examples. + * + * @param serialized The examples in their serialized format. + * @param clearExisting Whether to clear the existing examples while + * performing the loading (default: false). + */ + loadExamples(serialized: ArrayBuffer, clearExisting = false): void { + const incomingDataset = new Dataset(serialized); + if (clearExisting) { + this.clearExamples(); + } + + const incomingVocab = incomingDataset.getVocabulary(); + for (const label of incomingVocab) { + const examples = incomingDataset.getExamples(label); + for (const example of examples) { + this.dataset.addExample(example.example); + } + } + + this.collateTransferWords(); + } + + /** + * Serialize the existing examples. + * + * @param wordLabels Optional word label(s) to serialize. If specified, only + * the examples with labels matching the argument will be serialized. If + * any specified word label does not exist in the vocabulary of this + * transfer recognizer, an Error will be thrown. + * @returns An `ArrayBuffer` object amenable to transmission and storage. + */ + serializeExamples(wordLabels?: string|string[]): ArrayBuffer { + return this.dataset.serialize(wordLabels); + } + + /** + * Collect the vocabulary of this transfer-learned recognizer. + * + * The words are put in an alphabetically sorted order. + */ + private collateTransferWords() { + this.words = this.dataset.getVocabulary(); + } + + /** + * Collect the transfer-learning data as `tf.Tensor`s. + * + * Used for training and evaluation when the amount of data is relatively + * small. + * + * @param windowHopRatio Ratio betwen hop length in number of frames and the + * number of frames in a long spectrogram. Used during extraction + * of multiple windows from the long spectrogram. + * @returns xs: The feature tensors (xs), a 4D tf.Tensor. + * ys: The target tensors (ys), one-hot encoding, a 2D tf.Tensor. + */ + private collectTransferDataAsTensors( + windowHopRatio?: number, + augmentationOptions?: AudioDataAugmentationOptions): + {xs: tf.Tensor, ys: tf.Tensor} { + const numFrames = this.nonBatchInputShape[0]; + windowHopRatio = windowHopRatio || DEFAULT_WINDOW_HOP_RATIO; + const hopFrames = Math.round(windowHopRatio * numFrames); + const out = this.dataset.getData( + null, {numFrames, hopFrames, ...augmentationOptions}) as + {xs: tf.Tensor4D, ys?: tf.Tensor2D}; + return {xs: out.xs, ys: out.ys as tf.Tensor}; + } + + /** + * Same as `collectTransferDataAsTensors`, but returns `tf.data.Dataset`s. + * + * Used for training and evaluation when the amount of data is large. + * + * @param windowHopRatio Ratio betwen hop length in number of frames and the + * number of frames in a long spectrogram. Used during extraction + * of multiple windows from the long spectrogram. + * @param validationSplit The validation split to be used for splitting + * the raw data between the `tf.data.Dataset` objects for training and + * validation. + * @param batchSize Batch size used for the `tf.data.Dataset.batch()` call + * during the creation of the dataset objects. + * @return Two `tf.data.Dataset` objects, one for training and one for + * validation. Each of the objects may be directly fed into + * `this.model.fitDataset`. + */ + private collectTransferDataAsTfDataset( + windowHopRatio?: number, validationSplit = 0.15, batchSize = 32, + augmentationOptions?: AudioDataAugmentationOptions): + [tfd.Dataset<{}>, tfd.Dataset<{}>] { + const numFrames = this.nonBatchInputShape[0]; + windowHopRatio = windowHopRatio || DEFAULT_WINDOW_HOP_RATIO; + const hopFrames = Math.round(windowHopRatio * numFrames); + return this.dataset.getData(null, { + numFrames, + hopFrames, + getDataset: true, + datasetBatchSize: batchSize, + datasetValidationSplit: validationSplit, + ...augmentationOptions + }) as [tfd.Dataset<{}>, tfd.Dataset<{}>]; + // TODO(cais): See if we can tighten the typing. + } + + /** + * Train the transfer-learning model. + * + * The last dense layer of the base model is replaced with new softmax dense + * layer. + * + * It is assume that at least one category of data has been collected (using + * multiple calls to the `collectTransferExample` method). + * + * @param config {TransferLearnConfig} Optional configurations fot the + * training of the transfer-learning model. + * @returns {tf.History} A history object with the loss and accuracy values + * from the training of the transfer-learning model. + * @throws Error, if `modelName` is invalid or if not sufficient training + * examples have been collected yet. + */ + async train(config?: TransferLearnConfig): + Promise { + tf.util.assert( + this.words != null && this.words.length > 0, + () => + `Cannot train transfer-learning model '${this.name}' because no ` + + `transfer learning example has been collected.`); + tf.util.assert( + this.words.length > 1, + () => `Cannot train transfer-learning model '${ + this.name}' because only ` + + `1 word label ('${JSON.stringify(this.words)}') ` + + `has been collected for transfer learning. Requires at least 2.`); + if (config.fineTuningEpochs != null) { + tf.util.assert( + config.fineTuningEpochs >= 0 && + Number.isInteger(config.fineTuningEpochs), + () => `If specified, fineTuningEpochs must be a non-negative ` + + `integer, but received ${config.fineTuningEpochs}`); + } + + if (config == null) { + config = {}; + } + + if (this.model == null) { + this.createTransferModelFromBaseModel(); + } + + // This layer needs to be frozen for the initial phase of the + // transfer learning. During subsequent fine-tuning (if any), it will + // be unfrozen. + this.secondLastBaseDenseLayer.trainable = false; + + // Compile model for training. + this.model.compile({ + loss: 'categoricalCrossentropy', + optimizer: config.optimizer || 'sgd', + metrics: ['acc'] + }); + + // Use `tf.data.Dataset` objects for training of the total duration of + // the recordings exceeds 60 seconds. Otherwise, use `tf.Tensor` objects. + const datasetDurationMillisThreshold = + config.fitDatasetDurationMillisThreshold == null ? + 60e3 : + config.fitDatasetDurationMillisThreshold; + if (this.dataset.durationMillis() > datasetDurationMillisThreshold) { + console.log( + `Detected large dataset: total duration = ` + + `${this.dataset.durationMillis()} ms > ` + + `${datasetDurationMillisThreshold} ms. ` + + `Training transfer model using fitDataset() instead of fit()`); + return this.trainOnDataset(config); + } else { + return this.trainOnTensors(config); + } + } + + /** Helper function for training on tf.data.Dataset objects. */ + private async trainOnDataset(config?: TransferLearnConfig): + Promise { + tf.util.assert(config.epochs > 0, () => `Invalid config.epochs`); + // Train transfer-learning model using fitDataset + + const batchSize = config.batchSize == null ? 32 : config.batchSize; + const windowHopRatio = config.windowHopRatio || DEFAULT_WINDOW_HOP_RATIO; + const [trainDataset, valDataset] = this.collectTransferDataAsTfDataset( + windowHopRatio, config.validationSplit, batchSize, + {augmentByMixingNoiseRatio: config.augmentByMixingNoiseRatio}); + const t0 = tf.util.now(); + const history = await this.model.fitDataset(trainDataset, { + epochs: config.epochs, + validationData: config.validationSplit > 0 ? valDataset : null, + callbacks: config.callback == null ? null : [config.callback] + }); + console.log(`fitDataset() took ${(tf.util.now() - t0).toFixed(2)} ms`); + + if (config.fineTuningEpochs != null && config.fineTuningEpochs > 0) { + // Perform fine-tuning. + const t0 = tf.util.now(); + const fineTuningHistory = await this.fineTuningUsingTfDatasets( + config, trainDataset, valDataset); + console.log( + `fitDataset() (fine-tuning) took ` + + `${(tf.util.now() - t0).toFixed(2)} ms`); + return [history, fineTuningHistory]; + } else { + return history; + } + } + + /** Helper function for training on tf.Tensor objects. */ + private async trainOnTensors(config?: TransferLearnConfig): + Promise { + // Prepare the data. + const windowHopRatio = config.windowHopRatio || DEFAULT_WINDOW_HOP_RATIO; + const {xs, ys} = this.collectTransferDataAsTensors( + windowHopRatio, + {augmentByMixingNoiseRatio: config.augmentByMixingNoiseRatio}); + console.log( + `Training data: xs.shape = ${xs.shape}, ys.shape = ${ys.shape}`); + + let trainXs: tf.Tensor; + let trainYs: tf.Tensor; + let valData: [tf.Tensor, tf.Tensor]; + try { + // TODO(cais): The balanced split may need to be pushed down to the + // level of the Dataset class to avoid leaks between train and val + // splits. + if (config.validationSplit != null) { + const splits = balancedTrainValSplit(xs, ys, config.validationSplit); + trainXs = splits.trainXs; + trainYs = splits.trainYs; + valData = [splits.valXs, splits.valYs]; + } else { + trainXs = xs; + trainYs = ys; + } + + const history = await this.model.fit(trainXs, trainYs, { + epochs: config.epochs == null ? 20 : config.epochs, + validationData: valData, + batchSize: config.batchSize, + callbacks: config.callback == null ? null : [config.callback] + }); + + if (config.fineTuningEpochs != null && config.fineTuningEpochs > 0) { + // Fine tuning: unfreeze the second-last dense layer of the base + // model. + const fineTuningHistory = await this.fineTuningUsingTensors( + config, trainXs, trainYs, valData); + return [history, fineTuningHistory]; + } else { + return history; + } + } finally { + tf.dispose([xs, ys, trainXs, trainYs, valData]); + } + } + + private async fineTuningUsingTfDatasets( + config: TransferLearnConfig, trainDataset: tfd.Dataset<{}>, + valDataset: tfd.Dataset<{}>): Promise { + const originalTrainableValue = this.secondLastBaseDenseLayer.trainable; + this.secondLastBaseDenseLayer.trainable = true; + + // Recompile model after unfreezing layer. + const fineTuningOptimizer: string|tf.Optimizer = + config.fineTuningOptimizer == null ? 'sgd' : config.fineTuningOptimizer; + this.model.compile({ + loss: 'categoricalCrossentropy', + optimizer: fineTuningOptimizer, + metrics: ['acc'] + }); + + const fineTuningHistory = await this.model.fitDataset(trainDataset, { + epochs: config.fineTuningEpochs, + validationData: valDataset, + callbacks: config.callback == null ? null : [config.callback] + }); + // Set the trainable attribute of the fine-tuning layer to its + // previous value. + this.secondLastBaseDenseLayer.trainable = originalTrainableValue; + return fineTuningHistory; + } + + private async fineTuningUsingTensors( + config: TransferLearnConfig, trainXs: tf.Tensor, trainYs: tf.Tensor, + valData: [tf.Tensor, tf.Tensor]): Promise { + const originalTrainableValue = this.secondLastBaseDenseLayer.trainable; + this.secondLastBaseDenseLayer.trainable = true; + + // Recompile model after unfreezing layer. + const fineTuningOptimizer: string|tf.Optimizer = + config.fineTuningOptimizer == null ? 'sgd' : config.fineTuningOptimizer; + this.model.compile({ + loss: 'categoricalCrossentropy', + optimizer: fineTuningOptimizer, + metrics: ['acc'] + }); + + const fineTuningHistory = await this.model.fit(trainXs, trainYs, { + epochs: config.fineTuningEpochs, + validationData: valData, + batchSize: config.batchSize, + callbacks: config.fineTuningCallback == null ? null : + [config.fineTuningCallback] + }); + // Set the trainable attribute of the fine-tuning layer to its + // previous value. + this.secondLastBaseDenseLayer.trainable = originalTrainableValue; + return fineTuningHistory; + } + + /** + * Perform evaluation of the model using the examples that the model + * has loaded. + * + * @param config Configuration object for the evaluation. + * @returns A Promise of the result of evaluation. + */ + async evaluate(config: EvaluateConfig): Promise { + tf.util.assert( + config.wordProbThresholds != null && + config.wordProbThresholds.length > 0, + () => `Received null or empty wordProbThresholds`); + + // TODO(cais): Maybe relax this requirement. + const NOISE_CLASS_INDEX = 0; + tf.util.assert( + this.words[NOISE_CLASS_INDEX] === BACKGROUND_NOISE_TAG, + () => `Cannot perform evaluation when the first tag is not ` + + `${BACKGROUND_NOISE_TAG}`); + + return tf.tidy(() => { + const rocCurve: ROCCurve = []; + let auc = 0; + const {xs, ys} = this.collectTransferDataAsTensors(config.windowHopRatio); + const indices = ys.argMax(-1).dataSync(); + const probs = this.model.predict(xs) as tf.Tensor; + + // To calcaulte ROC, we collapse all word probabilites into a single + // positive class, while _background_noise_ is treated as the + // negative class. + const maxWordProbs = + tf.max(tf.slice( + probs, [0, 1], [probs.shape[0], probs.shape[1] - 1]), -1); + const total = probs.shape[0]; + + // Calculate ROC curve. + for (let i = 0; i < config.wordProbThresholds.length; ++i) { + const probThreshold = config.wordProbThresholds[i]; + const isWord = + maxWordProbs.greater(tf.scalar(probThreshold)).dataSync(); + + let negatives = 0; + let positives = 0; + let falsePositives = 0; + let truePositives = 0; + for (let i = 0; i < total; ++i) { + if (indices[i] === NOISE_CLASS_INDEX) { + negatives++; + if (isWord[i]) { + falsePositives++; + } + } else { + positives++; + if (isWord[i]) { + truePositives++; + } + } + } + + // TODO(cais): Calculate per-hour false-positive rate. + const fpr = falsePositives / negatives; + const tpr = truePositives / positives; + + rocCurve.push({probThreshold, fpr, tpr}); + console.log( + `ROC thresh=${probThreshold}: ` + + `fpr=${fpr.toFixed(4)}, tpr=${tpr.toFixed(4)}`); + + if (i > 0) { + // Accumulate to AUC. + auc += Math.abs((rocCurve[i - 1].fpr - rocCurve[i].fpr)) * + (rocCurve[i - 1].tpr + rocCurve[i].tpr) / 2; + } + } + return {rocCurve, auc}; + }); + } + + /** + * Create an instance of tf.LayersModel for transfer learning. + * + * The top dense layer of the base model is replaced with a new softmax + * dense layer. + */ + private createTransferModelFromBaseModel(): void { + tf.util.assert( + this.words != null, + () => + `No word example is available for tranfer-learning model of name ` + + this.name); + + // Find the second last dense layer. + const layers = this.baseModel.layers; + let layerIndex = layers.length - 2; + while (layerIndex >= 0) { + if (layers[layerIndex].getClassName().toLowerCase() === 'dense') { + break; + } + layerIndex--; + } + if (layerIndex < 0) { + throw new Error('Cannot find a hidden dense layer in the base model.'); + } + this.secondLastBaseDenseLayer = layers[layerIndex]; + const truncatedBaseOutput = + this.secondLastBaseDenseLayer.output as tfl.SymbolicTensor; + + this.transferHead = tfl.sequential(); + this.transferHead.add(tfl.layers.dense({ + units: this.words.length, + activation: 'softmax', + inputShape: truncatedBaseOutput.shape.slice(1), + name: 'NewHeadDense' + })); + const transferOutput = + this.transferHead.apply(truncatedBaseOutput) as tfl.SymbolicTensor; + this.model = + tfl.model({inputs: this.baseModel.inputs, outputs: transferOutput}); + } + + /** + * Get the input shape of the underlying tf.LayersModel. + * + * @returns The input shape. + */ + modelInputShape(): tfl.Shape { + return this.baseModel.inputs[0].shape; + } + + getMetadata(): SpeechCommandRecognizerMetadata { + return { + tfjsSpeechCommandsVersion: version, + modelName: this.name, + timeStamp: new Date().toISOString(), + wordLabels: this.wordLabels() + }; + } + + async save(handlerOrURL?: string|tf.io.IOHandler): Promise { + const isCustomPath = handlerOrURL != null; + handlerOrURL = handlerOrURL || getCanonicalSavePath(this.name); + + if (!isCustomPath) { + // First, save the words and other metadata. + const metadataMapStr = + localStorageWrapper.localStorage.getItem(SAVED_MODEL_METADATA_KEY); + const metadataMap = + metadataMapStr == null ? {} : JSON.parse(metadataMapStr); + metadataMap[this.name] = this.getMetadata(); + localStorageWrapper.localStorage.setItem( + SAVED_MODEL_METADATA_KEY, JSON.stringify(metadataMap)); + } + console.log(`Saving model to ${handlerOrURL}`); + return this.model.save(handlerOrURL); + } + + async load(handlerOrURL?: string|tf.io.IOHandler): Promise { + const isCustomPath = handlerOrURL != null; + handlerOrURL = handlerOrURL || getCanonicalSavePath(this.name); + + if (!isCustomPath) { + // First, load the words and other metadata. + const metadataMap = JSON.parse( + localStorageWrapper.localStorage.getItem(SAVED_MODEL_METADATA_KEY)); + if (metadataMap == null || metadataMap[this.name] == null) { + throw new Error( + `Cannot find metadata for transfer model named ${this.name}"`); + } + this.words = metadataMap[this.name].wordLabels; + console.log( + `Loaded word list for model named ${this.name}: ${this.words}`); + } + this.model = await tfl.loadLayersModel(handlerOrURL); + console.log(`Loaded model from ${handlerOrURL}:`); + this.model.summary(); + } + + /** + * Overridden method to prevent creating a nested transfer-learning + * recognizer. + * + * @param name + */ + createTransfer(name: string): TransferBrowserFftSpeechCommandRecognizer { + throw new Error( + 'Creating transfer-learned recognizer from a transfer-learned ' + + 'recognizer is not supported.'); + } +} + +function getCanonicalSavePath(name: string): string { + return `${SAVE_PATH_PREFIX}${name}`; +} + +/** + * List the model that are currently saved locally in the browser. + * + * @returns An array of transfer-learned speech-commands models + * that are currently saved in the browser locally. + */ +export async function listSavedTransferModels(): Promise { + const models = await tf.io.listModels(); + const keys = []; + for (const key in models) { + if (key.startsWith(SAVE_PATH_PREFIX)) { + keys.push(key.slice(SAVE_PATH_PREFIX.length)); + } + } + return keys; +} + +/** + * Delete a locally-saved, transfer-learned speech-commands model. + * + * @param name The name of the transfer-learned model to be deleted. + */ +export async function deleteSavedTransferModel(name: string): Promise { + // Delete the words from local storage. + let metadataMap = JSON.parse( + localStorageWrapper.localStorage.getItem(SAVED_MODEL_METADATA_KEY)); + if (metadataMap == null) { + metadataMap = {}; + } + if (metadataMap[name] != null) { + delete metadataMap[name]; + } + localStorageWrapper.localStorage.setItem( + SAVED_MODEL_METADATA_KEY, JSON.stringify(metadataMap)); + await tf.io.removeModel(getCanonicalSavePath(name)); +} diff --git a/音频分类/speech-commands/src/browser_fft_recognizer_test.ts b/音频分类/speech-commands/src/browser_fft_recognizer_test.ts new file mode 100644 index 0000000..4826ace --- /dev/null +++ b/音频分类/speech-commands/src/browser_fft_recognizer_test.ts @@ -0,0 +1,1666 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import '@tensorflow/tfjs-node'; + +import * as tf from '@tensorflow/tfjs-core'; +// tslint:disable-next-line: no-imports-from-dist +import {describeWithFlags, NODE_ENVS} from '@tensorflow/tfjs-core/dist/jasmine_util'; +import * as tfl from '@tensorflow/tfjs-layers'; +import {writeFileSync} from 'fs'; +import {join} from 'path'; +import * as rimraf from 'rimraf'; +import * as tempfile from 'tempfile'; + +import {BrowserFftSpeechCommandRecognizer, deleteSavedTransferModel, getMajorAndMinorVersion, listSavedTransferModels, localStorageWrapper, SAVED_MODEL_METADATA_KEY} from './browser_fft_recognizer'; +import * as BrowserFftUtils from './browser_fft_utils'; +import {FakeAudioContext, FakeAudioMediaStream} from './browser_test_utils'; +import {arrayBuffer2SerializedExamples, BACKGROUND_NOISE_TAG} from './dataset'; +import {create} from './index'; +import {SpeechCommandRecognizerResult} from './types'; +import {version} from './version'; + +describe('getMajorAndMinorVersion', () => { + it('Correct results', () => { + expect(getMajorAndMinorVersion('0.1.3')).toEqual('0.1'); + expect(getMajorAndMinorVersion('1.0.9')).toEqual('1.0'); + expect(getMajorAndMinorVersion('2.0.0rc0')).toEqual('2.0'); + expect(getMajorAndMinorVersion('2.0.9999999')).toEqual('2.0'); + expect(getMajorAndMinorVersion('3.0')).toEqual('3.0'); + }); +}); + +describeWithFlags('Browser FFT recognizer', NODE_ENVS, () => { + const fakeWords: string[] = [ + '_background_noise_', 'down', 'eight', 'five', 'four', 'go', 'left', 'nine', + 'one', 'right', 'seven', 'six', 'stop', 'three', 'two', 'up', 'zero' + ]; + const fakeWordsNoiseAndUnknownOnly: string[] = + ['_background_noise_', '_unknown_']; + + const fakeNumFrames = 42; + const fakeColumnTruncateLength = 232; + + let secondLastBaseDenseLayer: tfl.layers.Layer; + let tfLoadModelSpy: jasmine.Spy; + + function setUpFakes(model?: tfl.Sequential, backgroundAndNoiseOnly = false) { + const words = + backgroundAndNoiseOnly ? fakeWordsNoiseAndUnknownOnly : fakeWords; + const numWords = words.length; + tfLoadModelSpy = + spyOn(tfl, 'loadLayersModel').and.callFake((url: string) => { + if (model == null) { + model = tfl.sequential(); + model.add(tfl.layers.flatten( + {inputShape: [fakeNumFrames, fakeColumnTruncateLength, 1]})); + secondLastBaseDenseLayer = tfl.layers.dense({ + units: 4, + activation: 'relu', + kernelInitializer: 'leCunNormal' + }); + model.add(secondLastBaseDenseLayer); + model.add(tfl.layers.dense({ + units: numWords, + useBias: false, + kernelInitializer: 'leCunNormal', + activation: 'softmax' + })); + } + return model; + }); + spyOn(BrowserFftUtils, 'loadMetadataJson') + .and.callFake(async (url: string) => { + return {words}; + }); + + spyOn(BrowserFftUtils, 'getAudioContextConstructor') + .and.callFake(() => FakeAudioContext.createInstance); + spyOn(BrowserFftUtils, 'getAudioMediaStream') + .and.callFake(() => new FakeAudioMediaStream()); + } + + it('Constructor works', () => { + const recognizer = new BrowserFftSpeechCommandRecognizer(); + expect(recognizer.isListening()).toEqual(false); + expect(recognizer.params().sampleRateHz).toEqual(44100); + expect(recognizer.params().fftSize).toEqual(1024); + }); + + it('ensureModelLoaded succeeds', async () => { + setUpFakes(); + + const recognizer = new BrowserFftSpeechCommandRecognizer(); + await recognizer.ensureModelLoaded(); + expect(recognizer.wordLabels()).toEqual(fakeWords); + expect(recognizer.model instanceof tfl.LayersModel).toEqual(true); + expect(recognizer.modelInputShape()).toEqual([ + null, fakeNumFrames, fakeColumnTruncateLength, 1 + ]); + }); + + it('ensureModelLoaded fails: words - model output mismatch', async () => { + const fakeModel = tfl.sequential(); + fakeModel.add(tfl.layers.flatten( + {inputShape: [fakeNumFrames, fakeColumnTruncateLength, 1]})); + fakeModel.add(tfl.layers.dense({units: 12, activation: 'softmax'})); + setUpFakes(fakeModel); + + const recognizer = new BrowserFftSpeechCommandRecognizer(); + let caughtError: Error; + try { + await recognizer.ensureModelLoaded(); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toMatch(/Mismatch between .* dimension.*12.*17/); + }); + + async function createFakeModelArtifact(tmpDir: string) { + const model = tfl.sequential(); + model.add(tfl.layers.reshape( + {targetShape: [43 * 232], inputShape: [43, 232, 1]})); + model.add(tfl.layers.dense({units: 4, activation: 'softmax'})); + await model.save(`file://${tmpDir}`); + } + + function createFakeMetadataFile(tmpDir: string) { + // Construct the metadata.json for the fake model. + const metadata: {} = { + wordLabels: ['_background_noise_', '_unknown_', 'foo', 'bar'], + frameSize: 232 + }; + const metadataPath = join(tmpDir, 'metadata.json'); + writeFileSync(metadataPath, JSON.stringify(metadata)); + } + + function createFakeMetadataFileWithLegacyWordsField(tmpDir: string) { + // Construct the metadata.json for the fake model. + const metadata: {} = { + words: ['_background_noise_', '_unknown_', 'foo', 'bar'], + frameSize: 232 + }; + const metadataPath = join(tmpDir, 'metadata.json'); + writeFileSync(metadataPath, JSON.stringify(metadata)); + } + + it('Constructing recognizer: custom URLs', async () => { + // Construct a fake model + const tmpDir = tempfile(); + await createFakeModelArtifact(tmpDir); + createFakeMetadataFile(tmpDir); + + const modelPath = join(tmpDir, 'model.json'); + const metadataPath = join(tmpDir, 'metadata.json'); + const modelURL = `file://${modelPath}`; + const metadataURL = `file://${metadataPath}`; + + const recognizer = + new BrowserFftSpeechCommandRecognizer(null, modelURL, metadataURL); + await recognizer.ensureModelLoaded(); + expect(recognizer.wordLabels()).toEqual([ + '_background_noise_', '_unknown_', 'foo', 'bar' + ]); + + const recogResult = await recognizer.recognize(tf.zeros([2, 43, 232, 1])); + expect(recogResult.scores.length).toEqual(2); + expect((recogResult.scores[0] as Float32Array).length).toEqual(4); + expect((recogResult.scores[1] as Float32Array).length).toEqual(4); + + rimraf(tmpDir, () => {}); + }); + + it('Constructing recognizer: custom URLs, legacy words format', async () => { + // Construct a fake model + const tmpDir = tempfile(); + await createFakeModelArtifact(tmpDir); + createFakeMetadataFileWithLegacyWordsField(tmpDir); + + const modelPath = join(tmpDir, 'model.json'); + const metadataPath = join(tmpDir, 'metadata.json'); + const modelURL = `file://${modelPath}`; + const metadataURL = `file://${metadataPath}`; + + const recognizer = + new BrowserFftSpeechCommandRecognizer(null, modelURL, metadataURL); + await recognizer.ensureModelLoaded(); + expect(recognizer.wordLabels()).toEqual([ + '_background_noise_', '_unknown_', 'foo', 'bar' + ]); + + const recogResult = await recognizer.recognize(tf.zeros([2, 43, 232, 1])); + expect(recogResult.scores.length).toEqual(2); + expect((recogResult.scores[0] as Float32Array).length).toEqual(4); + expect((recogResult.scores[1] as Float32Array).length).toEqual(4); + + rimraf(tmpDir, () => {}); + }); + + it('Creating recognizer using custom URLs', async () => { + // Construct a fake model + const tmpDir = tempfile(); + await createFakeModelArtifact(tmpDir); + createFakeMetadataFile(tmpDir); + + const modelPath = join(tmpDir, 'model.json'); + const metadataPath = join(tmpDir, 'metadata.json'); + const modelURL = `file://${modelPath}`; + const metadataURL = `file://${metadataPath}`; + + const recognizer = create('BROWSER_FFT', null, modelURL, metadataURL); + await recognizer.ensureModelLoaded(); + expect(recognizer.wordLabels()).toEqual([ + '_background_noise_', '_unknown_', 'foo', 'bar' + ]); + + const recogResult = await recognizer.recognize(tf.zeros([2, 43, 232, 1])); + expect(recogResult.scores.length).toEqual(2); + expect((recogResult.scores[0] as Float32Array).length).toEqual(4); + expect((recogResult.scores[1] as Float32Array).length).toEqual(4); + + rimraf(tmpDir, () => {}); + }); + + it('Providing both vocabulary and modelURL leads to Error', () => { + expect( + () => new BrowserFftSpeechCommandRecognizer( + 'vocab_1', 'http://localhost/model.json', + 'http://localhost/metadata.json')) + .toThrowError(/vocabulary name must be null or undefined .* modelURL/); + }); + + it('Providing modelURL without metadataURL leads to Error', () => { + expect( + () => new BrowserFftSpeechCommandRecognizer( + null, 'http://localhost/model.json')) + .toThrowError(/modelURL and metadataURL must be both provided/); + }); + + it('Offline recognize succeeds with single tf.Tensor', async () => { + setUpFakes(); + + const spectrogram = + tf.zeros([1, fakeNumFrames, fakeColumnTruncateLength, 1]); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + const output = await recognizer.recognize(spectrogram); + expect(output.scores instanceof Float32Array).toEqual(true); + expect(output.scores.length).toEqual(17); + }); + + it('Offline recognize succeeds with batched tf.Tensor', async () => { + setUpFakes(); + + const spectrogram = + tf.zeros([3, fakeNumFrames, fakeColumnTruncateLength, 1]); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + const output = await recognizer.recognize(spectrogram); + expect(Array.isArray(output.scores)).toEqual(true); + expect(output.scores.length).toEqual(3); + for (let i = 0; i < 3; ++i) { + expect((output.scores[i] as Float32Array).length).toEqual(17); + } + }); + + it('Offline recognize call: includeEmbedding', async () => { + setUpFakes(); + + // A batch of examples. + const numExamples = 3; + const spectrogram = + tf.zeros([numExamples, fakeNumFrames, fakeColumnTruncateLength, 1]); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + // Warm-up recognize call, for subsequent memory-leak check. + await recognizer.recognize(spectrogram, {includeEmbedding: true}); + const numTensors0 = tf.memory().numTensors; // For memory-leak check. + const output = + await recognizer.recognize(spectrogram, {includeEmbedding: true}); + expect(Array.isArray(output.scores)).toEqual(true); + expect(output.scores.length).toEqual(3); + for (let i = 0; i < 3; ++i) { + expect((output.scores[i] as Float32Array).length).toEqual(17); + } + expect(output.embedding.rank).toEqual(2); + expect(output.embedding.shape[0]).toEqual(numExamples); + tf.dispose(output.embedding); + // Assert no memory leak. + expect(tf.memory().numTensors).toEqual(numTensors0); + }); + + it('Offline recognize fails due to incorrect shape', async () => { + setUpFakes(); + + const spectrogram = + tf.zeros([1, fakeNumFrames, fakeColumnTruncateLength, 2]); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + let caughtError: Error; + try { + await recognizer.recognize(spectrogram); + } catch (err) { + caughtError = err; + } + expect(caughtError.message).toMatch(/Expected .* shape .*, but got shape/); + }); + + it('Offline recognize succeeds with single Float32Array', async () => { + setUpFakes(); + + const spectrogram = + new Float32Array(fakeNumFrames * fakeColumnTruncateLength * 1); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + const output = await recognizer.recognize(spectrogram); + expect(output.scores instanceof Float32Array).toEqual(true); + expect(output.scores.length).toEqual(17); + }); + + it('Offline recognize succeeds with batched Float32Array', async () => { + setUpFakes(); + + const spectrogram = + new Float32Array(2 * fakeNumFrames * fakeColumnTruncateLength * 1); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + const output = await recognizer.recognize(spectrogram); + expect(Array.isArray(output.scores)).toEqual(true); + expect(output.scores.length).toEqual(2); + for (let i = 0; i < 2; ++i) { + expect((output.scores[i] as Float32Array).length).toEqual(17); + } + }); + + it('listen() call with invalid overlapFactor', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + let caughtError: Error; + + try { + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}, + {overlapFactor: -1.2}); + } catch (err) { + caughtError = err; + } + expect(caughtError.message).toMatch(/Expected overlapFactor/); + + try { + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}, + {overlapFactor: 1}); + } catch (err) { + caughtError = err; + } + expect(caughtError.message).toMatch(/Expected overlapFactor/); + + try { + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}, + {overlapFactor: 1.2}); + } catch (err) { + caughtError = err; + } + expect(caughtError.message).toMatch(/Expected overlapFactor/); + }); + + it('listen() call with invalid probabilityThreshold', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + let caughtError: Error; + try { + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}, + {probabilityThreshold: 1.2}); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toMatch(/Invalid probabilityThreshold value: 1\.2/); + + try { + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}, + {probabilityThreshold: -0.1}); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toMatch(/Invalid probabilityThreshold value: -0\.1/); + }); + + it('streaming: overlapFactor = 0', done => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + const numCallbacksToComplete = 2; + let numCallbacksCompleted = 0; + const spectroDurationMillis = 900; + const tensorCounts: number[] = []; + const callbackTimestamps: number[] = []; + recognizer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(fakeWords.length); + + callbackTimestamps.push(tf.util.now()); + if (callbackTimestamps.length > 1) { + const timeBetweenCallbacks = + callbackTimestamps[callbackTimestamps.length - 1] - + callbackTimestamps[callbackTimestamps.length - 2]; + expect( + timeBetweenCallbacks > spectroDurationMillis && + timeBetweenCallbacks < 1.3 * spectroDurationMillis) + .toBe(true); + } + + tensorCounts.push(tf.memory().numTensors); + if (tensorCounts.length > 1) { + // Assert no memory leak. + expect(tensorCounts[tensorCounts.length - 1]) + .toEqual(tensorCounts[tensorCounts.length - 2]); + } + + // spectrogram is not provided by default. + expect(result.spectrogram).toBeUndefined(); + + // Embedding should not be included by default. + expect(result.embedding).toBeUndefined(); + + if (++numCallbacksCompleted >= numCallbacksToComplete) { + await recognizer.stopListening(); + done(); + } + }, {overlapFactor: 0, invokeCallbackOnNoiseAndUnknown: true}); + }); + + it('streaming: overlapFactor = 0, includeEmbedding', done => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + const numCallbacksToComplete = 2; + let numCallbacksCompleted = 0; + const tensorCounts: number[] = []; + const callbackTimestamps: number[] = []; + recognizer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(fakeWords.length); + + callbackTimestamps.push(tf.util.now()); + const timeDelta = 50; + if (callbackTimestamps.length > 1) { + expect( + callbackTimestamps[callbackTimestamps.length - 1] - + callbackTimestamps[callbackTimestamps.length - 2]) + .toBeGreaterThanOrEqual( + recognizer.params().spectrogramDurationMillis - timeDelta); + } + + tensorCounts.push(tf.memory().numTensors); + + // spectrogram is not provided by default. + expect(result.spectrogram).toBeUndefined(); + + // Embedding should not be included by default. + expect(result.embedding.rank).toEqual(2); + expect(result.embedding.shape[0]).toEqual(1); + // The number of units of the hidden dense layer. + expect(result.embedding.shape[1]).toEqual(4); + + if (++numCallbacksCompleted >= numCallbacksToComplete) { + await recognizer.stopListening(); + done(); + } + }, { + overlapFactor: 0, + invokeCallbackOnNoiseAndUnknown: true, + includeEmbedding: true + }); + }); + + it('streaming: overlapFactor = 0.5, includeSpectrogram', done => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + const numCallbacksToComplete = 2; + let numCallbacksCompleted = 0; + const spectroDurationMillis = 900; + const tensorCounts: number[] = []; + const callbackTimestamps: number[] = []; + recognizer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(fakeWords.length); + + callbackTimestamps.push(tf.util.now()); + if (callbackTimestamps.length > 1) { + const timeBetweenCallbacks = + callbackTimestamps[callbackTimestamps.length - 1] - + callbackTimestamps[callbackTimestamps.length - 2]; + expect( + timeBetweenCallbacks > 0.5 * spectroDurationMillis && + timeBetweenCallbacks < 0.8 * spectroDurationMillis) + .toBe(true); + } + + tensorCounts.push(tf.memory().numTensors); + if (tensorCounts.length > 1) { + // Assert no memory leak. + expect(tensorCounts[tensorCounts.length - 1]) + .toEqual(tensorCounts[tensorCounts.length - 2]); + } + + // spectrogram is not provided by default. + expect(result.spectrogram.data.length) + .toBe(fakeNumFrames * fakeColumnTruncateLength); + expect(result.spectrogram.frameSize).toBe(fakeColumnTruncateLength); + + if (++numCallbacksCompleted >= numCallbacksToComplete) { + await recognizer.stopListening(); + done(); + } + }, { + overlapFactor: 0.5, + includeSpectrogram: true, + invokeCallbackOnNoiseAndUnknown: true + }); + }); + + it('streaming: invokeCallbackOnNoiseAndUnknown = false', done => { + setUpFakes(null, true); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + let callbackInvokeCount = 0; + recognizer.listen(async (result: SpeechCommandRecognizerResult) => { + callbackInvokeCount++; + }, {overlapFactor: 0.5, invokeCallbackOnNoiseAndUnknown: false}); + + setTimeout(() => { + recognizer.stopListening(); + // Due to `invokeCallbackOnNoiseAndUnknown: false` and the fact that the + // vocabulary contains only _background_noise_ and _unknown_, the callback + // should have never been called. + expect(callbackInvokeCount).toEqual(0); + done(); + }, 1000); + }); + + it('streaming: invokeCallbackOnNoiseAndUnknown = true', done => { + setUpFakes(null, true); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + let callbackInvokeCount = 0; + recognizer.listen(async (result: SpeechCommandRecognizerResult) => { + callbackInvokeCount++; + }, {overlapFactor: 0.5, invokeCallbackOnNoiseAndUnknown: true}); + + setTimeout(() => { + recognizer.stopListening(); + // Even though the model predicts only _background_noise_ and _unknown_, + // the callback should have been invoked because of + // `invokeCallbackOnNoiseAndUnknown: true`. + expect(callbackInvokeCount).toBeGreaterThan(0); + done(); + }, 1000); + }); + + it('Attempt to start streaming twice leads to Error', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}); + expect(recognizer.isListening()).toEqual(true); + + let caughtError: Error; + try { + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toEqual('Cannot start streaming again when streaming is ongoing.'); + expect(recognizer.isListening()).toEqual(true); + + await recognizer.stopListening(); + expect(recognizer.isListening()).toEqual(false); + }); + + it('Attempt to stop streaming twice leads to Error', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + await recognizer.listen( + async (result: SpeechCommandRecognizerResult) => {}); + expect(recognizer.isListening()).toEqual(true); + + await recognizer.stopListening(); + expect(recognizer.isListening()).toEqual(false); + + let caughtError: Error; + try { + await recognizer.stopListening(); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toEqual('Cannot stop streaming when streaming is not ongoing.'); + expect(recognizer.isListening()).toEqual(false); + }); + + it('Online recognize() call succeeds', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + for (let i = 0; i < 2; ++i) { + // No-arg call: online recognition. + const output = await recognizer.recognize(); + expect(output.scores.length).toEqual(fakeWords.length); + expect(output.embedding).toBeUndefined(); + } + }); + + it('Online recognize() call with includeEmbedding succeeds', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + for (let i = 0; i < 2; ++i) { + // No-arg call: online recognition. + const output = await recognizer.recognize(null, {includeEmbedding: true}); + expect(output.scores.length).toEqual(fakeWords.length); + expect(output.embedding.rank).toEqual(2); + expect(output.embedding.shape[0]).toEqual(1); + expect(output.spectrogram).toBeUndefined(); + } + }); + + it('Online recognize() call with includeSpectrogram succeeds', async () => { + setUpFakes(); + const recognizer = new BrowserFftSpeechCommandRecognizer(); + + for (let i = 0; i < 2; ++i) { + // No-arg call: online recognition. + const output = + await recognizer.recognize(null, {includeSpectrogram: true}); + expect(output.scores.length).toEqual(fakeWords.length); + expect(output.embedding).toBeUndefined(); + expect(output.spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(output.spectrogram.data.length) + .toEqual(fakeColumnTruncateLength * fakeNumFrames); + } + }); + + it('collectExample with durationSec', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const params = transfer.params(); + // Double the length of the spectrogram. + const durationSec = params.spectrogramDurationMillis * 2 / 1e3; + const spectrogram = await transfer.collectExample('foo', {durationSec}); + expect(spectrogram.data.length / fakeColumnTruncateLength / fakeNumFrames) + .toEqual(2); + const example = transfer.getExamples('foo')[0]; + expect(example.example.rawAudio).toBeUndefined(); + }); + + it('collectExample with 0 durationSec errors', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 0; + try { + await transfer.collectExample('foo', {durationSec}); + done.fail('Failed to catch expected error'); + } catch (err) { + expect(err.message).toMatch(/Expected durationSec to be > 0/); + done(); + } + }); + + it('collectExample: durationMultiplier&durationSec errors', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1; + const durationMultiplier = 2; + try { + await transfer.collectExample('foo', {durationSec, durationMultiplier}); + done.fail('Failed to catch expected error'); + } catch (err) { + expect(err.message).toMatch(/are mutually exclusive/); + done(); + } + }); + + it('collectExample with onSnippet', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1; + const snippetDurationSec = 0.1; + const snippetLengths: number[] = []; + const finalSpectrogram = await transfer.collectExample('foo', { + durationSec, + snippetDurationSec, + onSnippet: async spectrogram => { + snippetLengths.push(spectrogram.data.length); + } + }); + expect(snippetLengths.length).toEqual(11); + expect(snippetLengths[0]).toEqual(927); + // First audio sample is zero and should have been skipped. + for (let i = 1; i < snippetLengths.length; ++i) { + expect(snippetLengths[i]).toEqual(928); + } + expect(finalSpectrogram.data.length) + .toEqual(snippetLengths.reduce((x, prev) => x + prev)); + expect(finalSpectrogram.data.length).toEqual(10208 - 1); + }); + + it('collectExample w/ invalid durationSec leads to error', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1; + const snippetDurationSec = 0; + try { + await transfer.collectExample('foo', {durationSec, snippetDurationSec}); + done.fail(); + } catch (error) { + expect(error.message).toMatch(/snippetDurationSec is expected to be > 0/); + done(); + } + }); + + it('collectExample w/ onSnippet w/o snippetDurationSec error', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1; + try { + await transfer.collectExample( + 'foo', {durationSec, onSnippet: async spectrogram => {}}); + done.fail(); + } catch (error) { + expect(error.message) + .toMatch(/snippetDurationSec must be provided if onSnippet/); + done(); + } + }); + + it('collectExample w/ snippetDurationSec w/o callback errors', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1; + const snippetDurationSec = 0.1; + try { + await transfer.collectExample('foo', {durationSec, snippetDurationSec}); + done.fail(); + } catch (error) { + expect(error.message) + .toMatch(/onSnippet must be provided if snippetDurationSec/); + done(); + } + }); + + it('collectExample: includeRawAudio, no snippets', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1.5; + const includeRawAudio = true; + await transfer.collectExample('foo', {durationSec, includeRawAudio}); + const examples = transfer.getExamples('foo'); + expect(examples.length).toEqual(1); + expect(examples[0].example.rawAudio.sampleRateHz).toEqual(44100); + expect(examples[0].example.rawAudio.data.length / (durationSec * 44100)) + .toBeCloseTo(1, 1e-3); + }); + + it('collectExample: includeRawAudio, with snippets', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const durationSec = 1.5; + const snippetDurationSec = 0.1; + const includeRawAudio = true; + await transfer.collectExample('foo', { + durationSec, + includeRawAudio, + snippetDurationSec, + onSnippet: async spectrogram => {} + }); + const examples = transfer.getExamples('foo'); + expect(examples.length).toEqual(1); + expect(examples[0].example.rawAudio.sampleRateHz).toEqual(44100); + expect(examples[0].example.rawAudio.data.length / (durationSec * 44100)) + .toBeCloseTo(1, 1e-3); + }); + + it('collectTransferLearningExample default transfer model', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + let spectrogram = await transfer.collectExample('foo'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer.wordLabels()).toEqual(['foo']); + // Assert no cross-talk. + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.countExamples()).toEqual({'foo': 1}); + + spectrogram = await transfer.collectExample('foo'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer.wordLabels()).toEqual(['foo']); + expect(transfer.countExamples()).toEqual({'foo': 2}); + + spectrogram = await transfer.collectExample('bar'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer.wordLabels()).toEqual(['bar', 'foo']); + expect(transfer.countExamples()).toEqual({'bar': 1, 'foo': 2}); + }); + + it('createTransfer with invalid name leads to Error', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + expect(() => base.createTransfer('')).toThrowError(/non-empty string/); + expect(() => base.createTransfer(null)).toThrowError(/non-empty string/); + expect(() => base.createTransfer(undefined)) + .toThrowError(/non-empty string/); + }); + + it('createTransfer with duplicate name leads to Error', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + base.createTransfer('xfer1'); + expect(() => base.createTransfer('xfer1')) + .toThrowError( + /There is already a transfer-learning model named \'xfer1\'/); + base.createTransfer('xfer2'); + }); + + it('createTransfer before model loading leads to Error', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + expect(() => base.createTransfer('xfer1')) + .toThrowError(/Model has not been loaded yet/); + }); + + it('transfer recognizer has correct modelInputShape', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + expect(transfer.modelInputShape()).toEqual(base.modelInputShape()); + }); + + it('transfer recognizer has correct params', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + expect(transfer.params()).toEqual(base.params()); + }); + + it('clearTransferLearningExamples default transfer model', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + let spectrogram = await transfer.collectExample('foo'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer.wordLabels()).toEqual(['foo']); + // Assert no cross-talk. + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.countExamples()).toEqual({'foo': 1}); + + transfer.clearExamples(); + expect(transfer.wordLabels()).toEqual(null); + expect(() => transfer.countExamples()).toThrow(); + + spectrogram = await transfer.collectExample('bar'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer.wordLabels()).toEqual(['bar']); + expect(transfer.countExamples()).toEqual({'bar': 1}); + }); + + it('Collect examples for 2 transfer models', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer1 = base.createTransfer('xfer1'); + let spectrogram = await transfer1.collectExample('foo'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer1.wordLabels()).toEqual(['foo']); + + const transfer2 = await base.createTransfer('xfer2'); + spectrogram = await transfer2.collectExample('bar'); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + expect(spectrogram.data.length) + .toEqual(fakeNumFrames * fakeColumnTruncateLength); + expect(transfer2.wordLabels()).toEqual(['bar']); + expect(transfer1.wordLabels()).toEqual(['foo']); + + transfer1.clearExamples(); + expect(transfer2.wordLabels()).toEqual(['bar']); + expect(transfer1.wordLabels()).toEqual(null); + // Assert no cross-talk. + expect(base.wordLabels()).toEqual(fakeWords); + }); + + it('clearExamples fails if called without examples', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + expect(() => transfer.clearExamples()) + .toThrowError(/No transfer learning examples .*xfer1/); + }); + + it('collectExample fails on undefined/null/empty word', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + let errorCaught: Error; + try { + await transfer.collectExample(undefined); + } catch (err) { + errorCaught = err; + } + expect(errorCaught.message).toMatch(/non-empty string/); + try { + await transfer.collectExample(null); + } catch (err) { + errorCaught = err; + } + expect(errorCaught.message).toMatch(/non-empty string/); + try { + await transfer.collectExample(''); + } catch (err) { + errorCaught = err; + } + expect(errorCaught.message).toMatch(/non-empty string/); + }); + + it('Concurrent collectTransferLearningExample call fails', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer1 = await base.createTransfer('xfer1'); + transfer1.collectExample('foo').then(() => { + done(); + }); + + let caughtError: Error; + try { + await transfer1.collectExample('foo'); + } catch (err) { + caughtError = err; + } + expect(caughtError.message) + .toMatch(/Cannot start collection of transfer-learning example/); + }); + + it('Concurrent collectExample+listen fails', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + await base.listen(async (result: SpeechCommandRecognizerResult) => {}); + expect(base.isListening()).toEqual(true); + + const transfer = base.createTransfer('xfer1'); + // Concurrent with the ongoing listening (started by the listen() call + // above). + const example = await transfer.collectExample('foo'); + expect(example.frameSize).toEqual(232); + + await base.stopListening(); + expect(base.isListening()).toEqual(false); + }); + + it('trainTransferLearningModel default params', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + for (let i = 0; i < 2; ++i) { + await transfer.collectExample('bar'); + } + + // Train transfer-learning model once to make sure model is created + // first, so that we can check the change in the transfer-learning model's + // weights after a new round of training. + await transfer.train({epochs: 1, optimizer: tf.train.sgd(0)}); + + const baseModel = base.model; + // Assert that the base model has been frozen. + for (const layer of baseModel.layers) { + expect(layer.trainable).toEqual(false); + } + + const baseModelOldWeightValues: Float32Array[] = []; + baseModel.layers.forEach(layer => { + layer.getWeights().forEach(w => { + baseModelOldWeightValues.push(w.dataSync() as Float32Array); + }); + }); + + // tslint:disable-next-line:no-any + const transferHead = (transfer as any).transferHead as tfl.Sequential; + const numLayers = transferHead.layers.length; + const oldTransferWeightValues = transferHead.getLayer(null, numLayers - 1) + .getWeights() + .map(weight => weight.dataSync()); + + const history = + await transfer.train({optimizer: tf.train.sgd(1)}) as tfl.History; + expect(history.history.loss.length).toEqual(20); + expect(history.history.acc.length).toEqual(20); + + const baseModelNewWeightValues: Float32Array[] = []; + baseModel.layers.forEach(layer => { + layer.getWeights().forEach(w => { + baseModelNewWeightValues.push(w.dataSync() as Float32Array); + }); + }); + + // Verify that the weights of the dense layer in the base model doesn't + // change, i.e., is frozen. + const newTransferWeightValues = transferHead.getLayer(null, numLayers - 1) + .getWeights() + .map(weight => weight.dataSync()); + baseModelOldWeightValues.forEach((oldWeight, i) => { + tf.test_util.expectArraysClose(baseModelNewWeightValues[i], oldWeight); + }); + // Verify that the weight of the transfer-learning head model changes + // after training. + const maxWeightChanges = newTransferWeightValues.map( + (newValues, i) => tf.max(tf.abs(tf.sub( + tf.tensor1d(newValues), + tf.tensor1d(oldTransferWeightValues[i])))) + .dataSync()[0]); + expect(Math.max(...maxWeightChanges)).toBeGreaterThan(1e-3); + + // Test recognize() with the transfer recognizer. + const spectrogram = + tf.zeros([1, fakeNumFrames, fakeColumnTruncateLength, 1]); + const result = await transfer.recognize(spectrogram); + expect(result.scores.length).toEqual(2); + + // After the transfer learning is complete, listen() with the + // transfer-learned model's name should give scores only for the + // transfer-learned model. + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.wordLabels()).toEqual(['bar', 'foo']); + transfer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(2); + await transfer.stopListening(); + done(); + }); + }); + + it('trainTransferLearningModel custom params', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + for (let i = 0; i < 2; ++i) { + await transfer.collectExample('bar'); + } + const history = + await transfer.train({epochs: 10, batchSize: 2}) as tfl.History; + expect(history.history.loss.length).toEqual(10); + expect(history.history.acc.length).toEqual(10); + + // After the transfer learning is complete, listen() with the + // transfer-learned model's name should give scores only for the + // transfer-learned model. + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.wordLabels()).toEqual(['bar', 'foo']); + transfer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(2); + await transfer.stopListening(); + done(); + }); + }); + + it('trainTransferLearningModel w/ mixing-noise augmentation', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + for (let i = 0; i < 2; ++i) { + await transfer.collectExample(BACKGROUND_NOISE_TAG); + } + const history = + await transfer.train( + {epochs: 10, batchSize: 2, augmentByMixingNoiseRatio: 0.5}) as + tfl.History; + expect(history.history.loss.length).toEqual(10); + expect(history.history.acc.length).toEqual(10); + + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.wordLabels()).toEqual([BACKGROUND_NOISE_TAG, 'foo']); + }); + + it('train and evaluate', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('_background_noise_'); + await transfer.collectExample('bar'); + await transfer.collectExample('bar'); + await transfer.train({epochs: 3, batchSize: 2, validationSplit: 0.5}); + + const wordProbThresholds = [0, 0.25, 0.5, 0.75, 1]; + // Burn-in run for evaluate() memory tracking: + await transfer.evaluate({windowHopRatio: 0.25, wordProbThresholds}); + const numTensors0 = tf.memory().numTensors; + const {rocCurve, auc} = + await transfer.evaluate({windowHopRatio: 0.25, wordProbThresholds}); + // Assert no memory leak. + expect(tf.memory().numTensors).toEqual(numTensors0); + expect(rocCurve.length).toEqual(wordProbThresholds.length); + for (let i = 0; i < rocCurve.length; ++i) { + expect(rocCurve[i].probThreshold).toEqual(wordProbThresholds[i]); + expect(rocCurve[i].fpr).toBeGreaterThanOrEqual(0); + expect(rocCurve[i].fpr).toBeLessThanOrEqual(1); + expect(rocCurve[i].tpr).toBeGreaterThanOrEqual(0); + expect(rocCurve[i].tpr).toBeLessThanOrEqual(1); + } + expect(auc).toBeGreaterThanOrEqual(0); + expect(auc).toBeLessThanOrEqual(1); + }); + + it('train with validationSplit and listen', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('_background_noise_'); + await transfer.collectExample('bar'); + await transfer.collectExample('bar'); + const history = + await transfer.train({epochs: 3, batchSize: 2, validationSplit: 0.5}) as + tfl.History; + expect(history.history.loss.length).toEqual(3); + expect(history.history.acc.length).toEqual(3); + expect(history.history.val_loss.length).toEqual(3); + expect(history.history.val_acc.length).toEqual(3); + + // After the transfer learning is complete, listen() with the + // transfer-learned model's name should give scores only for the + // transfer-learned model. + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.wordLabels()).toEqual(['_background_noise_', 'bar']); + transfer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(2); + transfer.stopListening().then(done); + }, {probabilityThreshold: 0, invokeCallbackOnNoiseAndUnknown: true}); + }); + + it('getMetadata works after transfer learning', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('_background_noise_'); + await transfer.collectExample('bar'); + await transfer.collectExample('bar'); + await transfer.train({epochs: 1, batchSize: 2, validationSplit: 0.5}); + + const metadata = transfer.getMetadata(); + expect(metadata.tfjsSpeechCommandsVersion).toEqual(version); + expect(metadata.modelName).toEqual('xfer1'); + expect(metadata.timeStamp != null).toEqual(true); + expect(metadata.wordLabels).toEqual(['_background_noise_', 'bar']); + }); + + it('train with tf.data.Dataset, with fine-tuning', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('_background_noise_'); + await transfer.collectExample('_background_noise_'); + await transfer.collectExample('bar'); + await transfer.collectExample('bar'); + // Set the duration threshold to 0 to force using tf.data.Dataset + // for training. + const fitDatasetDurationMillisThreshold = 0; + const [history, fineTuneHistory] = await transfer.train({ + epochs: 3, + batchSize: 1, + validationSplit: 0.5, + fitDatasetDurationMillisThreshold, + fineTuningEpochs: 2 + }) as [tfl.History, tfl.History]; + expect(history.history.loss.length).toEqual(3); + expect(history.history.acc.length).toEqual(3); + expect(history.history.val_loss.length).toEqual(3); + expect(history.history.val_acc.length).toEqual(3); + expect(fineTuneHistory.history.loss.length).toEqual(2); + expect(fineTuneHistory.history.acc.length).toEqual(2); + expect(fineTuneHistory.history.val_loss.length).toEqual(2); + expect(fineTuneHistory.history.val_acc.length).toEqual(2); + }); + + it('trainTransferLearningModel with fine-tuning + callback', async done => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + + const oldKernel = secondLastBaseDenseLayer.getWeights()[0].dataSync(); + + const historyObjects = await transfer.train({ + epochs: 3, + batchSize: 2, + fineTuningEpochs: 2, + fineTuningOptimizer: 'adam' + }) as tfl.History[]; + expect(historyObjects.length).toEqual(2); + expect(historyObjects[0].history.loss.length).toEqual(3); + expect(historyObjects[0].history.acc.length).toEqual(3); + expect(historyObjects[1].history.loss.length).toEqual(2); + expect(historyObjects[1].history.acc.length).toEqual(2); + + // Assert that the kernel has changed as a result of the fine-tuning. + const newKernel = secondLastBaseDenseLayer.getWeights()[0].dataSync(); + + let diffSumSquare = 0; + for (let i = 0; i < newKernel.length; ++i) { + const diff = newKernel[i] - oldKernel[i]; + diffSumSquare += diff * diff; + } + expect(diffSumSquare).toBeGreaterThan(1e-4); + + // After the transfer learning is complete, startStreaming with the + // transfer-learned model's name should give scores only for the + // transfer-learned model. + expect(base.wordLabels()).toEqual(fakeWords); + expect(transfer.wordLabels()).toEqual(['bar', 'foo']); + + transfer.listen(async (result: SpeechCommandRecognizerResult) => { + expect((result.scores as Float32Array).length).toEqual(2); + transfer.stopListening().then(done); + }); + }); + + it('trainTransferLearningModel custom params and callback', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + for (let i = 0; i < 2; ++i) { + await transfer.collectExample('bar'); + } + const callbackEpochs: number[] = []; + const history = await transfer.train({ + epochs: 5, + callback: { + onEpochEnd: async (epoch: number, logs: tfl.Logs) => { + callbackEpochs.push(epoch); + } + } + }) as tfl.History; + expect(history.history.loss.length).toEqual(5); + expect(history.history.acc.length).toEqual(5); + expect(callbackEpochs).toEqual([0, 1, 2, 3, 4]); + }); + + it('trainTransferLearningModel fails without any examples', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + let errorCaught: Error; + try { + await transfer.train(); + } catch (err) { + errorCaught = err; + } + expect(errorCaught.message) + .toMatch(/no transfer learning example has been collected/); + }); + + it('trainTransferLearningModel fails with only 1 word', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + await transfer.collectExample('foo'); + let errorCaught: Error; + try { + await transfer.train(); + } catch (err) { + errorCaught = err; + } + expect(errorCaught.message).toMatch(/.*foo.*Requires at least 2/); + }); + + it('Invalid vocabulary name leads to Error', () => { + expect(() => create('BROWSER_FFT', 'nonsensical_vocab')) + .toThrowError(/Invalid vocabulary name.*\'nonsensical_vocab\'/); + }); + + it('getExamples()', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('bar'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + const barOut = transfer.getExamples('bar'); + expect(barOut.length).toEqual(2); + expect(barOut[0].uid).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/); + expect(barOut[0].example.label).toEqual('bar'); + expect(barOut[1].uid).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/); + expect(barOut[1].example.label).toEqual('bar'); + const fooOut = transfer.getExamples('foo'); + expect(fooOut.length).toEqual(1); + expect(fooOut[0].uid).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/); + expect(fooOut[0].example.label).toEqual('foo'); + }); + + it('serializeExamples', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('bar'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + const artifacts = + arrayBuffer2SerializedExamples(transfer.serializeExamples()); + + // The examples are sorted alphabetically by their label. + expect(artifacts.manifest).toEqual([ + { + label: 'bar', + spectrogramNumFrames: fakeNumFrames, + spectrogramFrameSize: fakeColumnTruncateLength + }, + { + label: 'bar', + spectrogramNumFrames: fakeNumFrames, + spectrogramFrameSize: fakeColumnTruncateLength + }, + { + label: 'foo', + spectrogramNumFrames: fakeNumFrames, + spectrogramFrameSize: fakeColumnTruncateLength + } + ]); + expect(artifacts.data.byteLength) + .toEqual(fakeNumFrames * fakeColumnTruncateLength * 4 * 3); + }); + + it('serializeExamples: limited word labels', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('bar'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + const artifacts = + arrayBuffer2SerializedExamples(transfer.serializeExamples('bar')); + + // The examples are sorted alphabetically by their label. + expect(artifacts.manifest).toEqual([ + { + label: 'bar', + spectrogramNumFrames: fakeNumFrames, + spectrogramFrameSize: fakeColumnTruncateLength + }, + { + label: 'bar', + spectrogramNumFrames: fakeNumFrames, + spectrogramFrameSize: fakeColumnTruncateLength + } + ]); + expect(artifacts.data.byteLength) + .toEqual(fakeNumFrames * fakeColumnTruncateLength * 4 * 2); + }); + + it('removeExample & isDatasetEmpty', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + expect(transfer.isDatasetEmpty()).toEqual(true); + await transfer.collectExample('bar'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + const fooExamples = transfer.getExamples('foo'); + transfer.removeExample(fooExamples[0].uid); + expect(transfer.isDatasetEmpty()).toEqual(false); + expect(transfer.countExamples()).toEqual({'bar': 2}); + expect(() => transfer.getExamples('foo')) + .toThrowError('No example of label "foo" exists in dataset'); + const barExamples = transfer.getExamples('bar'); + transfer.removeExample(barExamples[0].uid); + expect(transfer.isDatasetEmpty()).toEqual(false); + expect(transfer.countExamples()).toEqual({'bar': 1}); + transfer.removeExample(barExamples[1].uid); + expect(transfer.isDatasetEmpty()).toEqual(true); + }); + + it('serializeExamples fails on empty data', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + expect(() => transfer.serializeExamples()).toThrow(); + }); + + it('loadExapmles, from empty state', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer1 = base.createTransfer('xfer1'); + await transfer1.collectExample('foo'); + await transfer1.collectExample('bar'); + const transfer2 = base.createTransfer('xfer2'); + transfer2.loadExamples(transfer1.serializeExamples()); + + expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1}); + + // Assert that transfer2 can continue to collect new examples. + await transfer2.collectExample('qux'); + expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1, 'qux': 1}); + }); + + it('loadExapmles, from nonempty state, clearExisting = false', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer1 = base.createTransfer('xfer1'); + await transfer1.collectExample('foo'); + await transfer1.collectExample('bar'); + const transfer2 = base.createTransfer('xfer2'); + await transfer2.collectExample('qux'); + transfer2.loadExamples(transfer1.serializeExamples()); + + expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1, 'qux': 1}); + }); + + it('loadExapmles, from nonempty state, clearExisting = true', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer1 = base.createTransfer('xfer1'); + await transfer1.collectExample('foo'); + await transfer1.collectExample('bar'); + const transfer2 = base.createTransfer('xfer2'); + await transfer2.collectExample('qux'); + transfer2.loadExamples(transfer1.serializeExamples(), true); + + expect(transfer2.countExamples()).toEqual({'bar': 1, 'foo': 1}); + }); + + it('loadExapmles, from a word-filtered dataset', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer1 = base.createTransfer('xfer1'); + await transfer1.collectExample('foo'); + await transfer1.collectExample('bar'); + const serialized = transfer1.serializeExamples('foo'); + const transfer2 = base.createTransfer('xfer2'); + transfer2.loadExamples(serialized); + expect(transfer2.countExamples()).toEqual({'foo': 1}); + const examples = transfer2.getExamples('foo'); + expect(examples.length).toEqual(1); + expect(examples[0].example.label).toEqual('foo'); + }); + + it('collectExample with durationMultiplier = 1.5', async () => { + setUpFakes(); + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + const spectrogram = + await transfer.collectExample('foo', {durationMultiplier: 1.5}); + expect(spectrogram.frameSize).toEqual(fakeColumnTruncateLength); + const numFrames = spectrogram.data.length / fakeColumnTruncateLength; + expect(numFrames).toEqual(fakeNumFrames * 1.5); + }); + + function setUpFakeLocalStorage(store: {[key: string]: string}) { + // tslint:disable:no-any + localStorageWrapper.localStorage = { + getItem: (key: string) => { + return store[key]; + }, + setItem: (key: string, value: string) => { + store[key] = value; + } + } as any; + // tslint:enable:no-any + } + + function setUpFakeIndexedDB(artifactStore: tf.io.ModelArtifacts[]) { + class FakeIndexedDBHandler implements tf.io.IOHandler { + constructor(readonly artifactStore: tf.io.ModelArtifacts[]) {} + + async save(artifacts: tf.io.ModelArtifacts): Promise { + this.artifactStore.push(artifacts); + return null; + } + + async load(): Promise { + return this.artifactStore[this.artifactStore.length - 1]; + } + } + + const handler = new FakeIndexedDBHandler(artifactStore); + function fakeIndexedDBRouter(url: string|string[]): tf.io.IOHandler { + if (!Array.isArray(url) && url.startsWith('indexeddb://')) { + return handler; + } else { + return null; + } + } + tf.io.registerSaveRouter(fakeIndexedDBRouter); + tf.io.registerLoadRouter(fakeIndexedDBRouter); + } + + it('Save and load transfer model via indexeddb://', async () => { + setUpFakes(); + const localStore: {[key: string]: string} = {}; + setUpFakeLocalStorage(localStore); + const indexedDBStore: tf.io.ModelArtifacts[] = []; + setUpFakeIndexedDB(indexedDBStore); + + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + await transfer.train({epochs: 1}); + + const xs = tf.ones([1, fakeNumFrames, fakeColumnTruncateLength, 1]); + const out0 = await transfer.recognize(xs); + + await transfer.save(); + + const savedMetadata = JSON.parse(localStore[SAVED_MODEL_METADATA_KEY]); + expect(savedMetadata['xfer1']['modelName']).toEqual('xfer1'); + expect(savedMetadata['xfer1']['wordLabels']).toEqual(['bar', 'foo']); + expect(indexedDBStore.length).toEqual(1); + const modelPrime = + await tfl.models.modelFromJSON(indexedDBStore[0].modelTopology as {}); + expect(modelPrime.layers.length).toEqual(4); + expect(indexedDBStore[0].weightSpecs.length).toEqual(4); + + // Load the transfer model back. + const base2 = new BrowserFftSpeechCommandRecognizer(); + await base2.ensureModelLoaded(); + // Disable the spy on tf.loadLayersModel() first, so the subsequent + // tf.loadLayersModel() call during the load() call can use the fake + // IndexedDB handler created above. + tfLoadModelSpy.and.callThrough(); + const transfer2 = base2.createTransfer('xfer1'); + await transfer2.load(); + expect(transfer2.wordLabels()).toEqual(['bar', 'foo']); + const out1 = await transfer2.recognize(xs); + // The new prediction scores from the loaded transfer model should match + // the prediction scores from the original transfer model. + expect(out1.scores).toEqual(out0.scores); + }); + + it('Save model via custom file:// route', async () => { + setUpFakes(); + + const base = new BrowserFftSpeechCommandRecognizer(); + await base.ensureModelLoaded(); + const transfer = base.createTransfer('xfer1'); + await transfer.collectExample('foo'); + await transfer.collectExample('bar'); + await transfer.train({epochs: 1}); + + const tempSavePath = tempfile(); + await transfer.save(`file://${tempSavePath}`); + + // Disable the spy on tf.loadLayersModel() first, so the subsequent + // tf.loadLayersModel() call during the load() call can use the fake + // IndexedDB handler created above. + tfLoadModelSpy.and.callThrough(); + const modelPrime = + await tfl.loadLayersModel(`file://${tempSavePath}/model.json`); + expect(modelPrime.outputs.length).toEqual(1); + expect(modelPrime.outputs[0].shape).toEqual([null, 2]); + + rimraf(tempSavePath, () => {}); + }); + + it('listSavedTransferModels', async () => { + spyOn(tf.io, 'listModels').and.callFake(() => { + return { + 'indexeddb://tfjs-speech-commands-model/model1': + {'dateSaved': '2018-12-06T04:25:08.153Z'} + }; + }); + expect(await listSavedTransferModels()).toEqual(['model1']); + }); + + it('deleteSavedTransferModel', async () => { + const localStore: {[key: string]: string} = { + 'tfjs-speech-commands-saved-model-metadata': + JSON.stringify({'foo': {'wordLabels': ['a', 'b']}}) + }; + setUpFakeLocalStorage(localStore); + const removedModelPaths: string[] = []; + spyOn(tf.io, 'removeModel').and.callFake((modelPath: string) => { + removedModelPaths.push(modelPath); + }); + await deleteSavedTransferModel('foo'); + expect(removedModelPaths).toEqual([ + 'indexeddb://tfjs-speech-commands-model/foo' + ]); + expect(localStore).toEqual({ + 'tfjs-speech-commands-saved-model-metadata': '{}' + }); + }); +}); diff --git a/音频分类/speech-commands/src/browser_fft_utils.ts b/音频分类/speech-commands/src/browser_fft_utils.ts new file mode 100644 index 0000000..779a4e6 --- /dev/null +++ b/音频分类/speech-commands/src/browser_fft_utils.ts @@ -0,0 +1,131 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +import {promisify} from 'util'; + +import {RawAudioData} from './types'; + +export async function loadMetadataJson(url: string): + Promise<{wordLabels: string[]}> { + const HTTP_SCHEME = 'http://'; + const HTTPS_SCHEME = 'https://'; + const FILE_SCHEME = 'file://'; + if (url.indexOf(HTTP_SCHEME) === 0 || url.indexOf(HTTPS_SCHEME) === 0) { + const response = await fetch(url); + const parsed = await response.json(); + return parsed; + } else if (url.indexOf(FILE_SCHEME) === 0) { + // tslint:disable-next-line:no-require-imports + const fs = require('fs'); + const readFile = promisify(fs.readFile); + + return JSON.parse( + await readFile(url.slice(FILE_SCHEME.length), {encoding: 'utf-8'})); + } else { + throw new Error( + `Unsupported URL scheme in metadata URL: ${url}. ` + + `Supported schemes are: http://, https://, and ` + + `(node.js-only) file://`); + } +} + +let EPSILON: number = null; + +/** + * Normalize the input into zero mean and unit standard deviation. + * + * This function is safe against divison-by-zero: In case the standard + * deviation is zero, the output will be all-zero. + * + * @param x Input tensor. + * @param y Output normalized tensor. + */ +export function normalize(x: tf.Tensor): tf.Tensor { + if (EPSILON == null) { + EPSILON = tf.backend().epsilon(); + } + return tf.tidy(() => { + const {mean, variance} = tf.moments(x); + // Add an EPSILON to the denominator to prevent division-by-zero. + return tf.div(tf.sub(x, mean), tf.add(tf.sqrt(variance), EPSILON)); + }); +} + +/** + * Z-Normalize the elements of a Float32Array. + * + * Subtract the mean and divide the result by the standard deviation. + * + * @param x The Float32Array to normalize. + * @return Noramlzied Float32Array. + */ +export function normalizeFloat32Array(x: Float32Array): Float32Array { + if (x.length < 2) { + throw new Error( + 'Cannot normalize a Float32Array with fewer than 2 elements.'); + } + if (EPSILON == null) { + EPSILON = tf.backend().epsilon(); + } + return tf.tidy(() => { + const {mean, variance} = tf.moments(tf.tensor1d(x)); + const meanVal = mean.arraySync() as number; + const stdVal = Math.sqrt(variance.arraySync() as number); + const yArray = Array.from(x).map(y => (y - meanVal) / (stdVal + EPSILON)); + return new Float32Array(yArray); + }); +} + +export function getAudioContextConstructor(): AudioContext { + // tslint:disable-next-line:no-any + return (window as any).AudioContext || (window as any).webkitAudioContext; +} + +export async function getAudioMediaStream( + audioTrackConstraints?: MediaTrackConstraints): Promise { + return navigator.mediaDevices.getUserMedia({ + audio: audioTrackConstraints == null ? true : audioTrackConstraints, + video: false + }); +} + +/** + * Play raw audio waveform + * @param rawAudio Raw audio data, including the waveform and the sampling rate. + * @param onEnded Callback function to execute when the playing ends. + */ +export function playRawAudio( + rawAudio: RawAudioData, onEnded: () => void|Promise): void { + const audioContextConstructor = + // tslint:disable-next-line:no-any + (window as any).AudioContext || (window as any).webkitAudioContext; + const audioContext: AudioContext = new audioContextConstructor(); + const arrayBuffer = + audioContext.createBuffer(1, rawAudio.data.length, rawAudio.sampleRateHz); + const nowBuffering = arrayBuffer.getChannelData(0); + nowBuffering.set(rawAudio.data); + const source = audioContext.createBufferSource(); + source.buffer = arrayBuffer; + source.connect(audioContext.destination); + source.start(); + source.onended = () => { + if (onEnded != null) { + onEnded(); + } + }; +} diff --git a/音频分类/speech-commands/src/browser_fft_utils_test.ts b/音频分类/speech-commands/src/browser_fft_utils_test.ts new file mode 100644 index 0000000..7927fe7 --- /dev/null +++ b/音频分类/speech-commands/src/browser_fft_utils_test.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +import {normalize, normalizeFloat32Array} from './browser_fft_utils'; +import {expectTensorsClose} from './test_utils'; + +describe('normalize', () => { + it('Non-constant value; no memory leak', () => { + const x = tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]); + const numTensors0 = tf.memory().numTensors; + const y = normalize(x); + // Assert no memory leak. + expect(tf.memory().numTensors).toEqual(numTensors0 + 1); + expectTensorsClose( + y, + tf.tensor4d( + [-1.3416406, -0.4472135, 0.4472135, 1.3416406], [1, 2, 2, 1])); + const {mean, variance} = tf.moments(y); + expectTensorsClose(mean, tf.scalar(0)); + expectTensorsClose(variance, tf.scalar(1)); + }); + + it('Constant value', () => { + const x = tf.tensor4d([42, 42, 42, 42], [1, 2, 2, 1]); + const y = normalize(x); + expectTensorsClose(y, tf.tensor4d([0, 0, 0, 0], [1, 2, 2, 1])); + }); +}); + +describe('normalizeFloat32Array', () => { + it('Length-4 input', () => { + const xs = new Float32Array([1, 2, 3, 4]); + const numTensors0 = tf.memory().numTensors; + const ys = tf.tensor1d(normalizeFloat32Array(xs)); + // Assert no memory leak. (The extra comes from the tf.tensor1d() call + // in the testing code.) + expect(tf.memory().numTensors).toEqual(numTensors0 + 1); + expectTensorsClose( + ys, tf.tensor1d([-1.3416406, -0.4472135, 0.4472135, 1.3416406])); + }); +}); diff --git a/音频分类/speech-commands/src/browser_test_utils.ts b/音频分类/speech-commands/src/browser_test_utils.ts new file mode 100644 index 0000000..4945d2a --- /dev/null +++ b/音频分类/speech-commands/src/browser_test_utils.ts @@ -0,0 +1,77 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Testing Utilities for Browser Audio Feature Extraction. + */ + +export class FakeAudioContext { + readonly sampleRate = 44100; + + static createInstance() { + return new FakeAudioContext(); + } + + createMediaStreamSource() { + return new FakeMediaStreamAudioSourceNode(); + } + + createAnalyser() { + return new FakeAnalyser(); + } + + close(): void {} +} + +export class FakeAudioMediaStream { + constructor() {} + getTracks(): Array<{}> { + return []; + } +} + +class FakeMediaStreamAudioSourceNode { + constructor() {} + connect(node: {}): void {} +} + +class FakeAnalyser { + fftSize: number; + smoothingTimeConstant: number; + private x: number; + constructor() { + this.x = 0; + } + + getFloatFrequencyData(data: Float32Array): void { + const xs: number[] = []; + for (let i = 0; i < this.fftSize / 2; ++i) { + xs.push(this.x++); + } + data.set(new Float32Array(xs)); + } + + getFloatTimeDomainData(data: Float32Array): void { + const xs: number[] = []; + for (let i = 0; i < this.fftSize / 2; ++i) { + xs.push(-(this.x++)); + } + data.set(new Float32Array(xs)); + } + + disconnect(): void {} +} diff --git a/音频分类/speech-commands/src/dataset.ts b/音频分类/speech-commands/src/dataset.ts new file mode 100644 index 0000000..cf67c11 --- /dev/null +++ b/音频分类/speech-commands/src/dataset.ts @@ -0,0 +1,977 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +import * as tfd from '@tensorflow/tfjs-data'; +import {normalize} from './browser_fft_utils'; +import {arrayBuffer2String, concatenateArrayBuffers, getRandomInteger, getUID, string2ArrayBuffer} from './generic_utils'; +import {balancedTrainValSplitNumArrays} from './training_utils'; +import {AudioDataAugmentationOptions, Example, SpectrogramData} from './types'; + +// Descriptor for serialized dataset files: stands for: +// TensorFlow.js Speech-Commands Dataset. +// DO NOT EVER CHANGE THIS! +export const DATASET_SERIALIZATION_DESCRIPTOR = 'TFJSSCDS'; + +// A version number for the serialization. Since this needs +// to be encoded within a length-1 Uint8 array, it must be +// 1. an positive integer. +// 2. monotonically increasing over its change history. +// Item 1 is checked by unit tests. +export const DATASET_SERIALIZATION_VERSION = 1; + +/** + * Specification for an `Example` (see above). + * + * Used for serialization of `Example`. + */ +export interface ExampleSpec { + /** A label for the example. */ + label: string; + + /** Number of frames in the spectrogram. */ + spectrogramNumFrames: number; + + /** The length of each frame in the spectrogram. */ + spectrogramFrameSize: number; + + /** The key frame index of the spectrogram. */ + spectrogramKeyFrameIndex?: number; + + /** Number of samples in the raw PCM-format audio (if any). */ + rawAudioNumSamples?: number; + + /** Sampling rate of the raw audio (if any). */ + rawAudioSampleRateHz?: number; +} + +/** + * Serialized Dataset, containing a number of `Example`s in their + * serialized format. + * + * This format consists of a plain-old JSON object as the manifest, + * along with a flattened binary `ArrayBuffer`. The format facilitates + * storage and transmission. + */ +export interface SerializedExamples { + /** + * Specifications of the serialized `Example`s, serialized as a string. + */ + manifest: ExampleSpec[]; + + /** + * Serialized binary data from the `Example`s. + * + * Including the spectrograms and the raw audio (if any). + * + * For example, assuming `manifest.length` is `N`, the format of the + * `ArrayBuffer` is as follows: + * + * [spectrogramData1, rawAudio1 (if any), + * spectrogramData2, rawAudio2 (if any), + * ... + * spectrogramDataN, rawAudioN (if any)] + */ + data: ArrayBuffer; +} + +export const BACKGROUND_NOISE_TAG = '_background_noise_'; + +/** + * Configuration for getting spectrograms as tensors. + */ +export interface GetDataConfig extends AudioDataAugmentationOptions { + /** + * Number of frames. + * + * This must be smaller than or equal to the # of frames of each + * example held by the dataset. + * + * If the # of frames of an example is greater than this number, + * the following heuristics will be used to extra >= 1 examples + * of length numFrames from the original example: + * + * - If the label of the example is `BAKCGROUND_NOISE_TAG`, + * the example will be splitted into multiple examples using the + * `hopFrames` parameter (see below). + * - If the label of the example is not `BACKGROUND_NOISE_TAG`, + * the example will be splitted into multiple examples that + * all contain the maximum-intensity frame using the `hopFrames` + * parameter. + */ + numFrames?: number; + + /** + * Hop length in number of frames. + * + * Used when splitting a long example into multiple shorter ones. + * + * Must be provided if any such long examples exist. + */ + hopFrames?: number; + + /** + * Whether the spectrogram of each example will be normalized. + * + * Normalization means: + * - Subtracting the mean, and + * - Dividing the result by the standard deviation. + * + * Default: `true`. + */ + normalize?: boolean; + + /** + * Whether the examples will be shuffled prior to merged into + * `tf.Tensor`s. + * + * Default: `true`. + */ + shuffle?: boolean; + + /** + * Whether to obtain a `tf.data.Datasaet` object. + * + * Default: `false`. + */ + getDataset?: boolean; + + /** + * Batch size for dataset. + * + * Applicable only if `getDataset === true`. + */ + datasetBatchSize?: number; + + /** + * Validation split for the datasaet. + * + * Applicable only if `getDataset === true`. + * + * The data will be divided into two fractions of relative sizes + * `[1 - datasetValidationSplit, datasetValidationSplit]`, for the + * training and validation `tf.data.Dataset` objects, respectively. + * + * Must be a number between 0 and 1. + * Default: 0.15. + */ + datasetValidationSplit?: number; +} + +// tslint:disable-next-line:no-any +export type SpectrogramAndTargetsTfDataset = tfd.Dataset<{}>; + +/** + * A serializable, mutable set of speech/audio `Example`s; + */ +export class Dataset { + private examples: {[id: string]: Example}; + private label2Ids: {[label: string]: string[]}; + + /** + * Constructor of `Dataset`. + * + * If called with no arguments (i.e., `artifacts` == null), an empty dataset + * will be constructed. + * + * Else, the dataset will be deserialized from `artifacts`. + * + * @param serialized Optional serialization artifacts to deserialize. + */ + constructor(serialized?: ArrayBuffer) { + this.examples = {}; + this.label2Ids = {}; + if (serialized != null) { + // Deserialize from the provided artifacts. + const artifacts = arrayBuffer2SerializedExamples(serialized); + let offset = 0; + for (let i = 0; i < artifacts.manifest.length; ++i) { + const spec = artifacts.manifest[i]; + let byteLen = spec.spectrogramNumFrames * spec.spectrogramFrameSize; + if (spec.rawAudioNumSamples != null) { + byteLen += spec.rawAudioNumSamples; + } + byteLen *= 4; + this.addExample(deserializeExample( + {spec, data: artifacts.data.slice(offset, offset + byteLen)})); + offset += byteLen; + } + } + } + + /** + * Add an `Example` to the `Dataset` + * + * @param example A `Example`, with a label. The label must be a non-empty + * string. + * @returns The UID for the added `Example`. + */ + addExample(example: Example): string { + tf.util.assert(example != null, () => 'Got null or undefined example'); + tf.util.assert( + example.label != null && example.label.length > 0, + () => `Expected label to be a non-empty string, ` + + `but got ${JSON.stringify(example.label)}`); + const uid = getUID(); + this.examples[uid] = example; + if (!(example.label in this.label2Ids)) { + this.label2Ids[example.label] = []; + } + this.label2Ids[example.label].push(uid); + return uid; + } + + /** + * Merge the incoming dataset into this dataset + * + * @param dataset The incoming dataset to be merged into this dataset. + */ + merge(dataset: Dataset): void { + tf.util.assert( + dataset !== this, () => 'Cannot merge a dataset into itself'); + const vocab = dataset.getVocabulary(); + for (const word of vocab) { + const examples = dataset.getExamples(word); + for (const example of examples) { + this.addExample(example.example); + } + } + } + + /** + * Get a map from `Example` label to number of `Example`s with the label. + * + * @returns A map from label to number of example counts under that label. + */ + getExampleCounts(): {[label: string]: number} { + const counts: {[label: string]: number} = {}; + for (const uid in this.examples) { + const example = this.examples[uid]; + if (!(example.label in counts)) { + counts[example.label] = 0; + } + counts[example.label]++; + } + return counts; + } + + /** + * Get all examples of a given label, with their UIDs. + * + * @param label The requested label. + * @return All examples of the given `label`, along with their UIDs. + * The examples are sorted in the order in which they are added to the + * `Dataset`. + * @throws Error if label is `null` or `undefined`. + */ + getExamples(label: string): Array<{uid: string, example: Example}> { + tf.util.assert( + label != null, + () => + `Expected label to be a string, but got ${JSON.stringify(label)}`); + tf.util.assert( + label in this.label2Ids, + () => `No example of label "${label}" exists in dataset`); + const output: Array<{uid: string, example: Example}> = []; + this.label2Ids[label].forEach(id => { + output.push({uid: id, example: this.examples[id]}); + }); + return output; + } + + /** + * Get all examples and labels as tensors. + * + * - If `label` is provided and exists in the vocabulary of the `Dataset`, + * the spectrograms of all `Example`s under the `label` will be returned + * as a 4D `tf.Tensor` as `xs`. The shape of the `tf.Tensor` will be + * `[numExamples, numFrames, frameSize, 1]` + * where + * - `numExamples` is the number of `Example`s with the label + * - `numFrames` is the number of frames in each spectrogram + * - `frameSize` is the size of each spectrogram frame. + * No label Tensor will be returned. + * - If `label` is not provided, all `Example`s will be returned as `xs`. + * In addition, `ys` will contain a one-hot encoded list of labels. + * - The shape of `xs` will be: `[numExamples, numFrames, frameSize, 1]` + * - The shape of `ys` will be: `[numExamples, vocabularySize]`. + * + * @returns If `config.getDataset` is `true`, returns two `tf.data.Dataset` + * objects, one for training and one for validation. + * Else, xs` and `ys` tensors. See description above. + * @throws Error + * - if not all the involved spectrograms have matching `numFrames` and + * `frameSize`, or + * - if `label` is provided and is not present in the vocabulary of the + * `Dataset`, or + * - if the `Dataset` is currently empty. + */ + getData(label?: string, config?: GetDataConfig): { + xs: tf.Tensor4D, + ys?: tf.Tensor2D + }|[SpectrogramAndTargetsTfDataset, SpectrogramAndTargetsTfDataset] { + tf.util.assert( + this.size() > 0, + () => + `Cannot get spectrograms as tensors because the dataset is empty`); + const vocab = this.getVocabulary(); + if (label != null) { + tf.util.assert( + vocab.indexOf(label) !== -1, + () => `Label ${label} is not in the vocabulary ` + + `(${JSON.stringify(vocab)})`); + } else { + // If all words are requested, there must be at least two words in the + // vocabulary to make one-hot encoding possible. + tf.util.assert( + vocab.length > 1, + () => `One-hot encoding of labels requires the vocabulary to have ` + + `at least two words, but it has only ${vocab.length} word.`); + } + + if (config == null) { + config = {}; + } + + // Get the numFrames lengths of all the examples currently held by the + // dataset. + const sortedUniqueNumFrames = this.getSortedUniqueNumFrames(); + let numFrames: number; + let hopFrames: number; + if (sortedUniqueNumFrames.length === 1) { + numFrames = config.numFrames == null ? sortedUniqueNumFrames[0] : + config.numFrames; + hopFrames = config.hopFrames == null ? 1 : config.hopFrames; + } else { + numFrames = config.numFrames; + tf.util.assert( + numFrames != null && Number.isInteger(numFrames) && numFrames > 0, + () => `There are ${ + sortedUniqueNumFrames.length} unique lengths among ` + + `the ${this.size()} examples of this Dataset, hence numFrames ` + + `is required. But it is not provided.`); + tf.util.assert( + numFrames <= sortedUniqueNumFrames[0], + () => `numFrames (${numFrames}) exceeds the minimum numFrames ` + + `(${sortedUniqueNumFrames[0]}) among the examples of ` + + `the Dataset.`); + + hopFrames = config.hopFrames; + tf.util.assert( + hopFrames != null && Number.isInteger(hopFrames) && hopFrames > 0, + () => `There are ${ + sortedUniqueNumFrames.length} unique lengths among ` + + `the ${this.size()} examples of this Dataset, hence hopFrames ` + + `is required. But it is not provided.`); + } + + // Normalization is performed by default. + const toNormalize = config.normalize == null ? true : config.normalize; + + return tf.tidy(() => { + let xTensors: tf.Tensor3D[] = []; + let xArrays: Float32Array[] = []; + + let labelIndices: number[] = []; + let uniqueFrameSize: number; + for (let i = 0; i < vocab.length; ++i) { + const currentLabel = vocab[i]; + if (label != null && currentLabel !== label) { + continue; + } + const ids = this.label2Ids[currentLabel]; + for (const id of ids) { + const example = this.examples[id]; + const spectrogram = example.spectrogram; + const frameSize = spectrogram.frameSize; + if (uniqueFrameSize == null) { + uniqueFrameSize = frameSize; + } else { + tf.util.assert( + frameSize === uniqueFrameSize, + () => `Mismatch in frameSize ` + + `(${frameSize} vs ${uniqueFrameSize})`); + } + + const snippetLength = spectrogram.data.length / frameSize; + let focusIndex = null; + if (currentLabel !== BACKGROUND_NOISE_TAG) { + focusIndex = spectrogram.keyFrameIndex == null ? + getMaxIntensityFrameIndex(spectrogram).dataSync()[0] : + spectrogram.keyFrameIndex; + } + // TODO(cais): See if we can get rid of dataSync(); + + const snippet = + tf.tensor3d(spectrogram.data, [snippetLength, frameSize, 1]); + const windows = + getValidWindows(snippetLength, focusIndex, numFrames, hopFrames); + for (const window of windows) { + const windowedSnippet = tf.tidy(() => { + const output = tf.slice(snippet, + [window[0], 0, 0], [window[1] - window[0], -1, -1]); + return toNormalize ? normalize(output) : output; + }); + if (config.getDataset) { + // TODO(cais): See if we can do away with dataSync(); + // TODO(cais): Shuffling? + xArrays.push(windowedSnippet.dataSync() as Float32Array); + } else { + xTensors.push(windowedSnippet as tf.Tensor3D); + } + if (label == null) { + labelIndices.push(i); + } + } + tf.dispose(snippet); // For memory saving. + } + } + + if (config.augmentByMixingNoiseRatio != null) { + this.augmentByMixingNoise( + config.getDataset ? xArrays : + xTensors as Array, + labelIndices, config.augmentByMixingNoiseRatio); + } + + const shuffle = config.shuffle == null ? true : config.shuffle; + if (config.getDataset) { + const batchSize = + config.datasetBatchSize == null ? 32 : config.datasetBatchSize; + + // Split the data into two splits: training and validation. + const valSplit = config.datasetValidationSplit == null ? + 0.15 : + config.datasetValidationSplit; + tf.util.assert( + valSplit > 0 && valSplit < 1, + () => `Invalid dataset validation split: ${valSplit}`); + + const zippedXandYArrays = + xArrays.map((xArray, i) => [xArray, labelIndices[i]]); + tf.util.shuffle( + zippedXandYArrays); // Shuffle the data before splitting. + xArrays = zippedXandYArrays.map(item => item[0]) as Float32Array[]; + const yArrays = zippedXandYArrays.map(item => item[1]) as number[]; + const {trainXs, trainYs, valXs, valYs} = + balancedTrainValSplitNumArrays(xArrays, yArrays, valSplit); + + // TODO(cais): The typing around Float32Array is not working properly + // for tf.data currently. Tighten the types when the tf.data bug is + // fixed. + // tslint:disable:no-any + const xTrain = + tfd.array(trainXs as any).map(x => tf.tensor3d(x as any, [ + numFrames, uniqueFrameSize, 1 + ])); + const yTrain = tfd.array(trainYs).map( + y => tf.squeeze(tf.oneHot([y], vocab.length), [0])); + // TODO(cais): See if we can tighten the typing. + let trainDataset = tfd.zip({xs: xTrain, ys: yTrain}); + if (shuffle) { + // Shuffle the dataset. + trainDataset = trainDataset.shuffle(xArrays.length); + } + trainDataset = trainDataset.batch(batchSize).prefetch(4); + + const xVal = + tfd.array(valXs as any).map(x => tf.tensor3d(x as any, [ + numFrames, uniqueFrameSize, 1 + ])); + const yVal = tfd.array(valYs).map( + y => tf.squeeze(tf.oneHot([y], vocab.length), [0])); + let valDataset = tfd.zip({xs: xVal, ys: yVal}); + valDataset = valDataset.batch(batchSize).prefetch(4); + // tslint:enable:no-any + + // tslint:disable-next-line:no-any + return [trainDataset, valDataset] as any; + } else { + if (shuffle) { + // Shuffle the data. + const zipped: Array<{x: tf.Tensor3D, y: number}> = []; + xTensors.forEach((xTensor, i) => { + zipped.push({x: xTensor, y: labelIndices[i]}); + }); + tf.util.shuffle(zipped); + xTensors = zipped.map(item => item.x); + labelIndices = zipped.map(item => item.y); + } + + const targets = label == null ? + tf.cast(tf.oneHot(tf.tensor1d(labelIndices, 'int32'), vocab.length), + 'float32') : + undefined; + return { + xs: tf.stack(xTensors) as tf.Tensor4D, + ys: targets as tf.Tensor2D + }; + } + }); + } + + private augmentByMixingNoise( + xs: T[], labelIndices: number[], ratio: number): void { + if (xs == null || xs.length === 0) { + throw new Error( + `Cannot perform augmentation because data is null or empty`); + } + const isTypedArray = xs[0] instanceof Float32Array; + + const vocab = this.getVocabulary(); + const noiseExampleIndices: number[] = []; + const wordExampleIndices: number[] = []; + for (let i = 0; i < labelIndices.length; ++i) { + if (vocab[labelIndices[i]] === BACKGROUND_NOISE_TAG) { + noiseExampleIndices.push(i); + } else { + wordExampleIndices.push(i); + } + } + if (noiseExampleIndices.length === 0) { + throw new Error( + `Cannot perform augmentation by mixing with noise when ` + + `there is no example with label ${BACKGROUND_NOISE_TAG}`); + } + + const mixedXTensors: Array = []; + const mixedLabelIndices: number[] = []; + for (const index of wordExampleIndices) { + const noiseIndex = // Randomly sample from the noises, with replacement. + noiseExampleIndices[getRandomInteger(0, noiseExampleIndices.length)]; + const signalTensor = isTypedArray ? + tf.tensor1d(xs[index] as Float32Array) : + xs[index] as tf.Tensor; + const noiseTensor = isTypedArray ? + tf.tensor1d(xs[noiseIndex] as Float32Array) : + xs[noiseIndex] as tf.Tensor; + const mixed: tf.Tensor = + tf.tidy(() => normalize( + tf.add(signalTensor, tf.mul(noiseTensor, ratio)))); + if (isTypedArray) { + mixedXTensors.push(mixed.dataSync() as Float32Array); + } else { + mixedXTensors.push(mixed); + } + mixedLabelIndices.push(labelIndices[index]); + } + console.log( + `Data augmentation: mixing noise: added ${mixedXTensors.length} ` + + `examples`); + mixedXTensors.forEach(tensor => xs.push(tensor as T)); + labelIndices.push(...mixedLabelIndices); + } + + private getSortedUniqueNumFrames(): number[] { + const numFramesSet = new Set(); + const vocab = this.getVocabulary(); + for (let i = 0; i < vocab.length; ++i) { + const label = vocab[i]; + const ids = this.label2Ids[label]; + for (const id of ids) { + const spectrogram = this.examples[id].spectrogram; + const numFrames = spectrogram.data.length / spectrogram.frameSize; + numFramesSet.add(numFrames); + } + } + const uniqueNumFrames = [...numFramesSet]; + uniqueNumFrames.sort(); + return uniqueNumFrames; + } + + /** + * Remove an example from the `Dataset`. + * + * @param uid The UID of the example to remove. + * @throws Error if the UID doesn't exist in the `Dataset`. + */ + removeExample(uid: string): void { + if (!(uid in this.examples)) { + throw new Error(`Nonexistent example UID: ${uid}`); + } + const label = this.examples[uid].label; + delete this.examples[uid]; + const index = this.label2Ids[label].indexOf(uid); + this.label2Ids[label].splice(index, 1); + if (this.label2Ids[label].length === 0) { + delete this.label2Ids[label]; + } + } + + /** + * Set the key frame index of a given example. + * + * @param uid The UID of the example of which the `keyFrameIndex` is to be + * set. + * @param keyFrameIndex The desired value of the `keyFrameIndex`. Must + * be >= 0, < the number of frames of the example, and an integer. + * @throws Error If the UID and/or the `keyFrameIndex` value is invalid. + */ + setExampleKeyFrameIndex(uid: string, keyFrameIndex: number) { + if (!(uid in this.examples)) { + throw new Error(`Nonexistent example UID: ${uid}`); + } + const spectrogram = this.examples[uid].spectrogram; + const numFrames = spectrogram.data.length / spectrogram.frameSize; + tf.util.assert( + keyFrameIndex >= 0 && keyFrameIndex < numFrames && + Number.isInteger(keyFrameIndex), + () => `Invalid keyFrameIndex: ${keyFrameIndex}. ` + + `Must be >= 0, < ${numFrames}, and an integer.`); + spectrogram.keyFrameIndex = keyFrameIndex; + } + + /** + * Get the total number of `Example` currently held by the `Dataset`. + * + * @returns Total `Example` count. + */ + size(): number { + return Object.keys(this.examples).length; + } + + /** + * Get the total duration of the `Example` currently held by `Dataset`, + * + * in milliseconds. + * + * @return Total duration in milliseconds. + */ + durationMillis(): number { + let durMillis = 0; + const DEFAULT_FRAME_DUR_MILLIS = 23.22; + for (const key in this.examples) { + const spectrogram = this.examples[key].spectrogram; + const frameDurMillis = + spectrogram.frameDurationMillis | DEFAULT_FRAME_DUR_MILLIS; + durMillis += + spectrogram.data.length / spectrogram.frameSize * frameDurMillis; + } + return durMillis; + } + + /** + * Query whether the `Dataset` is currently empty. + * + * I.e., holds zero examples. + * + * @returns Whether the `Dataset` is currently empty. + */ + empty(): boolean { + return this.size() === 0; + } + + /** + * Remove all `Example`s from the `Dataset`. + */ + clear(): void { + this.examples = {}; + } + + /** + * Get the list of labels among all `Example`s the `Dataset` currently holds. + * + * @returns A sorted Array of labels, for the unique labels that belong to all + * `Example`s currently held by the `Dataset`. + */ + getVocabulary(): string[] { + const vocab = new Set(); + for (const uid in this.examples) { + const example = this.examples[uid]; + vocab.add(example.label); + } + const sortedVocab = [...vocab]; + sortedVocab.sort(); + return sortedVocab; + } + + /** + * Serialize the `Dataset`. + * + * The `Examples` are sorted in the following order: + * - First, the labels in the vocabulary are sorted. + * - Second, the `Example`s for every label are sorted by the order in + * which they are added to this `Dataset`. + * + * @param wordLabels Optional word label(s) to serialize. If specified, only + * the examples with labels matching the argument will be serialized. If + * any specified word label does not exist in the vocabulary of this + * dataset, an Error will be thrown. + * @returns A `ArrayBuffer` object amenable to transmission and storage. + */ + serialize(wordLabels?: string|string[]): ArrayBuffer { + const vocab = this.getVocabulary(); + tf.util.assert(!this.empty(), () => `Cannot serialize empty Dataset`); + + if (wordLabels != null) { + if (!Array.isArray(wordLabels)) { + wordLabels = [wordLabels]; + } + wordLabels.forEach(wordLabel => { + if (vocab.indexOf(wordLabel) === -1) { + throw new Error( + `Word label "${wordLabel}" does not exist in the ` + + `vocabulary of this dataset. The vocabulary is: ` + + `${JSON.stringify(vocab)}.`); + } + }); + } + + const manifest: ExampleSpec[] = []; + const buffers: ArrayBuffer[] = []; + for (const label of vocab) { + if (wordLabels != null && wordLabels.indexOf(label) === -1) { + continue; + } + const ids = this.label2Ids[label]; + for (const id of ids) { + const artifact = serializeExample(this.examples[id]); + manifest.push(artifact.spec); + buffers.push(artifact.data); + } + } + return serializedExamples2ArrayBuffer( + {manifest, data: concatenateArrayBuffers(buffers)}); + } +} + +/** Serialize an `Example`. */ +export function serializeExample(example: Example): + {spec: ExampleSpec, data: ArrayBuffer} { + const hasRawAudio = example.rawAudio != null; + const spec: ExampleSpec = { + label: example.label, + spectrogramNumFrames: + example.spectrogram.data.length / example.spectrogram.frameSize, + spectrogramFrameSize: example.spectrogram.frameSize, + }; + if (example.spectrogram.keyFrameIndex != null) { + spec.spectrogramKeyFrameIndex = example.spectrogram.keyFrameIndex; + } + + let data = example.spectrogram.data.buffer.slice(0); + if (hasRawAudio) { + spec.rawAudioNumSamples = example.rawAudio.data.length; + spec.rawAudioSampleRateHz = example.rawAudio.sampleRateHz; + + // Account for the fact that the data are all float32. + data = concatenateArrayBuffers([data, example.rawAudio.data.buffer]); + } + return {spec, data}; +} + +/** Deserialize an `Example`. */ +export function deserializeExample( + artifact: {spec: ExampleSpec, data: ArrayBuffer}): Example { + const spectrogram: SpectrogramData = { + frameSize: artifact.spec.spectrogramFrameSize, + data: new Float32Array(artifact.data.slice( + 0, + 4 * artifact.spec.spectrogramFrameSize * + artifact.spec.spectrogramNumFrames)) + }; + if (artifact.spec.spectrogramKeyFrameIndex != null) { + spectrogram.keyFrameIndex = artifact.spec.spectrogramKeyFrameIndex; + } + const ex: Example = {label: artifact.spec.label, spectrogram}; + if (artifact.spec.rawAudioNumSamples != null) { + ex.rawAudio = { + sampleRateHz: artifact.spec.rawAudioSampleRateHz, + data: new Float32Array(artifact.data.slice( + 4 * artifact.spec.spectrogramFrameSize * + artifact.spec.spectrogramNumFrames)) + }; + } + return ex; +} + +/** + * Encode intermediate serialization format as an ArrayBuffer. + * + * Format of the binary ArrayBuffer: + * 1. An 8-byte descriptor (see above). + * 2. A 4-byte version number as Uint32. + * 3. A 4-byte number for the byte length of the JSON manifest. + * 4. The encoded JSON manifest + * 5. The binary data of the spectrograms, and raw audio (if any). + * + * @param serialized: Intermediate serialization format of a dataset. + * @returns The binary conversion result as an ArrayBuffer. + */ +function serializedExamples2ArrayBuffer(serialized: SerializedExamples): + ArrayBuffer { + const manifestBuffer = + string2ArrayBuffer(JSON.stringify(serialized.manifest)); + + const descriptorBuffer = string2ArrayBuffer(DATASET_SERIALIZATION_DESCRIPTOR); + const version = new Uint32Array([DATASET_SERIALIZATION_VERSION]); + const manifestLength = new Uint32Array([manifestBuffer.byteLength]); + const headerBuffer = concatenateArrayBuffers( + [descriptorBuffer, version.buffer, manifestLength.buffer]); + + return concatenateArrayBuffers( + [headerBuffer, manifestBuffer, serialized.data]); +} + +/** Decode an ArrayBuffer as intermediate serialization format. */ +export function arrayBuffer2SerializedExamples(buffer: ArrayBuffer): + SerializedExamples { + tf.util.assert(buffer != null, () => 'Received null or undefined buffer'); + // Check descriptor. + let offset = 0; + const descriptor = arrayBuffer2String( + buffer.slice(offset, DATASET_SERIALIZATION_DESCRIPTOR.length)); + tf.util.assert( + descriptor === DATASET_SERIALIZATION_DESCRIPTOR, + () => `Deserialization error: Invalid descriptor`); + offset += DATASET_SERIALIZATION_DESCRIPTOR.length; + // Skip the version part for now. It may be used in the future. + offset += 4; + + // Extract the length of the encoded manifest JSON as a Uint32. + const manifestLength = new Uint32Array(buffer, offset, 1); + offset += 4; + const manifestBeginByte = offset; + offset = manifestBeginByte + manifestLength[0]; + const manifestBytes = buffer.slice(manifestBeginByte, offset); + const manifestString = arrayBuffer2String(manifestBytes); + const manifest = JSON.parse(manifestString); + const data = buffer.slice(offset); + return {manifest, data}; +} + +/** + * Get valid windows in a long snippet. + * + * Each window is represented by an inclusive left index and an exclusive + * right index. + * + * @param snippetLength Long of the entire snippet. Must be a positive + * integer. + * @param focusIndex Optional. If `null` or `undefined`, an array of + * evenly-spaced windows will be generated. The array of windows will + * start from the first possible location (i.e., [0, windowLength]). + * If not `null` or `undefined`, must be an integer >= 0 and < snippetLength. + * @param windowLength Length of each window. Must be a positive integer and + * <= snippetLength. + * @param windowHop Hops between successsive windows. Must be a positive + * integer. + * @returns An array of [beginIndex, endIndex] pairs. + */ +export function getValidWindows( + snippetLength: number, focusIndex: number, windowLength: number, + windowHop: number): Array<[number, number]> { + tf.util.assert( + Number.isInteger(snippetLength) && snippetLength > 0, + () => + `snippetLength must be a positive integer, but got ${snippetLength}`); + if (focusIndex != null) { + tf.util.assert( + Number.isInteger(focusIndex) && focusIndex >= 0, + () => + `focusIndex must be a non-negative integer, but got ${focusIndex}`); + } + tf.util.assert( + Number.isInteger(windowLength) && windowLength > 0, + () => `windowLength must be a positive integer, but got ${windowLength}`); + tf.util.assert( + Number.isInteger(windowHop) && windowHop > 0, + () => `windowHop must be a positive integer, but got ${windowHop}`); + tf.util.assert( + windowLength <= snippetLength, + () => `windowLength (${windowLength}) exceeds snippetLength ` + + `(${snippetLength})`); + tf.util.assert( + focusIndex < snippetLength, + () => `focusIndex (${focusIndex}) equals or exceeds snippetLength ` + + `(${snippetLength})`); + + if (windowLength === snippetLength) { + return [[0, snippetLength]]; + } + + const windows: Array<[number, number]> = []; + + if (focusIndex == null) { + // Deal with the special case of no focus frame: + // Output an array of evenly-spaced windows, starting from + // the first possible location. + let begin = 0; + while (begin + windowLength <= snippetLength) { + windows.push([begin, begin + windowLength]); + begin += windowHop; + } + return windows; + } + + const leftHalf = Math.floor(windowLength / 2); + let left = focusIndex - leftHalf; + if (left < 0) { + left = 0; + } else if (left + windowLength > snippetLength) { + left = snippetLength - windowLength; + } + + while (true) { + if (left - windowHop < 0 || focusIndex >= left - windowHop + windowLength) { + break; + } + left -= windowHop; + } + + while (left + windowLength <= snippetLength) { + if (focusIndex < left) { + break; + } + windows.push([left, left + windowLength]); + left += windowHop; + } + return windows; +} + +/** + * Calculate an intensity profile from a spectrogram. + * + * The intensity at each time frame is caclulated by simply averaging all the + * spectral values that belong to that time frame. + * + * @param spectrogram The input spectrogram. + * @returns The temporal profile of the intensity as a 1D tf.Tensor of shape + * `[numFrames]`. + */ +export function spectrogram2IntensityCurve(spectrogram: SpectrogramData): + tf.Tensor { + return tf.tidy(() => { + const numFrames = spectrogram.data.length / spectrogram.frameSize; + const x = tf.tensor2d(spectrogram.data, [numFrames, spectrogram.frameSize]); + return tf.mean(x, -1); + }); +} + +/** + * Get the index to the maximum intensity frame. + * + * The intensity of each time frame is calculated as the arithmetic mean of + * all the spectral values belonging to that time frame. + * + * @param spectrogram The input spectrogram. + * @returns The index to the time frame containing the maximum intensity. + */ +export function getMaxIntensityFrameIndex(spectrogram: SpectrogramData): + tf.Scalar { + return tf.tidy(() => tf.argMax(spectrogram2IntensityCurve(spectrogram))); +} diff --git a/音频分类/speech-commands/src/dataset_test.ts b/音频分类/speech-commands/src/dataset_test.ts new file mode 100644 index 0000000..272ead6 --- /dev/null +++ b/音频分类/speech-commands/src/dataset_test.ts @@ -0,0 +1,1325 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +import {test_util} from '@tensorflow/tfjs-core'; + +import {normalize} from './browser_fft_utils'; +import {arrayBuffer2SerializedExamples, BACKGROUND_NOISE_TAG, Dataset, DATASET_SERIALIZATION_DESCRIPTOR, DATASET_SERIALIZATION_VERSION, deserializeExample, getMaxIntensityFrameIndex, getValidWindows, serializeExample, spectrogram2IntensityCurve, SpectrogramAndTargetsTfDataset} from './dataset'; +import {string2ArrayBuffer} from './generic_utils'; +import {expectTensorsClose} from './test_utils'; +import {Example, RawAudioData, SpectrogramData} from './types'; + +describe('Dataset', () => { + const FAKE_NUM_FRAMES = 4; + const FAKE_FRAME_SIZE = 16; + + function getFakeExample( + label: string, numFrames = FAKE_NUM_FRAMES, frameSize = FAKE_FRAME_SIZE, + spectrogramData?: number[]): Example { + if (spectrogramData == null) { + spectrogramData = []; + let counter = 0; + for (let i = 0; i < numFrames * frameSize; ++i) { + spectrogramData.push(counter++); + } + } + return { + label, + spectrogram: {data: new Float32Array(spectrogramData), frameSize} + }; + } + + function addThreeExamplesToDataset( + dataset: Dataset, labelA = 'a', labelB = 'b'): string[] { + const ex1 = getFakeExample(labelA); + const uid1 = dataset.addExample(ex1); + const ex2 = getFakeExample(labelA); + const uid2 = dataset.addExample(ex2); + const ex3 = getFakeExample(labelB); + const uid3 = dataset.addExample(ex3); + return [uid1, uid2, uid3]; + } + + it('Constructor', () => { + const dataset = new Dataset(); + expect(dataset.empty()).toEqual(true); + expect(dataset.size()).toEqual(0); + }); + + it('addExample', () => { + const dataset = new Dataset(); + + const uids: string[] = []; + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + expect(uid1).toMatch(/^([0-9a-f]+\-)+[0-9a-f]+$/); + uids.push(uid1); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(1); + expect(dataset.getExampleCounts()).toEqual({'a': 1}); + + const ex2 = getFakeExample('a'); + const uid2 = dataset.addExample(ex2); + expect(uids.indexOf(uid2)).toEqual(-1); + uids.push(uid2); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(2); + expect(dataset.getExampleCounts()).toEqual({'a': 2}); + + const ex3 = getFakeExample('b'); + const uid3 = dataset.addExample(ex3); + expect(uids.indexOf(uid3)).toEqual(-1); + uids.push(uid3); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(3); + expect(dataset.getExampleCounts()).toEqual({'a': 2, 'b': 1}); + }); + + it('addExample with null fails', () => { + const dataset = new Dataset(); + expect(() => dataset.addExample(null)) + .toThrowError('Got null or undefined example'); + }); + + it('addExample with invalid label fails', () => { + const dataset = new Dataset(); + expect(() => dataset.addExample(getFakeExample(null))) + .toThrowError(/Expected label to be a non-empty string.*null/); + expect(() => dataset.addExample(getFakeExample(undefined))) + .toThrowError(/Expected label to be a non-empty string.*undefined/); + expect(() => dataset.addExample(getFakeExample(''))) + .toThrowError(/Expected label to be a non-empty string/); + }); + + it('durationMillis', () => { + const dataset = new Dataset(); + expect(dataset.durationMillis()).toEqual(0); + const ex1 = getFakeExample('a'); + dataset.addExample(ex1); + const durationPerExample = dataset.durationMillis(); + expect(durationPerExample).toBeGreaterThan(0); + const ex2 = getFakeExample('b'); + dataset.addExample(ex2); + expect(dataset.durationMillis()).toEqual(durationPerExample * 2); + dataset.clear(); + expect(dataset.durationMillis()).toEqual(0); + }); + + it('merge two non-empty datasets', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + const datasetPrime = new Dataset(); + addThreeExamplesToDataset(datasetPrime); + const ex = getFakeExample('foo'); + datasetPrime.addExample(ex); + const duration0 = dataset.durationMillis(); + dataset.merge(datasetPrime); + expect(dataset.getExampleCounts()).toEqual({a: 4, b: 2, foo: 1}); + // Check that the content of the incoming dataset is not affected. + expect(datasetPrime.getExampleCounts()).toEqual({a: 2, b: 1, foo: 1}); + expect(dataset.durationMillis()) + .toEqual(duration0 + datasetPrime.durationMillis()); + }); + + it('merge non-empty dataset into an empty one', () => { + const dataset = new Dataset(); + const datasetPrime = new Dataset(); + addThreeExamplesToDataset(datasetPrime); + dataset.merge(datasetPrime); + expect(dataset.getExampleCounts()).toEqual({a: 2, b: 1}); + // Check that the content of the incoming dataset is not affected. + expect(datasetPrime.getExampleCounts()).toEqual({a: 2, b: 1}); + }); + + it('merge empty dataset into an non-empty one', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + const datasetPrime = new Dataset(); + dataset.merge(datasetPrime); + expect(dataset.getExampleCounts()).toEqual({a: 2, b: 1}); + // Check that the content of the incoming dataset is not affected. + expect(datasetPrime.empty()).toEqual(true); + }); + + it('getExamples', () => { + const dataset = new Dataset(); + const [uid1, uid2, uid3] = addThreeExamplesToDataset(dataset); + const out1 = dataset.getExamples('a'); + expect(out1.length).toEqual(2); + expect(out1[0].uid).toEqual(uid1); + expect(out1[0].example.label).toEqual('a'); + expect(out1[1].uid).toEqual(uid2); + expect(out1[1].example.label).toEqual('a'); + const out2 = dataset.getExamples('b'); + expect(out2.length).toEqual(1); + expect(out2[0].uid).toEqual(uid3); + expect(out2[0].example.label).toEqual('b'); + }); + + it('getExamples after addExample', () => { + const dataset = new Dataset(); + const [uid1, uid2] = addThreeExamplesToDataset(dataset); + const out1 = dataset.getExamples('a'); + expect(out1.length).toEqual(2); + expect(out1[0].uid).toEqual(uid1); + expect(out1[0].example.label).toEqual('a'); + expect(out1[1].uid).toEqual(uid2); + expect(out1[1].example.label).toEqual('a'); + + const ex = getFakeExample('a'); + const uid4 = dataset.addExample(ex); + const out2 = dataset.getExamples('a'); + expect(out2.length).toEqual(3); + expect(out2[0].uid).toEqual(uid1); + expect(out2[0].example.label).toEqual('a'); + expect(out2[1].uid).toEqual(uid2); + expect(out2[1].example.label).toEqual('a'); + expect(out2[2].uid).toEqual(uid4); + expect(out2[2].example.label).toEqual('a'); + }); + + it('getExamples after removeExample', () => { + const dataset = new Dataset(); + const [uid1, uid2] = addThreeExamplesToDataset(dataset); + const out1 = dataset.getExamples('a'); + expect(out1.length).toEqual(2); + expect(out1[0].uid).toEqual(uid1); + expect(out1[0].example.label).toEqual('a'); + expect(out1[1].uid).toEqual(uid2); + expect(out1[1].example.label).toEqual('a'); + + dataset.removeExample(uid1); + const out2 = dataset.getExamples('a'); + expect(out2.length).toEqual(1); + expect(out2[0].uid).toEqual(uid2); + expect(out2[0].example.label).toEqual('a'); + + dataset.removeExample(uid2); + expect(() => dataset.getExamples('a')) + .toThrowError(/No example .*a.* exists/); + }); + + it('getExamples after removeExample followed by addExample', () => { + const dataset = new Dataset(); + const [uid1, uid2] = addThreeExamplesToDataset(dataset); + const out1 = dataset.getExamples('a'); + expect(out1.length).toEqual(2); + expect(out1[0].uid).toEqual(uid1); + expect(out1[0].example.label).toEqual('a'); + expect(out1[1].uid).toEqual(uid2); + expect(out1[1].example.label).toEqual('a'); + + dataset.removeExample(uid1); + const out2 = dataset.getExamples('a'); + expect(out2.length).toEqual(1); + expect(out2[0].uid).toEqual(uid2); + expect(out2[0].example.label).toEqual('a'); + + const ex = getFakeExample('a'); + const uid4 = dataset.addExample(ex); + const out3 = dataset.getExamples('a'); + expect(out3.length).toEqual(2); + expect(out3[0].uid).toEqual(uid2); + expect(out3[0].example.label).toEqual('a'); + expect(out3[1].uid).toEqual(uid4); + expect(out3[1].example.label).toEqual('a'); + }); + + it('getExamples with nonexistent label fails', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + expect(() => dataset.getExamples('labelC')) + .toThrowError(/No example .*labelC.* exists/); + }); + + it('removeExample', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(1); + expect(dataset.getExampleCounts()).toEqual({'a': 1}); + + const ex2 = getFakeExample('a'); + const uid2 = dataset.addExample(ex2); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(2); + expect(dataset.getExampleCounts()).toEqual({'a': 2}); + + const ex3 = getFakeExample('b'); + const uid3 = dataset.addExample(ex3); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(3); + expect(dataset.getExampleCounts()).toEqual({'a': 2, 'b': 1}); + + dataset.removeExample(uid1); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(2); + expect(dataset.getExampleCounts()).toEqual({'a': 1, 'b': 1}); + + dataset.removeExample(uid2); + expect(dataset.empty()).toEqual(false); + expect(dataset.size()).toEqual(1); + expect(dataset.getExampleCounts()).toEqual({'b': 1}); + + dataset.removeExample(uid3); + expect(dataset.empty()).toEqual(true); + expect(dataset.size()).toEqual(0); + expect(dataset.getExampleCounts()).toEqual({}); + }); + + it('removeExample with nonexistent UID fails', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + dataset.removeExample(uid1); + expect(() => dataset.removeExample(uid1)) + .toThrowError(/Nonexistent example UID/); + }); + + it('setExampleKeyFrameIndex: works`', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + dataset.setExampleKeyFrameIndex(uid1, 1); + expect(ex1.spectrogram.keyFrameIndex).toEqual(1); + const numFrames = ex1.spectrogram.data.length / ex1.spectrogram.frameSize; + dataset.setExampleKeyFrameIndex(uid1, numFrames - 1); + expect(ex1.spectrogram.keyFrameIndex).toEqual(numFrames - 1); + }); + + it('setExampleFrameIndex: serialization-deserialization', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + const numFrames = ex1.spectrogram.data.length / ex1.spectrogram.frameSize; + dataset.setExampleKeyFrameIndex(uid1, numFrames - 1); + expect(ex1.spectrogram.keyFrameIndex).toEqual(numFrames - 1); + + const datasetPrime = new Dataset(dataset.serialize()); + const ex1Prime = datasetPrime.getExamples('a')[0]; + expect(ex1Prime.example.spectrogram.keyFrameIndex).toEqual(numFrames - 1); + }); + + it('setExampleKeyFrameIndex: Invalid example UID leads to error`', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + expect(() => dataset.setExampleKeyFrameIndex(uid1 + '_foo', 0)) + .toThrowError(/Nonexistent example UID/); + }); + + it('setExampleKeyFrameIndex: Negative index leads to error`', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + expect(() => dataset.setExampleKeyFrameIndex(uid1, -1)) + .toThrowError(/Invalid keyFrameIndex/); + }); + + it('setExampleKeyFrameIndex: Too large index leads to error`', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const numFrames = ex1.spectrogram.data.length / ex1.spectrogram.frameSize; + const uid1 = dataset.addExample(ex1); + expect(() => dataset.setExampleKeyFrameIndex(uid1, numFrames)) + .toThrowError(/Invalid keyFrameIndex/); + expect(() => dataset.setExampleKeyFrameIndex(uid1, numFrames + 1)) + .toThrowError(/Invalid keyFrameIndex/); + }); + + it('setExampleKeyFrameIndex: Non-integr value leads to error`', () => { + const dataset = new Dataset(); + + const ex1 = getFakeExample('a'); + const uid1 = dataset.addExample(ex1); + expect(() => dataset.setExampleKeyFrameIndex(uid1, 0.5)) + .toThrowError(/Invalid keyFrameIndex/); + }); + + it('getVocabulary', () => { + const dataset = new Dataset(); + expect(dataset.getVocabulary()).toEqual([]); + + const ex1 = getFakeExample('a'); + const ex2 = getFakeExample('a'); + const ex3 = getFakeExample('b'); + + const uid1 = dataset.addExample(ex1); + expect(dataset.getVocabulary()).toEqual(['a']); + const uid2 = dataset.addExample(ex2); + expect(dataset.getVocabulary()).toEqual(['a']); + const uid3 = dataset.addExample(ex3); + expect(dataset.getVocabulary()).toEqual(['a', 'b']); + + dataset.removeExample(uid1); + expect(dataset.getVocabulary()).toEqual(['a', 'b']); + dataset.removeExample(uid2); + expect(dataset.getVocabulary()).toEqual(['b']); + dataset.removeExample(uid3); + expect(dataset.getVocabulary()).toEqual([]); + }); + + it('getSpectrogramsAsTensors with label', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + + const out1 = dataset.getData('a') as {xs: tf.Tensor, ys: tf.Tensor}; + expect(out1.xs.shape).toEqual([2, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + expect(out1.ys).toBeUndefined(); + const out2 = dataset.getData('b') as {xs: tf.Tensor, ys: tf.Tensor}; + expect(out2.xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + expect(out2.ys).toBeUndefined(); + }); + + it('getSpectrogramsAsTensors after removeExample', () => { + const dataset = new Dataset(); + const [uid1, uid2] = addThreeExamplesToDataset(dataset); + + dataset.removeExample(uid1); + const out1 = dataset.getData(null, {shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + expect(out1.xs.shape).toEqual([2, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + expectTensorsClose(out1.ys, tf.tensor2d([[1, 0], [0, 1]])); + + const out2 = dataset.getData('a') as {xs: tf.Tensor, ys: tf.Tensor}; + expect(out2.xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + + dataset.removeExample(uid2); + expect(() => dataset.getData('a')) + .toThrowError(/Label a is not in the vocabulary/); + + const out3 = dataset.getData('b') as {xs: tf.Tensor, ys: tf.Tensor}; + expect(out3.xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + }); + + it('getSpectrogramsAsTensors w/o label on one-word vocabulary fails', () => { + const dataset = new Dataset(); + const [uid1, uid2] = addThreeExamplesToDataset(dataset); + dataset.removeExample(uid1); + dataset.removeExample(uid2); + + expect(() => dataset.getData()) + .toThrowError(/requires .* at least two words/); + }); + + it('getSpectrogramsAsTensors without label', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + + const out = dataset.getData(null, {shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + expect(out.xs.shape).toEqual([3, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + expectTensorsClose(out.ys, tf.tensor2d([[1, 0], [1, 0], [0, 1]])); + }); + + it('getSpectrogramsAsTensors without label as tf.data.Dataset', async () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + + const [trainDataset, valDataset] = dataset.getData(null, { + getDataset: true, + datasetBatchSize: 1, + datasetValidationSplit: 1 / 3 + }) as [SpectrogramAndTargetsTfDataset, SpectrogramAndTargetsTfDataset]; + let numTrain = 0; + await trainDataset.forEachAsync( + (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => { + const {xs, ys} = xAndY; + numTrain++; + expect(xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + expect(xs.isDisposed).toEqual(false); + expect(ys.shape).toEqual([1, 2]); + expect(ys.isDisposed).toEqual(false); + }); + expect(numTrain).toEqual(2); + let numVal = 0; + await valDataset.forEachAsync( + (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => { + const {xs, ys} = xAndY; + numVal++; + expect(xs.shape).toEqual([1, FAKE_NUM_FRAMES, FAKE_FRAME_SIZE, 1]); + expect(xs.isDisposed).toEqual(false); + expect(ys.shape).toEqual([1, 2]); + expect(ys.isDisposed).toEqual(false); + }); + expect(numVal).toEqual(1); + }); + + it('getData w/ mixing-noise augmentation: get tf.data.Dataset', async () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + BACKGROUND_NOISE_TAG, 6, 2, + [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + const numFrames = 3; + const [trainDataset, valDataset] = dataset.getData(null, { + numFrames, + hopFrames: 1, + augmentByMixingNoiseRatio: 0.5, + getDataset: true, + datasetBatchSize: 1, + datasetValidationSplit: 1 / 3 + }) as [SpectrogramAndTargetsTfDataset, SpectrogramAndTargetsTfDataset]; + + let numTrain = 0; + await trainDataset.forEachAsync( + (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => { + const {xs, ys} = xAndY; + numTrain++; + expect(xs.shape).toEqual([1, numFrames, 2, 1]); + expect(xs.isDisposed).toEqual(false); + expect(ys.shape).toEqual([1, 2]); + expect(ys.isDisposed).toEqual(false); + }); + let numVal = 0; + await valDataset.forEachAsync( + (xAndY: {xs: tf.Tensor2D, ys: tf.Tensor2D}) => { + const {xs, ys} = xAndY; + numVal++; + expect(xs.shape).toEqual([1, numFrames, 2, 1]); + expect(xs.isDisposed).toEqual(false); + expect(ys.shape).toEqual([1, 2]); + expect(ys.isDisposed).toEqual(false); + }); + expect(numTrain).toEqual(7); // Without augmentation, it'd be 5. + expect(numVal).toEqual(3); // Without augmentation, it'd be 2. + }); + + it('getData w/ mixing-noise augmentation w/o noise tag errors', async () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + // Lacks BACKGROUND_NOISE_TAG. + + const numFrames = 3; + expect(() => dataset.getData(null, { + numFrames, + hopFrames: 1, + augmentByMixingNoiseRatio: 0.5, + getDataset: true, + datasetBatchSize: 1, + datasetValidationSplit: 1 / 3 + })).toThrowError(/Cannot perform augmentation .* no example .*noise/); + }); + + it('getSpectrogramsAsTensors with invalid valSplit leads to error', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + expect(() => dataset.getData(null, { + getDataset: true, + datasetValidationSplit: 1.2 + })).toThrowError(/Invalid dataset validation split/); + }); + + it('getSpectrogramsAsTensors on nonexistent label fails', () => { + const dataset = new Dataset(); + addThreeExamplesToDataset(dataset); + + expect(() => dataset.getData('label3')) + .toThrowError(/Label label3 is not in the vocabulary/); + }); + + it('getSpectrogramsAsTensors on empty Dataset fails', () => { + const dataset = new Dataset(); + expect(() => dataset.getData()) + .toThrowError(/Cannot get spectrograms as tensors because.*empty/); + }); + + it('Ragged example lengths and one window per example', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample('foo', 5)); + dataset.addExample(getFakeExample('bar', 6)); + dataset.addExample(getFakeExample('foo', 7)); + + const {xs, ys} = + dataset.getData(null, {numFrames: 5, hopFrames: 5, shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + expect(xs.shape).toEqual([3, 5, FAKE_FRAME_SIZE, 1]); + expectTensorsClose(ys, tf.tensor2d([[1, 0], [0, 1], [0, 1]])); + }); + + it('Ragged example lengths and one window per example, with label', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample('foo', 5)); + dataset.addExample(getFakeExample('bar', 6)); + dataset.addExample(getFakeExample('foo', 7)); + + const {xs, ys} = dataset.getData('foo', {numFrames: 5, hopFrames: 5}) as + {xs: tf.Tensor, ys: tf.Tensor}; + expect(xs.shape).toEqual([2, 5, FAKE_FRAME_SIZE, 1]); + expect(ys).toBeUndefined(); + }); + + it('Ragged example lengths and multiple windows per example', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + const {xs, ys} = + dataset.getData( + null, + {numFrames: 3, hopFrames: 1, shuffle: false, normalize: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + const windows = tf.unstack(xs); + + expect(windows.length).toEqual(6); + expectTensorsClose(windows[0], tf.tensor3d([1, 1, 2, 2, 3, 3], [3, 2, 1])); + expectTensorsClose(windows[1], tf.tensor3d([2, 2, 3, 3, 2, 2], [3, 2, 1])); + expectTensorsClose(windows[2], tf.tensor3d([3, 3, 2, 2, 1, 1], [3, 2, 1])); + expectTensorsClose( + windows[3], tf.tensor3d([10, 10, 20, 20, 30, 30], [3, 2, 1])); + expectTensorsClose( + windows[4], tf.tensor3d([20, 20, 30, 30, 20, 20], [3, 2, 1])); + expectTensorsClose( + windows[5], tf.tensor3d([30, 30, 20, 20, 10, 10], [3, 2, 1])); + expectTensorsClose( + ys, tf.tensor2d([[1, 0], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1]])); + }); + + it('getData with mixing-noise augmentation: get tensors', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + BACKGROUND_NOISE_TAG, 6, 2, + [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + const {xs, ys} = dataset.getData(null, { + numFrames: 3, + hopFrames: 1, + shuffle: false, + normalize: false, + augmentByMixingNoiseRatio: 0.5 + }) as {xs: tf.Tensor, ys: tf.Tensor}; + + // 3 of the newly-generated ones at the end are from the augmentation. + expect(xs.shape).toEqual([10, 3, 2, 1]); + expect(ys.shape).toEqual([10, 2]); + const indices = tf.argMax(ys, -1).dataSync(); + const backgroundNoiseIndex = indices[0]; + for (let i = 0; i < 3; ++i) { + expect(indices[indices.length - 1 - i] === backgroundNoiseIndex) + .toEqual(false); + } + }); + + // TODO(cais): Test that augmentByNoise without BACKGROUND_NOISE tag leads to + // Error. + + it('getSpectrogramsAsTensors: normalize=true', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + // `normalize` is `true` by default. + const {xs, ys} = + dataset.getData(null, {numFrames: 3, hopFrames: 1, shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + const windows = tf.unstack(xs); + + expect(windows.length).toEqual(6); + for (let i = 0; i < 6; ++i) { + const {mean, variance} = tf.moments(windows[0]); + expectTensorsClose(mean, tf.scalar(0)); + expectTensorsClose(variance, tf.scalar(1)); + } + expectTensorsClose( + windows[0], normalize(tf.tensor3d([1, 1, 2, 2, 3, 3], [3, 2, 1]))); + expectTensorsClose( + windows[1], normalize(tf.tensor3d([2, 2, 3, 3, 2, 2], [3, 2, 1]))); + expectTensorsClose( + windows[2], normalize(tf.tensor3d([3, 3, 2, 2, 1, 1], [3, 2, 1]))); + expectTensorsClose( + windows[3], + normalize(tf.tensor3d([10, 10, 20, 20, 30, 30], [3, 2, 1]))); + expectTensorsClose( + windows[4], + normalize(tf.tensor3d([20, 20, 30, 30, 20, 20], [3, 2, 1]))); + expectTensorsClose( + windows[5], + normalize(tf.tensor3d([30, 30, 20, 20, 10, 10], [3, 2, 1]))); + expectTensorsClose( + ys, tf.tensor2d([[1, 0], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1]])); + }); + + it('getSpectrogramsAsTensors: shuffle=true leads to random order', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + const argMaxTensors: tf.Tensor[] = []; + for (let i = 0; i < 5; ++i) { + // `shuffle` is `true` by default. + const {ys} = dataset.getData(null, {numFrames: 3, hopFrames: 1}) as + {xs: tf.Tensor, ys: tf.Tensor}; + // Use `argMax()` to convert the one-hot-encoded `ys` to indices. + argMaxTensors.push(tf.argMax(ys, -1)); + } + // `argMaxTensors` are the indices for the targets. + // We stack them into a 2D tensor and then calculate the variance along + // the examples dimension, in order to detect variance in the indices + // between the iterations above. + const argMaxMerged = tf.stack(argMaxTensors); + // Assert that the orders are not all the same. This is asserting that + // the indices are not all the same among the 5 iterations above. + const {variance} = tf.moments(argMaxMerged, 0); + expect(tf.max(variance).dataSync()[0]).toBeGreaterThan(0); + }); + + it('getSpectrogramsAsTensors: shuffle=false leads to constant order', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + const argMaxTensors: tf.Tensor[] = []; + for (let i = 0; i < 5; ++i) { + const {ys} = + dataset.getData(null, {numFrames: 3, hopFrames: 1, shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + argMaxTensors.push(tf.argMax(ys, -1)); + } + // `argMaxTensors` are the indices for the targets. + // We stack them into a 2D tensor and then calculate the variance along + // the examples dimension, in order to detect variance in the indices + // between the iterations above. + const argMaxMerged = tf.stack(argMaxTensors); + // Assert that the orders are not all the same. This is asserting that + // the indices are all the same among the 5 iterations above. + const {variance} = tf.moments(argMaxMerged, 0); + expect(tf.max(variance).dataSync()[0]).toEqual(0); + }); + + it('Uniform example lengths and multiple windows per example', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 6, 2, [0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + + const {xs, ys} = + dataset.getData( + null, + {numFrames: 5, hopFrames: 1, shuffle: false, normalize: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + const windows = tf.unstack(xs); + expect(windows.length).toEqual(4); + expectTensorsClose( + windows[0], tf.tensor3d([0, 0, 1, 1, 2, 2, 3, 3, 2, 2], [5, 2, 1])); + expectTensorsClose( + windows[1], tf.tensor3d([1, 1, 2, 2, 3, 3, 2, 2, 1, 1], [5, 2, 1])); + expectTensorsClose( + windows[2], + tf.tensor3d([10, 10, 20, 20, 30, 30, 20, 20, 10, 10], [5, 2, 1])); + expectTensorsClose( + windows[3], + tf.tensor3d([20, 20, 30, 30, 20, 20, 10, 10, 0, 0], [5, 2, 1])); + expectTensorsClose(ys, tf.tensor2d([[1, 0], [1, 0], [0, 1], [0, 1]])); + }); + + it('Ragged examples containing background noise', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + BACKGROUND_NOISE_TAG, 7, 2, + [0, 0, 10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 6, 2, [0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + const {xs, ys} = + dataset.getData( + null, + {numFrames: 3, hopFrames: 2, shuffle: false, normalize: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + const windows = tf.unstack(xs); + expect(windows.length).toEqual(4); + expectTensorsClose( + windows[0], tf.tensor3d([0, 0, 10, 10, 20, 20], [3, 2, 1])); + expectTensorsClose( + windows[1], tf.tensor3d([20, 20, 30, 30, 20, 20], [3, 2, 1])); + expectTensorsClose( + windows[2], tf.tensor3d([20, 20, 10, 10, 0, 0], [3, 2, 1])); + expectTensorsClose(windows[3], tf.tensor3d([2, 2, 3, 3, 2, 2], [3, 2, 1])); + expectTensorsClose(ys, tf.tensor2d([[1, 0], [1, 0], [1, 0], [0, 1]])); + }); + + it('numFrames exceeding minmum example length leads to Error', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + expect(() => dataset.getData(null, {numFrames: 6, hopFrames: 2})) + .toThrowError(/.*6.*exceeds the minimum numFrames .*5.*/); + }); + + it('Ragged examples with no numFrames leads to Error', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + expect(() => dataset.getData(null)).toThrowError(/numFrames is required/); + }); + + it('Ragged examples with no hopFrames leads to Error', () => { + const dataset = new Dataset(); + dataset.addExample(getFakeExample( + 'foo', 6, 2, [10, 10, 20, 20, 30, 30, 20, 20, 10, 10, 0, 0])); + dataset.addExample( + getFakeExample('bar', 5, 2, [1, 1, 2, 2, 3, 3, 2, 2, 1, 1])); + expect(() => dataset.getData(null, { + numFrames: 4 + })).toThrowError(/hopFrames is required/); + }); +}); + +describe('Dataset serialization', () => { + function getRandomExample( + label: string, numFrames: number, frameSize: number, + rawAudioNumSamples?: number, rawAudioSampleRateHz?: number): Example { + const spectrogramData = []; + for (let i = 0; i < numFrames * frameSize; ++i) { + spectrogramData.push(Math.random()); + } + const output: Example = { + label, + spectrogram: {data: new Float32Array(spectrogramData), frameSize} + }; + if (rawAudioNumSamples != null) { + const rawAudioData: number[] = []; + for (let i = 0; i < rawAudioNumSamples; ++i) { + rawAudioData.push(Math.random()); + } + const rawAudio: RawAudioData = { + data: new Float32Array(rawAudioData), + sampleRateHz: rawAudioSampleRateHz + }; + output.rawAudio = rawAudio; + } + return output; + } + + it('serializeExample-deserializeExample round trip, no raw audio', () => { + const label = 'foo'; + const numFrames = 10; + const frameSize = 16; + const ex = getRandomExample(label, numFrames, frameSize); + const artifacts = serializeExample(ex); + expect(artifacts.spec.label).toEqual(label); + expect(artifacts.spec.spectrogramNumFrames).toEqual(numFrames); + expect(artifacts.spec.spectrogramFrameSize).toEqual(frameSize); + expect(artifacts.spec.rawAudioNumSamples).toBeUndefined(); + expect(artifacts.spec.rawAudioSampleRateHz).toBeUndefined(); + expect(artifacts.data.byteLength).toEqual(4 * numFrames * frameSize); + + const exPrime = deserializeExample(artifacts); + expect(exPrime.label).toEqual(ex.label); + expect(exPrime.spectrogram.frameSize).toEqual(ex.spectrogram.frameSize); + test_util.expectArraysEqual(exPrime.spectrogram.data, ex.spectrogram.data); + }); + + it('serializeExample-deserializeExample round trip, with raw audio', () => { + const label = 'foo'; + const numFrames = 10; + const frameSize = 16; + const rawAudioNumSamples = 200; + const rawAudioSampleRateHz = 48000; + const ex = getRandomExample( + label, numFrames, frameSize, rawAudioNumSamples, rawAudioSampleRateHz); + const artifacts = serializeExample(ex); + expect(artifacts.spec.label).toEqual(label); + expect(artifacts.spec.spectrogramNumFrames).toEqual(numFrames); + expect(artifacts.spec.spectrogramFrameSize).toEqual(frameSize); + expect(artifacts.spec.rawAudioNumSamples).toEqual(rawAudioNumSamples); + expect(artifacts.spec.rawAudioSampleRateHz).toEqual(rawAudioSampleRateHz); + expect(artifacts.data.byteLength) + .toEqual(4 * (numFrames * frameSize + rawAudioNumSamples)); + + const exPrime = deserializeExample(artifacts); + expect(exPrime.label).toEqual(ex.label); + expect(exPrime.spectrogram.frameSize).toEqual(ex.spectrogram.frameSize); + expect(exPrime.rawAudio.sampleRateHz).toEqual(ex.rawAudio.sampleRateHz); + test_util.expectArraysEqual(exPrime.spectrogram.data, ex.spectrogram.data); + test_util.expectArraysEqual(exPrime.rawAudio.data, ex.rawAudio.data); + }); + + it('Dataset.serialize()', () => { + const dataset = new Dataset(); + const ex1 = getRandomExample('foo', 10, 16); + const ex2 = getRandomExample('bar', 12, 16); + const ex3 = getRandomExample('qux', 14, 16); + const ex4 = getRandomExample('foo', 13, 16); + dataset.addExample(ex1); + dataset.addExample(ex2); + dataset.addExample(ex3); + dataset.addExample(ex4); + const buffer = dataset.serialize(); + const {manifest, data} = arrayBuffer2SerializedExamples(buffer); + expect(manifest).toEqual([ + {label: 'bar', spectrogramNumFrames: 12, spectrogramFrameSize: 16}, + {label: 'foo', spectrogramNumFrames: 10, spectrogramFrameSize: 16}, + {label: 'foo', spectrogramNumFrames: 13, spectrogramFrameSize: 16}, + {label: 'qux', spectrogramNumFrames: 14, spectrogramFrameSize: 16} + ]); + expect(data.byteLength).toEqual(4 * (10 + 12 + 14 + 13) * 16); + }); + + it('Dataset.serialize(): limited singleton word labels', () => { + const dataset = new Dataset(); + const ex1 = getRandomExample('foo', 10, 16); + const ex2 = getRandomExample('bar', 12, 16); + const ex3 = getRandomExample('qux', 14, 16); + const ex4 = getRandomExample('foo', 13, 16); + dataset.addExample(ex1); + dataset.addExample(ex2); + dataset.addExample(ex3); + dataset.addExample(ex4); + + let buffer = dataset.serialize('foo'); + let loaded = arrayBuffer2SerializedExamples(buffer); + expect(loaded.manifest).toEqual([ + {label: 'foo', spectrogramNumFrames: 10, spectrogramFrameSize: 16}, + {label: 'foo', spectrogramNumFrames: 13, spectrogramFrameSize: 16} + ]); + expect(loaded.data.byteLength).toEqual(4 * (10 + 13) * 16); + + buffer = dataset.serialize('bar'); + loaded = arrayBuffer2SerializedExamples(buffer); + expect(loaded.manifest).toEqual([ + {label: 'bar', spectrogramNumFrames: 12, spectrogramFrameSize: 16} + ]); + expect(loaded.data.byteLength).toEqual(4 * 12 * 16); + }); + + it('Dataset.serialize(): limited array word label', () => { + const dataset = new Dataset(); + const ex1 = getRandomExample('foo', 10, 16); + const ex2 = getRandomExample('bar', 12, 16); + const ex3 = getRandomExample('qux', 14, 16); + const ex4 = getRandomExample('foo', 13, 16); + dataset.addExample(ex1); + dataset.addExample(ex2); + dataset.addExample(ex3); + dataset.addExample(ex4); + + const buffer = dataset.serialize(['foo', 'qux']); + const loaded = arrayBuffer2SerializedExamples(buffer); + expect(loaded.manifest).toEqual([ + {label: 'foo', spectrogramNumFrames: 10, spectrogramFrameSize: 16}, + {label: 'foo', spectrogramNumFrames: 13, spectrogramFrameSize: 16}, + {label: 'qux', spectrogramNumFrames: 14, spectrogramFrameSize: 16} + ]); + expect(loaded.data.byteLength).toEqual(4 * (10 + 13 + 14) * 16); + }); + + it('Dataset.serialize(): nonexistent singleton word label errors', () => { + const dataset = new Dataset(); + const ex1 = getRandomExample('foo', 10, 16); + const ex2 = getRandomExample('bar', 12, 16); + const ex3 = getRandomExample('qux', 14, 16); + const ex4 = getRandomExample('foo', 13, 16); + dataset.addExample(ex1); + dataset.addExample(ex2); + dataset.addExample(ex3); + dataset.addExample(ex4); + + expect(() => dataset.serialize('gralk')) + .toThrowError(/\"gralk\" does not exist/); + expect(() => dataset.serialize(['gralk'])) + .toThrowError(/\"gralk\" does not exist/); + expect(() => dataset.serialize([ + 'foo', 'gralk' + ])).toThrowError(/\"gralk\" does not exist/); + }); + + it('Dataset serialize-deserialize round trip', () => { + const dataset = new Dataset(); + const ex1 = getRandomExample('foo', 10, 16); + const ex2 = getRandomExample('bar', 10, 16); + const ex3 = getRandomExample('qux', 10, 16); + const ex4 = getRandomExample('foo', 10, 16); + dataset.addExample(ex1); + dataset.addExample(ex2); + dataset.addExample(ex3); + dataset.addExample(ex4); + + const artifacts = dataset.serialize(); + const datasetPrime = new Dataset(artifacts); + + expect(datasetPrime.empty()).toEqual(false); + expect(datasetPrime.size()).toEqual(4); + expect(datasetPrime.getVocabulary()).toEqual(['bar', 'foo', 'qux']); + expect(dataset.getExampleCounts()).toEqual({'bar': 1, 'foo': 2, 'qux': 1}); + + expect(dataset.getExamples('bar').length).toEqual(1); + expect(dataset.getExamples('foo').length).toEqual(2); + expect(dataset.getExamples('qux').length).toEqual(1); + + const ex1Prime = datasetPrime.getExamples('foo')[0].example; + expect(ex1Prime.label).toEqual('foo'); + expect(ex1Prime.spectrogram.frameSize).toEqual(16); + test_util.expectArraysEqual( + ex1Prime.spectrogram.data, ex1.spectrogram.data); + + const ex2Prime = datasetPrime.getExamples('bar')[0].example; + expect(ex2Prime.label).toEqual('bar'); + expect(ex2Prime.spectrogram.frameSize).toEqual(16); + test_util.expectArraysEqual( + ex2Prime.spectrogram.data, ex2.spectrogram.data); + + const ex3Prime = datasetPrime.getExamples('qux')[0].example; + expect(ex3Prime.label).toEqual('qux'); + expect(ex3Prime.spectrogram.frameSize).toEqual(16); + test_util.expectArraysEqual( + ex3Prime.spectrogram.data, ex3.spectrogram.data); + + const ex4Prime = datasetPrime.getExamples('foo')[1].example; + expect(ex4Prime.label).toEqual('foo'); + expect(ex4Prime.spectrogram.frameSize).toEqual(16); + test_util.expectArraysEqual( + ex4Prime.spectrogram.data, ex4.spectrogram.data); + + const {xs, ys} = datasetPrime.getData(null, {shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + expect(xs.shape).toEqual([4, 10, 16, 1]); + expectTensorsClose( + ys, tf.tensor2d([[1, 0, 0], [0, 1, 0], [0, 1, 0], [0, 0, 1]])); + }); + + it('Calling serialize() on empty dataset fails', () => { + const dataset = new Dataset(); + expect(() => dataset.serialize()) + .toThrowError(/Cannot serialize empty Dataset/); + }); + + it('Deserialized dataset supports removeExample', () => { + const dataset = new Dataset(); + const ex1 = getRandomExample('foo', 10, 16); + const ex2 = getRandomExample('bar', 10, 16); + const ex3 = getRandomExample('qux', 10, 16); + const ex4 = getRandomExample('foo', 10, 16); + dataset.addExample(ex1); + dataset.addExample(ex2); + dataset.addExample(ex3); + dataset.addExample(ex4); + + const serialized = dataset.serialize(); + const datasetPrime = new Dataset(serialized); + + const examples = datasetPrime.getExamples('foo'); + datasetPrime.removeExample(examples[0].uid); + + const {xs, ys} = datasetPrime.getData(null, {shuffle: false}) as + {xs: tf.Tensor, ys: tf.Tensor}; + expect(xs.shape).toEqual([3, 10, 16, 1]); + expectTensorsClose(ys, tf.tensor2d([[1, 0, 0], [0, 1, 0], [0, 0, 1]])); + }); + + it('Attempt to load invalid ArrayBuffer errors out', () => { + const invalidBuffer = string2ArrayBuffer('INVALID_[{}]0000000'); + expect(() => new Dataset(invalidBuffer)) + .toThrowError('Deserialization error: Invalid descriptor'); + }); + + it('DATASET_SERIALIZATION_DESCRIPTOR has right length', () => { + expect(DATASET_SERIALIZATION_DESCRIPTOR.length).toEqual(8); + expect(string2ArrayBuffer(DATASET_SERIALIZATION_DESCRIPTOR).byteLength) + .toEqual(8); + }); + + it('Version number satisfies requirements', () => { + expect(typeof DATASET_SERIALIZATION_VERSION === 'number').toEqual(true); + expect(Number.isInteger(DATASET_SERIALIZATION_VERSION)).toEqual(true); + expect(DATASET_SERIALIZATION_VERSION).toBeGreaterThan(0); + }); +}); + +describe('getValidWindows', () => { + it('Left and right sides open, odd windowLength', () => { + const snippetLength = 100; + const focusIndex = 50; + const windowLength = 21; + const windowHop = 5; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[30, 51], [35, 56], [40, 61], [45, 66], [50, 71]]); + }); + + it('Left and right sides open, even windowLength', () => { + const snippetLength = 100; + const focusIndex = 50; + const windowLength = 20; + const windowHop = 5; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[35, 55], [40, 60], [45, 65], [50, 70]]); + }); + + it('Left side truncation, right side open', () => { + const snippetLength = 100; + const focusIndex = 8; + const windowLength = 20; + const windowHop = 5; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[0, 20], [5, 25]]); + }); + + it('Left side truncation extreme, right side open', () => { + const snippetLength = 100; + const focusIndex = 0; + const windowLength = 21; + const windowHop = 5; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[0, 21]]); + }); + + it('Right side truncation, left side open', () => { + const snippetLength = 100; + const focusIndex = 95; + const windowLength = 20; + const windowHop = 5; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[80, 100]]); + }); + + it('Right side truncation extreme, left side open', () => { + const snippetLength = 100; + const focusIndex = 99; + const windowLength = 21; + const windowHop = 5; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[79, 100]]); + }); + + it('Neither side has enough room for another hop 1', () => { + const snippetLength = 100; + const focusIndex = 50; + const windowLength = 21; + const windowHop = 35; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[40, 61]]); + }); + + it('Neither side has enough room for another hop 2', () => { + const snippetLength = 100; + const focusIndex = 50; + const windowLength = 91; + const windowHop = 35; + const windows = + getValidWindows(snippetLength, focusIndex, windowLength, windowHop); + expect(windows).toEqual([[5, 96]]); + }); + + it('Exact match', () => { + const snippetLength = 10; + const windowLength = 10; + const windowHop = 2; + + let focusIndex = 0; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + focusIndex = 1; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + focusIndex = 5; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + focusIndex = 8; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + focusIndex = 9; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + }); + + it('Almost exact match', () => { + const snippetLength = 12; + const windowLength = 10; + const windowHop = 2; + + let focusIndex = 0; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + focusIndex = 1; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10]]); + focusIndex = 5; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10], [2, 12]]); + focusIndex = 8; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10], [2, 12]]); + focusIndex = 9; + expect(getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toEqual([[0, 10], [2, 12]]); + }); + + it('Non-positive integer snippetLength values lead to errors', () => { + const windowLength = 10; + const focusIndex = 5; + const windowHop = 2; + let snippetLength = 0; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + snippetLength = -2; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + snippetLength = 10.5; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + }); + + it('Non-positive integer windowLength values lead to errors', () => { + const snippetLength = 10; + const focusIndex = 5; + const windowHop = 2; + let windowLength = 0; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + windowLength = -2; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + windowLength = 3.5; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + }); + + it('Negative or non-integer focusIndex values lead to errors', () => { + const snippetLength = 10; + const windowLength = 10; + const windowHop = 2; + let focusIndex = -5; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + focusIndex = 1.5; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + }); + + it('Out-of-bound focusIndex leads to error', () => { + const snippetLength = 10; + const windowLength = 10; + const windowHop = 2; + let focusIndex = 10; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + focusIndex = 11; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + }); + + it('Out-of-bound windowLength leads to error', () => { + const snippetLength = 10; + const windowLength = 12; + const windowHop = 2; + const focusIndex = 5; + expect( + () => + getValidWindows(snippetLength, focusIndex, windowLength, windowHop)) + .toThrow(); + }); +}); + +describe('spectrogram2IntensityCurve', () => { + it('Correctness', () => { + const x = tf.tensor2d([[1, 2], [3, 4], [5, 6]]); + const spectrogram: + SpectrogramData = {data: x.dataSync() as Float32Array, frameSize: 2}; + const intensityCurve = spectrogram2IntensityCurve(spectrogram); + expectTensorsClose(intensityCurve, tf.tensor1d([1.5, 3.5, 5.5])); + }); +}); + +describe('getMaxIntensityFrameIndex', () => { + it('Multiple frames', () => { + const x = tf.tensor2d([[1, 2], [11, 12], [3, 4], [51, 52], [5, 6]]); + const spectrogram: + SpectrogramData = {data: x.dataSync() as Float32Array, frameSize: 2}; + const maxIntensityFrameIndex = getMaxIntensityFrameIndex(spectrogram); + expectTensorsClose(maxIntensityFrameIndex, tf.scalar(3, 'int32')); + }); + + it('Only one frames', () => { + const x = tf.tensor2d([[11, 12]]); + const spectrogram: + SpectrogramData = {data: x.dataSync() as Float32Array, frameSize: 2}; + const maxIntensityFrameIndex = getMaxIntensityFrameIndex(spectrogram); + expectTensorsClose(maxIntensityFrameIndex, tf.scalar(0, 'int32')); + }); + + it('No focus frame: return multiple windows', () => { + const snippetLength = 100; + const windowLength = 40; + const windowHop = 20; + const windows = + getValidWindows(snippetLength, null, windowLength, windowHop); + expect(windows).toEqual([[0, 40], [20, 60], [40, 80], [60, 100]]); + }); + + it('No focus frame: return one window', () => { + const snippetLength = 10; + const windowLength = 10; + const windowHop = 2; + const windows = + getValidWindows(snippetLength, null, windowLength, windowHop); + expect(windows).toEqual([[0, 10]]); + }); +}); diff --git a/音频分类/speech-commands/src/generic_utils.ts b/音频分类/speech-commands/src/generic_utils.ts new file mode 100644 index 0000000..e968fb9 --- /dev/null +++ b/音频分类/speech-commands/src/generic_utils.ts @@ -0,0 +1,92 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Concatenate a number of ArrayBuffers into one. + * + * @param buffers A number of array buffers to concatenate. + * @returns Result of concatenating `buffers` in order. + */ +export function concatenateArrayBuffers(buffers: ArrayBuffer[]): ArrayBuffer { + let totalByteLength = 0; + buffers.forEach((buffer: ArrayBuffer) => { + totalByteLength += buffer.byteLength; + }); + + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer: ArrayBuffer) => { + temp.set(new Uint8Array(buffer), offset); + offset += buffer.byteLength; + }); + return temp.buffer; +} + +/** + * Concatenate Float32Arrays. + * + * @param xs Float32Arrays to concatenate. + * @return The result of the concatenation. + */ +export function concatenateFloat32Arrays(xs: Float32Array[]): Float32Array { + let totalLength = 0; + xs.forEach(x => totalLength += x.length); + const concatenated = new Float32Array(totalLength); + let index = 0; + xs.forEach(x => { + concatenated.set(x, index); + index += x.length; + }); + return concatenated; +} + +/** Encode a string as an ArrayBuffer. */ +export function string2ArrayBuffer(str: string): ArrayBuffer { + if (str == null) { + throw new Error('Received null or undefind string'); + } + // NOTE(cais): This implementation is inefficient in terms of memory. + // But it works for UTF-8 strings. Just don't use on for very long strings. + const strUTF8 = unescape(encodeURIComponent(str)); + const buf = new Uint8Array(strUTF8.length); + for (let i = 0; i < strUTF8.length; ++i) { + buf[i] = strUTF8.charCodeAt(i); + } + return buf.buffer; +} + +/** Decode an ArrayBuffer as a string. */ +export function arrayBuffer2String(buffer: ArrayBuffer): string { + if (buffer == null) { + throw new Error('Received null or undefind buffer'); + } + const buf = new Uint8Array(buffer); + return decodeURIComponent(escape(String.fromCharCode(...buf))); +} + +/** Generate a pseudo-random UID. */ +export function getUID(): string { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + + s4() + s4(); +} + +export function getRandomInteger(min: number, max: number): number { + return Math.floor((max - min) * Math.random()) + min; +} diff --git a/音频分类/speech-commands/src/generic_utils_test.ts b/音频分类/speech-commands/src/generic_utils_test.ts new file mode 100644 index 0000000..5d441a1 --- /dev/null +++ b/音频分类/speech-commands/src/generic_utils_test.ts @@ -0,0 +1,81 @@ + +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// tslint:disable-next-line: no-imports-from-dist +import {expectArraysEqual} from '@tensorflow/tfjs-core/dist/test_util'; + +import {arrayBuffer2String, concatenateFloat32Arrays, string2ArrayBuffer} from './generic_utils'; + +describe('string2ArrayBuffer and arrayBuffer2String', () => { + it('round trip: ASCII only', () => { + const str = 'Lorem_Ipsum_123 !@#$%^&*()'; + expect(arrayBuffer2String(string2ArrayBuffer(str))).toEqual(str); + }); + it('round trip: non-ASCII', () => { + const str = 'Welcome 欢迎 स्वागत हे ようこそ добро пожаловать 😀😀'; + expect(arrayBuffer2String(string2ArrayBuffer(str))).toEqual(str); + }); + it('round trip: empty string', () => { + const str = ''; + expect(arrayBuffer2String(string2ArrayBuffer(str))).toEqual(str); + }); +}); + +describe('concatenateFloat32Arrays', () => { + it('Two non-empty', () => { + const xs = new Float32Array([1, 3]); + const ys = new Float32Array([3, 7]); + expectArraysEqual( + concatenateFloat32Arrays([xs, ys]), new Float32Array([1, 3, 3, 7])); + expectArraysEqual( + concatenateFloat32Arrays([ys, xs]), new Float32Array([3, 7, 1, 3])); + // Assert that the original Float32Arrays are not altered. + expectArraysEqual(xs, new Float32Array([1, 3])); + expectArraysEqual(ys, new Float32Array([3, 7])); + }); + + it('Three unequal lengths non-empty', () => { + const array1 = new Float32Array([1]); + const array2 = new Float32Array([2, 3]); + const array3 = new Float32Array([4, 5, 6]); + expectArraysEqual( + concatenateFloat32Arrays([array1, array2, array3]), + new Float32Array([1, 2, 3, 4, 5, 6])); + }); + + it('One empty, one non-empty', () => { + const xs = new Float32Array([4, 2]); + const ys = new Float32Array(0); + expectArraysEqual( + concatenateFloat32Arrays([xs, ys]), new Float32Array([4, 2])); + expectArraysEqual( + concatenateFloat32Arrays([ys, xs]), new Float32Array([4, 2])); + // Assert that the original Float32Arrays are not altered. + expectArraysEqual(xs, new Float32Array([4, 2])); + expectArraysEqual(ys, new Float32Array(0)); + }); + + it('Two empty', () => { + const xs = new Float32Array(0); + const ys = new Float32Array(0); + expectArraysEqual(concatenateFloat32Arrays([xs, ys]), new Float32Array(0)); + expectArraysEqual(concatenateFloat32Arrays([ys, xs]), new Float32Array(0)); + // Assert that the original Float32Arrays are not altered. + expectArraysEqual(xs, new Float32Array(0)); + expectArraysEqual(ys, new Float32Array(0)); + }); +}); diff --git a/音频分类/speech-commands/src/index.ts b/音频分类/speech-commands/src/index.ts new file mode 100644 index 0000000..c0aee57 --- /dev/null +++ b/音频分类/speech-commands/src/index.ts @@ -0,0 +1,91 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; + +import {BrowserFftSpeechCommandRecognizer} from './browser_fft_recognizer'; +import {playRawAudio} from './browser_fft_utils'; +import {concatenateFloat32Arrays} from './generic_utils'; +import {FFT_TYPE, SpeechCommandRecognizer, SpeechCommandRecognizerMetadata} from './types'; +import { normalizeFloat32Array, normalize } from './browser_fft_utils'; + +/** + * Create an instance of speech-command recognizer. + * + * @param fftType Type of FFT. The currently availble option(s): + * - BROWSER_FFT: Obtains audio spectrograms using browser's native Fourier + * transform. + * @param vocabulary The vocabulary of the model to load. Possible options: + * - '18w' (default): The 18-word vocaulbary, consisting of: + * 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', + * 'eight', 'nine', 'up', 'down', 'left', 'right', 'go', 'stop', + * 'yes', and 'no', in addition to '_background_noise_' and '_unknown_'. + * - 'directional4w': The four directional words: 'up', 'down', 'left', and + * 'right', in addition to '_background_noise_' and '_unknown_'. + * Choosing a smaller vocabulary leads to better accuracy on the words of + * interest and a slightly smaller model size. + * @param customModelArtifactsOrURL A custom model URL pointing to a model.json + * file, or a set of modelArtifacts in `tf.io.ModelArtifacts` format. + * Supported schemes: http://, https://, and node.js-only: file://. + * Mutually exclusive with `vocabulary`. If provided, `customMetadatURL` + * most also be provided. + * @param customMetadataOrURL A custom metadata URL pointing to a metadata.json + * file. Must be provided together with `customModelURL`, or a metadata + * object. + * @returns An instance of SpeechCommandRecognizer. + * @throws Error on invalid value of `fftType`. + */ +export function create( + fftType: FFT_TYPE, vocabulary?: string, + customModelArtifactsOrURL?: tf.io.ModelArtifacts|string, + customMetadataOrURL?: SpeechCommandRecognizerMetadata| + string): SpeechCommandRecognizer { + tf.util.assert( + customModelArtifactsOrURL == null && customMetadataOrURL == null || + customModelArtifactsOrURL != null && customMetadataOrURL != null, + () => `customModelURL and customMetadataURL must be both provided or ` + + `both not provided.`); + if (customModelArtifactsOrURL != null) { + tf.util.assert( + vocabulary == null, + () => `vocabulary name must be null or undefined when modelURL ` + + `is provided.`); + } + + if (fftType === 'BROWSER_FFT') { + return new BrowserFftSpeechCommandRecognizer( + vocabulary, customModelArtifactsOrURL, customMetadataOrURL); + } else if (fftType === 'SOFT_FFT') { + throw new Error( + 'SOFT_FFT SpeechCommandRecognizer has not been implemented yet.'); + } else { + throw new Error(`Invalid fftType: '${fftType}'`); + } +} + +const utils = { + concatenateFloat32Arrays, + normalizeFloat32Array, + normalize, + playRawAudio +}; + +export {BACKGROUND_NOISE_TAG, Dataset, GetDataConfig as GetSpectrogramsAsTensorsConfig, getMaxIntensityFrameIndex, spectrogram2IntensityCurve, SpectrogramAndTargetsTfDataset} from './dataset'; +export {AudioDataAugmentationOptions, Example, FFT_TYPE, RawAudioData, RecognizerParams, SpectrogramData, SpeechCommandRecognizer, SpeechCommandRecognizerMetadata, SpeechCommandRecognizerResult, StreamingRecognitionConfig, TransferLearnConfig, TransferSpeechCommandRecognizer} from './types'; +export {deleteSavedTransferModel, listSavedTransferModels, UNKNOWN_TAG} from './browser_fft_recognizer'; +export {utils}; +export {version} from './version'; diff --git a/音频分类/speech-commands/src/index_test.ts b/音频分类/speech-commands/src/index_test.ts new file mode 100644 index 0000000..607da2c --- /dev/null +++ b/音频分类/speech-commands/src/index_test.ts @@ -0,0 +1,69 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +// tslint:disable-next-line:no-require-imports +const packageJSON = require('../package.json'); +import * as tf from '@tensorflow/tfjs-core'; +import * as tfl from '@tensorflow/tfjs-layers'; +import * as speechCommands from './index'; + +describe('Public API', () => { + it('version matches package.json', () => { + expect(typeof speechCommands.version).toEqual('string'); + expect(speechCommands.version).toEqual(packageJSON.version); + }); +}); + +describe('Creating recognizer', () => { + async function makeModelArtifacts(): Promise { + const model = tfl.sequential(); + model.add(tfl.layers.conv2d({ + filters: 8, + kernelSize: 3, + activation: 'relu', + inputShape: [86, 500, 1] + })); + model.add(tfl.layers.flatten()); + model.add(tfl.layers.dense({units: 3, activation: 'softmax'})); + let modelArtifacts: tf.io.ModelArtifacts; + await model.save(tf.io.withSaveHandler(artifacts => { + modelArtifacts = artifacts; + return null; + })); + return modelArtifacts; + } + + function makeMetadata(): speechCommands.SpeechCommandRecognizerMetadata { + return { + wordLabels: [speechCommands.BACKGROUND_NOISE_TAG, 'foo', 'bar'], + tfjsSpeechCommandsVersion: speechCommands.version + }; + } + + it('Create recognizer from aritfacts and metadata objects', async () => { + const modelArtifacts = await makeModelArtifacts(); + const metadata = makeMetadata(); + const recognizer = + speechCommands.create('BROWSER_FFT', null, modelArtifacts, metadata); + await recognizer.ensureModelLoaded(); + + expect(recognizer.wordLabels()).toEqual([ + speechCommands.BACKGROUND_NOISE_TAG, 'foo', 'bar' + ]); + expect(recognizer.modelInputShape()).toEqual([null, 86, 500, 1]); + }); +}); diff --git a/音频分类/speech-commands/src/test_utils.ts b/音频分类/speech-commands/src/test_utils.ts new file mode 100644 index 0000000..43d4076 --- /dev/null +++ b/音频分类/speech-commands/src/test_utils.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2019 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import {Tensor, test_util, util} from '@tensorflow/tfjs-core'; + +export function expectTensorsClose( + actual: Tensor|number[], expected: Tensor|number[], epsilon?: number) { + if (actual == null) { + throw new Error( + 'First argument to expectTensorsClose() is not defined.'); + } + if (expected == null) { + throw new Error( + 'Second argument to expectTensorsClose() is not defined.'); + } + if (actual instanceof Tensor && expected instanceof Tensor) { + if (actual.dtype !== expected.dtype) { + throw new Error( + `Data types do not match. Actual: '${actual.dtype}'. ` + + `Expected: '${expected.dtype}'`); + } + if (!util.arraysEqual(actual.shape, expected.shape)) { + throw new Error( + `Shapes do not match. Actual: [${actual.shape}]. ` + + `Expected: [${expected.shape}].`); + } + } + const actualData = actual instanceof Tensor ? actual.dataSync() : actual; + const expectedData = + expected instanceof Tensor ? expected.dataSync() : expected; + test_util.expectArraysClose(actualData, expectedData, epsilon); +} diff --git a/音频分类/speech-commands/src/training_utils.ts b/音频分类/speech-commands/src/training_utils.ts new file mode 100644 index 0000000..913dccc --- /dev/null +++ b/音频分类/speech-commands/src/training_utils.ts @@ -0,0 +1,164 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Utility functions for training and transfer learning of the speech-commands + * model. + */ + +import * as tf from '@tensorflow/tfjs-core'; + +/** + * Split feature and target tensors into train and validation (val) splits. + * + * Given sufficent number of examples, the train and val sets will be + * balanced with respect to the classes. + * + * @param xs Features tensor, of shape [numExamples, ...]. + * @param ys Targets tensors, of shape [numExamples, numClasses]. Assumed to be + * one-hot categorical encoding. + * @param valSplit A number > 0 and < 1, fraction of examples to use + * as the validation set. + * @returns trainXs: training features tensor; trainYs: training targets + * tensor; valXs: validation features tensor; valYs: validation targets + * tensor. + */ +export function balancedTrainValSplit( + xs: tf.Tensor, ys: tf.Tensor, valSplit: number): { + trainXs: tf.Tensor, + trainYs: tf.Tensor, + valXs: tf.Tensor, + valYs: tf.Tensor +} { + tf.util.assert( + valSplit > 0 && valSplit < 1, + () => `validationSplit is expected to be >0 and <1, ` + + `but got ${valSplit}`); + + return tf.tidy(() => { + const classIndices = tf.argMax(ys, -1).dataSync(); + + const indicesByClasses: number[][] = []; + for (let i = 0; i < classIndices.length; ++i) { + const classIndex = classIndices[i]; + if (indicesByClasses[classIndex] == null) { + indicesByClasses[classIndex] = []; + } + indicesByClasses[classIndex].push(i); + } + const numClasses = indicesByClasses.length; + + const trainIndices: number[] = []; + const valIndices: number[] = []; + + // Randomly shuffle the list of indices in each array. + indicesByClasses.map(classIndices => tf.util.shuffle(classIndices)); + for (let i = 0; i < numClasses; ++i) { + const classIndices = indicesByClasses[i]; + const cutoff = Math.round(classIndices.length * (1 - valSplit)); + for (let j = 0; j < classIndices.length; ++j) { + if (j < cutoff) { + trainIndices.push(classIndices[j]); + } else { + valIndices.push(classIndices[j]); + } + } + } + + const trainXs = tf.gather(xs, trainIndices); + const trainYs = tf.gather(ys, trainIndices); + const valXs = tf.gather(xs, valIndices); + const valYs = tf.gather(ys, valIndices); + return {trainXs, trainYs, valXs, valYs}; + }); +} + +/** + * Same as balancedTrainValSplit, but for number arrays or Float32Arrays. + */ +export function balancedTrainValSplitNumArrays( + xs: number[][]|Float32Array[], ys: number[], valSplit: number): { + trainXs: number[][]|Float32Array[], + trainYs: number[], + valXs: number[][]|Float32Array[], + valYs: number[] +} { + tf.util.assert( + valSplit > 0 && valSplit < 1, + () => `validationSplit is expected to be >0 and <1, ` + + `but got ${valSplit}`); + const isXsFloat32Array = !Array.isArray(xs[0]); + + const classIndices = ys; + + const indicesByClasses: number[][] = []; + for (let i = 0; i < classIndices.length; ++i) { + const classIndex = classIndices[i]; + if (indicesByClasses[classIndex] == null) { + indicesByClasses[classIndex] = []; + } + indicesByClasses[classIndex].push(i); + } + const numClasses = indicesByClasses.length; + + const trainIndices: number[] = []; + const valIndices: number[] = []; + + // Randomly shuffle the list of indices in each array. + indicesByClasses.map(classIndices => tf.util.shuffle(classIndices)); + for (let i = 0; i < numClasses; ++i) { + const classIndices = indicesByClasses[i]; + const cutoff = Math.round(classIndices.length * (1 - valSplit)); + for (let j = 0; j < classIndices.length; ++j) { + if (j < cutoff) { + trainIndices.push(classIndices[j]); + } else { + valIndices.push(classIndices[j]); + } + } + } + + if (isXsFloat32Array) { + const trainXs: Float32Array[] = []; + const trainYs: number[] = []; + const valXs: Float32Array[] = []; + const valYs: number[] = []; + for (const index of trainIndices) { + trainXs.push(xs[index] as Float32Array); + trainYs.push(ys[index]); + } + for (const index of valIndices) { + valXs.push(xs[index] as Float32Array); + valYs.push(ys[index]); + } + return {trainXs, trainYs, valXs, valYs}; + } else { + const trainXs: number[][] = []; + const trainYs: number[] = []; + const valXs: number[][] = []; + const valYs: number[] = []; + for (const index of trainIndices) { + trainXs.push(xs[index] as number[]); + trainYs.push(ys[index]); + } + for (const index of valIndices) { + valXs.push(xs[index] as number[]); + valYs.push(ys[index]); + } + return {trainXs, trainYs, valXs, valYs}; + } +} diff --git a/音频分类/speech-commands/src/training_utils_test.ts b/音频分类/speech-commands/src/training_utils_test.ts new file mode 100644 index 0000000..bfdd064 --- /dev/null +++ b/音频分类/speech-commands/src/training_utils_test.ts @@ -0,0 +1,60 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import '@tensorflow/tfjs-node'; + +import * as tf from '@tensorflow/tfjs-core'; +// tslint:disable-next-line: no-imports-from-dist +import {describeWithFlags, NODE_ENVS} from '@tensorflow/tfjs-core/dist/jasmine_util'; + +import {expectTensorsClose} from './test_utils'; +import {balancedTrainValSplit} from './training_utils'; + +describeWithFlags('balancedTrainValSplit', NODE_ENVS, () => { + it('Enough data for split', () => { + const xs = tf.randomNormal([8, 3]); + const ys = tf.oneHot(tf.tensor1d([0, 0, 0, 0, 1, 1, 1, 1], 'int32'), 2); + const {trainXs, trainYs, valXs, valYs} = + balancedTrainValSplit(xs, ys, 0.25); + expect(trainXs.shape).toEqual([6, 3]); + expect(trainYs.shape).toEqual([6, 2]); + expect(valXs.shape).toEqual([2, 3]); + expect(valYs.shape).toEqual([2, 2]); + expectTensorsClose(tf.sum(trainYs, 0), tf.tensor1d([3, 3], 'int32')); + expectTensorsClose(tf.sum(valYs, 0), tf.tensor1d([1, 1], 'int32')); + }); + + it('Not enough data for split', () => { + const xs = tf.randomNormal([8, 3]); + const ys = tf.oneHot(tf.tensor1d([0, 0, 0, 0, 1, 1, 1, 1], 'int32'), 2); + const {trainXs, trainYs, valXs, valYs} = + balancedTrainValSplit(xs, ys, 0.01); + expect(trainXs.shape).toEqual([8, 3]); + expect(trainYs.shape).toEqual([8, 2]); + expect(valXs.shape).toEqual([0, 3]); + expect(valYs.shape).toEqual([0, 2]); + }); + + it('Invalid valSplit leads to Error', () => { + const xs = tf.randomNormal([8, 3]); + const ys = tf.oneHot(tf.tensor1d([0, 0, 0, 0, 1, 1, 1, 1], 'int32'), 2); + expect(() => balancedTrainValSplit(xs, ys, -0.2)).toThrow(); + expect(() => balancedTrainValSplit(xs, ys, 0)).toThrow(); + expect(() => balancedTrainValSplit(xs, ys, 1)).toThrow(); + expect(() => balancedTrainValSplit(xs, ys, 1.2)).toThrow(); + }); +}); diff --git a/音频分类/speech-commands/src/types.ts b/音频分类/speech-commands/src/types.ts new file mode 100644 index 0000000..3077451 --- /dev/null +++ b/音频分类/speech-commands/src/types.ts @@ -0,0 +1,754 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tf from '@tensorflow/tfjs-core'; +import * as tfl from '@tensorflow/tfjs-layers'; + +/** + * This file defines the interfaces related to SpeechCommandRecognizer. + */ + +export type FFT_TYPE = 'BROWSER_FFT'|'SOFT_FFT'; + +export type RecognizerCallback = (result: SpeechCommandRecognizerResult) => + Promise; + +/** + * Interface for a speech-command recognizer. + */ +export interface SpeechCommandRecognizer { + /** + * Load the underlying model instance and associated metadata. + * + * If the model and the metadata are already loaded, do nothing. + */ + ensureModelLoaded(): Promise; + + /** + * Start listening continuously to microphone input and perform recognition + * in a streaming fashion. + * + * @param callback the callback that will be invoked every time + * a recognition result is available. + * @param config optional configuration. + * @throws Error if there is already ongoing streaming recognition. + */ + listen(callback: RecognizerCallback, config?: StreamingRecognitionConfig): + Promise; + + /** + * Stop the ongoing streaming recognition (if any). + * + * @throws Error if no streaming recognition is ongoing. + */ + stopListening(): Promise; + + /** + * Check if this instance is currently performing + * streaming recognition. + */ + isListening(): boolean; + + /** + * Recognize a single example of audio. + * + * If `input` is provided, will perform offline prediction. + * If `input` is not provided, a single frame of audio + * will be collected from the microhpone via WebAudio and predictions + * will be made on it. + * + * @param input (Optional) tf.Tensor of Float32Array. + * If provided and a tf.Tensor, must match the input shape of the + * underlying tf.Model. If a Float32Array, the length must be + * equal to (the model’s required FFT length) * + * (the model’s required frame count). + * @returns A Promise of recognition result, with the following fields: + * - scores: the probability scores. + * - embedding: the embedding for the input audio (i.e., an internal + * activation from the model). Provided if and only if `includeEmbedding` + * is `true` in `config`. + * @throws Error on incorrect shape or length. + */ + recognize(input?: tf.Tensor|Float32Array, config?: RecognizeConfig): + Promise; + + /** + * Get the input shape of the tf.Model the underlies the recognizer. + */ + modelInputShape(): tfl.Shape; + + /** + * Getter for word labels. + * + * The word labels are an alphabetically sorted Array of strings. + */ + wordLabels(): string[]; + + /** + * Get the parameters such as the required number of frames. + */ + params(): RecognizerParams; + + /** + * Create a new recognizer based on this recognizer, for transfer learning. + * + * @param name Required name of the transfer learning recognizer. Must be a + * non-empty string. + * @returns An instance of TransferSpeechCommandRecognizer, which supports + * `collectExample()`, `train()`, as well as the same `listen()` + * `stopListening()` and `recognize()` as the base recognizer. + */ + createTransfer(name: string): TransferSpeechCommandRecognizer; +} + +export interface ExampleCollectionOptions { + /** + * Multiplier for the duration. + * + * This is the ratio between the duration of the to-be-collected + * example and the duration of each input example accepted by the + * underlying convnet. + * + * If not provided, will default to 1. + * + * Must be a number >=1. + */ + durationMultiplier?: number; + + /** + * Duration in seconds. + * + * Mutually exclusive with durationMultiplier. + * If specified, must be >0. + */ + durationSec?: number; + + /** + * Optional constraints for the audio track. + * + * E.g., this can be used to select a microphone when multiple microphones + * are available on the system: `{deviceId: 'deadbeef'}`. + */ + audioTrackConstraints?: MediaTrackConstraints; + + /** + * Optional snipppet duration in seconds. + * + * Must be supplied if `onSnippet` is specified. + */ + snippetDurationSec?: number; + + /** + * Optional snippet callback. + * + * Must be provided if `snippetDurationSec` is specified. + * + * Gets called every snippetDurationSec with a latest slice of the + * spectrogram. It is the spectrogram accumulated since the last invocation of + * the callback (or for the first time, since when `collectExample()` is + * started). + */ + onSnippet?: (spectrogram: SpectrogramData) => Promise; + + /** + * Whether to collect the raw time-domain audio waveform in addition to the + * spectrogram. + * + * Default: `false`. + */ + includeRawAudio?: boolean; +} + +/** + * Metadata for a speech-comamnds recognizer. + */ +export interface SpeechCommandRecognizerMetadata { + /** Version of the speech-commands library. */ + tfjsSpeechCommandsVersion: string; + + /** Name of the model. */ + modelName?: string; + + /** A time stamp for when this metadata is generatd. */ + timeStamp?: string; + + /** + * Word labels for the recognizer model's output probability scores. + * + * The length of this array should be equal to the size of the last dimension + * of the model's output. + */ + wordLabels: string[]; +} + +/** + * Interface for a transfer-learning speech command recognizer. + * + * This inherits the `SpeechCommandRecognizer`. It adds methods for + * collecting and clearing examples for transfer learning, methods for + * querying the status of example collection, and for performing the + * transfer-learning training. + */ +export interface TransferSpeechCommandRecognizer extends + SpeechCommandRecognizer { + /** + * Collect an example for transfer learning via WebAudio. + * + * @param {string} word Name of the word. Must not overlap with any of the + * words the base model is trained to recognize. + * @returns {SpectrogramData} The spectrogram of the acquired the example. + * @throws Error, if word belongs to the set of words the base model is + * trained to recognize. + */ + collectExample(word: string, options?: ExampleCollectionOptions): + Promise; + + /** + * Clear all transfer learning examples collected so far. + */ + clearExamples(): void; + + /** + * Get counts of the word examples that have been collected for a + * transfer-learning model. + * + * @returns {{[word: string]: number}} A map from word name to number of + * examples collected for that word so far. + */ + countExamples(): {[word: string]: number}; + + /** + * Train a transfer-learning model. + * + * The last dense layer of the base model is replaced with new softmax dense + * layer. + * + * It is assume that at least one category of data has been collected (using + * multiple calls to the `collectTransferExample` method). + * + * @param config {TransferLearnConfig} Optional configurations fot the + * training of the transfer-learning model. + * @returns {tf.History} A history object with the loss and accuracy values + * from the training of the transfer-learning model. + * @throws Error, if `modelName` is invalid or if not sufficient training + * examples have been collected yet. + */ + train(config?: TransferLearnConfig): + Promise; + + /** + * Perform evaluation of the model using the examples that the model + * has loaded. + * + * The evaluation calcuates an ROC curve by lumping the non-background-noise + * classes into a positive category and treating the background-noise + * class as the negative category. + * + * @param config Configuration object for the evaluation. + * @returns A Promise of the result of evaluation. + */ + evaluate(config: EvaluateConfig): Promise; + + /** + * Get examples currently held by the transfer-learning recognizer. + * + * @param label Label requested. + * @returns An array of `Example`s, along with their UIDs. + */ + getExamples(label: string): Array<{uid: string, example: Example}>; + + /** Set the key frame index of a given example. */ + setExampleKeyFrameIndex(uid: string, keyFrameIndex: number): void; + + /** + * Load an array of serialized examples. + * + * @param serialized The examples in their serialized format. + * @param clearExisting Whether to clear the existing examples while + * performing the loading (default: false). + */ + loadExamples(serialized: ArrayBuffer, clearExisting?: boolean): void; + + /** + * Serialize the existing examples. + * + * @param wordLabels Optional word label(s) to serialize. If specified, only + * the examples with labels matching the argument will be serialized. If + * any specified word label does not exist in the vocabulary of this + * transfer recognizer, an Error will be thrown. + * @returns An `ArrayBuffer` object amenable to transmission and storage. + */ + serializeExamples(wordLabels?: string|string[]): ArrayBuffer; + + /** + * Remove an example from the dataset of the transfer recognizer. + * + * @param uid The UID for the example to be removed. + */ + removeExample(uid: string): void; + + /** + * Check whether the dataset underlying this transfer recognizer is empty. + * + * @returns A boolean indicating whether the underlying dataset is empty. + */ + isDatasetEmpty(): boolean; + + /** + * Save the transfer-learned model. + * + * By default, the model's topology and weights are saved to browser + * IndexedDB, and the associated metadata are saved to browser LocalStorage. + * + * The saved metadata includes (among other things) the word list. + * + * To save the model to another destination, use the optional argument + * `handlerOrURL`. Note that if you use the custom route, you'll + * currently have to handle the metadata (e.g., word list) saving yourself. + * + * @param handlerOrURL Optional custom save URL or IOHandler object. E.g., + * `'downloads://my-file-name'`. + * @returns A `Promise` of a `SaveResult` object that summarizes the + * saving result. + */ + save(handlerOrURL?: string|tf.io.IOHandler): Promise; + + /** + * Load the transfer-learned model. + * + * By default, the model's topology and weights are loaded from browser + * IndexedDB and the associated metadata are loaded from browser + * LocalStorage. + * + * To load the model from another destination, use the optional + * argument. Note that if you load the model from a custom URL or + * IOHandler, you'll currently have to load the metadata (e.g., word + * list) yourself. + * + * @param handlerOrURL Optional custom source URL or IOHandler object + * to load the data from. E.g., + * `tf.io.browserFiles([modelJSONFile, weightsFile])` + */ + load(handlerOrURL?: string|tf.io.IOHandler): Promise; + + /** + * Get metadata about the transfer recognizer. + * + * The metadata includes but is not limited to: speech-commands library + * version, word labels that correspond to the model's probability outputs. + */ + getMetadata(): SpeechCommandRecognizerMetadata; +} + +/** + * Interface for a snippet of audio spectrogram. + */ +export interface SpectrogramData { + /** + * The float32 data for the spectrogram. + * + * Stored frame by frame. For example, the first N elements + * belong to the first time frame and the next N elements belong + * to the second time frame, and so forth. + */ + data: Float32Array; + + /** + * Number of points per frame, i.e., FFT length per frame. + */ + frameSize: number; + + /** + * Duration of each frame in milliseconds. + */ + frameDurationMillis?: number; + + /** + * Index to the key frame (0-based). + * + * A key frame is a frame in the spectrogram that belongs to + * the utterance of interest. It is used to distinguish the + * utterance part from the background-noise part. + * + * A typical use of key frame index: when multiple training examples are + * extracted from a spectroram, every example is guaranteed to include + * the key frame. + * + * Key frame is not required. If it is missing, heuristics algorithms + * (e.g., finding the highest-intensity frame) can be used to calculate + * the key frame. + */ + keyFrameIndex?: number; +} + +/** + * Interface for a result emitted by a speech-command recognizer. + * + * It is used in the callback of a recognizer's streaming or offline + * recognition method. It represents the result for a short snippet of + * audio. + */ +export interface SpeechCommandRecognizerResult { + /** + * Probability scores for the words. + */ + scores: Float32Array|Float32Array[]; + + /** + * Optional spectrogram data. + */ + spectrogram?: SpectrogramData; + + /** + * Embedding (internal activation) for the input. + * + * This field is populated if and only if `includeEmbedding` + * is `true` in the configuration object used during the `recognize` call. + */ + embedding?: tf.Tensor; +} + +export interface StreamingRecognitionConfig { + /** + * Overlap factor. Must be >=0 and <1. + * Defaults to 0.5. + * For example, if the model takes a frame length of 1000 ms, + * and if overlap factor is 0.4, there will be a 400ms + * overlap between two successive frames, i.e., frames + * will be taken every 600 ms. + */ + overlapFactor?: number; + + /** + * Amount to time in ms to suppress recognizer after a word is recognized. + * + * Defaults to 1000 ms. + */ + suppressionTimeMillis?: number; + + /** + * Threshold for the maximum probability value in a model prediction + * output to be greater than or equal to, below which the callback + * will not be called. + * + * Must be a number >=0 and <=1. + * + * The value will be overridden to `0` if `includeEmbedding` is `true`. + * + * If `null` or `undefined`, will default to `0`. + */ + probabilityThreshold?: number; + + /** + * Invoke the callback for background noise and unknown. + * + * The value will be overridden to `true` if `includeEmbedding` is `true`. + * + * Default: `false`. + */ + invokeCallbackOnNoiseAndUnknown?: boolean; + + /** + * Whether the spectrogram is to be provided in the each recognition + * callback call. + * + * Default: `false`. + */ + includeSpectrogram?: boolean; + + /** + * Whether to include the embedding (internal activation). + * + * If set as `true`, the values of the following configuration fields + * in this object will be overridden: + * + * - `probabilityThreshold` will be overridden to 0. + * - `invokeCallbackOnNoiseAndUnknown` will be overridden to `true`. + * + * Default: `false`. + */ + includeEmbedding?: boolean; + + /** + * Optional constraints for the audio track. + * + * E.g., this can be used to select a microphone when multiple microphones + * are available on the system: `{deviceId: 'deadbeef'}`. + */ + audioTrackConstraints?: MediaTrackConstraints; +} + +export interface RecognizeConfig { + /** + * Whether the spectrogram is to be provided in the each recognition + * callback call. + * + * Default: `false`. + */ + includeSpectrogram?: boolean; + + /** + * Whether to include the embedding (internal activation). + * + * Default: `false`. + */ + includeEmbedding?: boolean; +} + +export interface AudioDataAugmentationOptions { + /** + * Additive ratio for augmenting the data by mixing the word spectrograms + * with background-noise ones. + * + * If not `null` or `undefined`, will cause extra word spectrograms to be + * created through the equation: + * (normalizedWordSpectrogram + + * augmentByMixingNoiseRatio * normalizedNoiseSpectrogram) + * + * The normalizedNoiseSpectrogram will be drawn randomly from all noise + * snippets available. If no noise snippet is available, an Error will + * be thrown. + * + * Default: `undefined`. + */ + augmentByMixingNoiseRatio?: number; + + // TODO(cais): Add other augmentation options, including augmentByReverb, + // augmentByTempoShift and augmentByFrequencyShift. +} + +/** + * Configurations for the training of a transfer-learning recognizer. + * + * It is used during calls to the `TransferSpeechCommandRecognizer.train()` + * method. + */ +export interface TransferLearnConfig extends AudioDataAugmentationOptions { + /** + * Number of training epochs (default: 20). + */ + epochs?: number; + + /** + * Optimizer to be used for training (default: 'sgd'). + */ + optimizer?: string|tf.Optimizer; + + /** + * Batch size of training (default: 128). + */ + batchSize?: number; + + /** + * Validation split to be used during training. + * + * Default: null (no validation split). + * + * Note that this is split is different from the basic validation-split + * paradigm in TensorFlow.js. It makes sure that the distribution of the + * classes in the training and validation sets are approximately balanced. + * + * If specified, must be a number > 0 and < 1. + */ + validationSplit?: number; + + /** + * Number of fine-tuning epochs to run after the initial `epochs` epochs + * of transfer-learning training. + * + * During the fine-tuning, the last dense layer of the truncated base + * model (i.e., the second-last dense layer of the original model) is + * unfrozen and updated through backpropagation. + * + * If specified, must be an integer > 0. + */ + fineTuningEpochs?: number; + + /** + * The optimizer for fine-tuning after the initial transfer-learning + * training. + * + * This parameter is used only if `fineTuningEpochs` is specified + * and is a positive integre. + * + * Default: 'sgd'. + */ + fineTuningOptimizer?: string|tf.Optimizer; + + /** + * tf.Callback to be used during the initial training (i.e., not + * the fine-tuning phase). + */ + callback?: tfl.CustomCallbackArgs; + + /** + * tf.Callback to be used durnig the fine-tuning phase. + * + * This parameter is used only if `fineTuningEpochs` is specified + * and is a positive integer. + */ + fineTuningCallback?: tfl.CustomCallbackArgs; + + /** + * Ratio between the window hop and the window width. + * + * Used during extraction of multiple spectrograms matching the underlying + * model's input shape from a longer spectroram. + * + * Defaults to 0.25. + * + * For example, if the spectrogram window accepted by the underlying model + * is 43 frames long, then the default windowHopRatio 0.25 will lead to + * a hop of Math.round(43 * 0.25) = 11 frames. + */ + windowHopRatio?: number; + + /** + * The threshold for the total duration of the dataset above which + * `fitDataset()` will be used in lieu of `fit()`. + * + * Default: 60e3 (1 minute). + */ + fitDatasetDurationMillisThreshold?: number; +} + +/** + * Type for a Receiver Operating Characteristics (ROC) curve. + */ +export type ROCCurve = + Array < {probThreshold?: number, /** Probability threshold */ + fpr: number, /** False positive rate (FP / N) */ + tpr: number /** True positive rate (TP / P) */ + falsePositivesPerHour?: number /** FPR converted to per hour rate */ +}>; + + /** + * Model evaluation result. + */ + export interface EvaluateResult { + /** + * ROC curve. + */ + rocCurve?: ROCCurve; + + /** + * Area under the (ROC) curve. + */ + auc?: number; + } + + /** + * Model evaluation configuration. + */ + export interface EvaluateConfig { + /** + * Ratio between the window hop and the window width. + * + * Used during extraction of multiple spectrograms matching the underlying + * model's input shape from a longer spectroram. + * + * For example, if the spectrogram window accepted by the underlying model + * is 43 frames long, then the default windowHopRatio 0.25 will lead to + * a hop of Math.round(43 * 0.25) = 11 frames. + */ + windowHopRatio: number; + + /** + * Word probability score thresholds, used to calculate the ROC. + * + * E.g., [0, 0.2, 0.4, 0.6, 0.8, 1.0]. + */ + wordProbThresholds: number[]; + } + + /** + * Parameters for a speech-command recognizer. + */ + export interface RecognizerParams { + /** + * Total duration per spectragram, in milliseconds. + */ + spectrogramDurationMillis?: number; + + /** + * FFT encoding size per spectrogram column. + */ + fftSize?: number; + + /** + * Sampling rate, in Hz. + */ + sampleRateHz?: number; + } + + /** + * Interface of an audio feature extractor. + */ + export interface FeatureExtractor { + /** + * Config the feature extractor. + */ + setConfig(params: RecognizerParams): void; + + /** + * Start the feature extraction from the audio samples. + */ + start(audioTrackConstraints?: MediaTrackConstraints): + Promise; + + /** + * Stop the feature extraction. + */ + stop(): Promise; + + /** + * Get the extractor features collected since last call. + */ + getFeatures(): Float32Array[]; + } + + /** Snippet of pulse-code modulation (PCM) audio data. */ + export interface RawAudioData { + /** Samples of the snippet. */ + data: Float32Array; + + /** Sampling rate, in Hz. */ + sampleRateHz: number; + } + + /** + * A short, labeled snippet of speech or audio. + * + * This can be used for training a transfer model based on the base + * speech-commands model, among other things. + * + * A set of `Example`s can make up a dataset. + */ + export interface Example { + /** A label for the example. */ + label: string; + + /** Spectrogram data. */ + spectrogram: SpectrogramData; + + /** + * Raw audio in PCM (pulse-code modulation) format. + * + * Optional. + */ + rawAudio?: RawAudioData; + } diff --git a/音频分类/speech-commands/src/version.ts b/音频分类/speech-commands/src/version.ts new file mode 100644 index 0000000..460e51d --- /dev/null +++ b/音频分类/speech-commands/src/version.ts @@ -0,0 +1,5 @@ +/** @license See the LICENSE file. */ + +// This code is auto-generated, do not modify this file! +const version = '0.5.4'; +export {version}; diff --git a/音频分类/speech-commands/src/version_test.ts b/音频分类/speech-commands/src/version_test.ts new file mode 100644 index 0000000..ba99347 --- /dev/null +++ b/音频分类/speech-commands/src/version_test.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import {version} from './index'; + +describe('version', () => { + it('version matches package.json', () => { + // tslint:disable-next-line:no-require-imports + const expected = require('../package.json').version; + expect(version).toBe(expected); + }); +}); diff --git a/音频分类/speech-commands/training/browser-fft/README.md b/音频分类/speech-commands/training/browser-fft/README.md new file mode 100644 index 0000000..22af322 --- /dev/null +++ b/音频分类/speech-commands/training/browser-fft/README.md @@ -0,0 +1,22 @@ +# Training a TensorFlow.js model for Speech Commands Using Browser FFT + +This directory contains two example notebooks. They demonstrate how to train +custom TensorFlow.js audio models and deploy them for inference. The models +trained this way expect inputs to be spectrograms in a format consistent with +[WebAudio's `getFloatFrequencyData`](https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getFloatFrequencyData). +Therefore they can be deployed to the browser using the speech-commands library +for inference. + +Specifically, + +- [training_custom_audio_model_in_python.ipynb](./training_custom_audio_model_in_python.ipynb) + contains steps to preprocess a directory with audio examples stored as .wav + files and the steps in which a tf.keras model can be trained on the + preprocessed data. It then demonstrates how the trained tf.keras model can be + converted to a TensorFlow.js `LayersModel` that can be loaded with the + speech-command library's `create()` API. In addition, the notebook also shows + the steps to convert the trained tf.keras model to a TFLite model for + inference on mobile devices. +- [tflite_conversion.ipynb](./tflite_conversion.ipynb) illustrates how + an audio model trained on [Teachable Machine](https://teachablemachine.withgoogle.com/train/audio) + can be converted to TFLite directly. diff --git a/音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb b/音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb new file mode 100644 index 0000000..f0c9dc1 --- /dev/null +++ b/音频分类/speech-commands/training/browser-fft/tflite_conversion.ipynb @@ -0,0 +1,349 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Converting a TensorFlow.js Speech-Commands Model to Python and TFLite formats\n", + "\n", + "This notebook showcases how to convert a [TensorFlow.js (TF.js) Speech Commands model](https://www.npmjs.com/package/@tensorflow-models/speech-commands) to the Python (`tensorflow.keras`) and [TFLite](https://www.tensorflow.org/lite) formats. The TFLite format enables the model to be deployed to mobile enviroments such as Android phones.\n", + "\n", + "The technique outlined in this notebook are applicable to:\n", + "- the original Speech Commands models (including the 18w and directional4w) variants,\n", + "- transfer-learned models based on the original models, which can be trained and exported from [Teachable Machine's Audio Project](https://teachablemachine.withgoogle.com/train/audio)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, install the required `tensorflow` and `tensorflowjs` Python packages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# We need scipy for .wav file IO.\n", + "!pip install tensorflowjs==2.1.0 scipy==1.4.1\n", + "# TensorFlow 2.3.0 is required due to https://github.com/tensorflow/tensorflow/issues/38135\n", + "# TODO: Switch to 2.3.0 final release when it comes out.\n", + "!pip install tensorflow-cpu==2.3.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below we download the files of the original or transfer-learned TF.js Speech Commands model. \n", + "The code example here downloads the original model. But the approach is the same for a transfer-learned model downloaded from Teachable Machine, except that the files may come in as a ZIP archive in the case of Teachable Machine and hence requires unzippping." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p /tmp/tfjs-sc-model\n", + "!curl -o /tmp/tfjs-sc-model/metadata.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/metadata.json\n", + "!curl -o /tmp/tfjs-sc-model/model.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/model.json\n", + "!curl -o /tmp/tfjs-sc-model/group1-shard1of2 -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard1of2\n", + "!curl -o /tmp/tfjs-sc-model/group1-shard2of2 -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard2of2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "import tensorflow as tf\n", + "import tensorflowjs as tfjs" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Specify the path to the TensorFlow.js Speech Commands model,\n", + "# either original or transfer-learned on https://teachablemachine.withgoogle.com/)\n", + "tfjs_model_json_path = '/tmp/tfjs-sc-model/model.json'\n", + "\n", + "# This is the main classifier model.\n", + "model = tfjs.converters.load_keras_model(tfjs_model_json_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a required step, we download the audio preprocessing layer that replicates\n", + "[WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)'s\n", + "[Fourier transform](https://en.wikipedia.org/wiki/Fast_Fourier_transform) for\n", + "non-browser environments such as Android phones." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./sc_preproc_model/\r\n", + "./sc_preproc_model/assets/\r\n", + "./sc_preproc_model/variables/\r\n", + "./sc_preproc_model/variables/variables.data-00000-of-00001\r\n", + "./sc_preproc_model/variables/variables.index\r\n", + "./sc_preproc_model/saved_model.pb\r\n" + ] + } + ], + "source": [ + "!curl -o /tmp/tfjs-sc-model/sc_preproc_model.tar.gz -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/conversion/sc_preproc_model.tar.gz\n", + "!cd /tmp/tfjs-sc-model && tar xzvf ./sc_preproc_model.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n", + "Model: \"audio_preproc\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "audio_preprocessing_layer (A (None, None, None, 1) 2048 \n", + "=================================================================\n", + "Total params: 2,048\n", + "Trainable params: 0\n", + "Non-trainable params: 2,048\n", + "_________________________________________________________________\n", + "Input audio length = 44032\n" + ] + } + ], + "source": [ + "# Load the preprocessing layer (wrapped in a tf.keras Model).\n", + "preproc_model_path = '/tmp/tfjs-sc-model/sc_preproc_model'\n", + "preproc_model = tf.keras.models.load_model(preproc_model_path)\n", + "preproc_model.summary()\n", + "\n", + "# From the input_shape of the preproc_model, we can determine the\n", + "# required length of the input audio snippet.\n", + "input_length = preproc_model.input_shape[-1]\n", + "print(\"Input audio length = %d\" % input_length)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"combined_model\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "audio_preproc (Sequential) (None, None, None, 1) 2048 \n", + "_________________________________________________________________\n", + "sequential (Sequential) (None, 20) 1468684 \n", + "=================================================================\n", + "Total params: 1,470,732\n", + "Trainable params: 1,468,684\n", + "Non-trainable params: 2,048\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "# Construct the new non-browser model by combining the preprocessing\n", + "# layer with the main classifier model.\n", + "\n", + "combined_model = tf.keras.Sequential(name='combined_model')\n", + "combined_model.add(preproc_model)\n", + "combined_model.add(model)\n", + "combined_model.build([None, input_length])\n", + "combined_model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to quickly test that the converted model works, let's download a sample .wav file." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "!curl -o /tmp/tfjs-sc-model/audio_sample_one_male_adult.wav -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/conversion/audio_sample_one_male_adult.wav" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Listen to the audio sample.\n", + "wav_file_path = '/tmp/tfjs-sc-model/audio_sample_one_male_adult.wav'\n", + "import IPython.display as ipd\n", + "ipd.Audio(wav_file_path) # Play the .wav file." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Read the wav file and truncate it to the an input length\n", + "# suitable for the model.\n", + "from scipy.io import wavfile\n", + "\n", + "# fs: sample rate in Hz; xs: the audio PCM samples.\n", + "fs, xs = wavfile.read(wav_file_path)\n", + "\n", + "if len(xs) >= input_length:\n", + " xs = xs[:input_length]\n", + "else:\n", + " raise ValueError(\"Audio from .wav file is too short\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "top-5 class probabilities:\n", + " one: 1.0000e+00\n", + " nine: 5.0455e-19\n", + " _unknown_: 1.0553e-20\n", + " down: 4.0031e-26\n", + " no: 3.8358e-26\n" + ] + } + ], + "source": [ + "# Try running some examples through the combined model.\n", + "input_tensor = tf.constant(xs, shape=(1, input_length), dtype=tf.float32) / 32768.0\n", + "# The model outputs the probabilties for the classes (`probs`).\n", + "probs = combined_model.predict(input_tensor)\n", + "\n", + "# Read class labels of the model.\n", + "metadata_json_path = '/tmp/tfjs-sc-model/metadata.json'\n", + "\n", + "with open(metadata_json_path, 'r') as f:\n", + " metadata = json.load(f)\n", + " class_labels = metadata[\"words\"]\n", + "\n", + "# Get sorted probabilities and their corresponding class labels.\n", + "probs_and_labels = list(zip(probs[0].tolist(), class_labels))\n", + "# Sort the probabilities in descending order.\n", + "probs_and_labels = sorted(probs_and_labels, key=lambda x: -x[0])\n", + "probs_and_labels\n", + "# len(probs_and_labels)\n", + "\n", + "# Print the top-5 labels:\n", + "print('top-5 class probabilities:')\n", + "for i in range(5):\n", + " prob, label = probs_and_labels[i]\n", + " print('%20s: %.4e' % (label, prob))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /usr/local/google/home/cais/venv_tfjs/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n", + "WARNING:tensorflow:From /usr/local/google/home/cais/venv_tfjs/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n", + "INFO:tensorflow:Assets written to: /tmp/tmplb12fskv/assets\n", + "Saved tflite file at: /tmp/tfjs-sc-model/combined_model.tflite\n" + ] + } + ], + "source": [ + "# Save the model as a tflite file.\n", + "tflite_output_path = '/tmp/tfjs-sc-model/combined_model.tflite'\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(combined_model)\n", + "converter.target_spec.supported_ops = [\n", + " tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS\n", + "]\n", + "with open(tflite_output_path, 'wb') as f:\n", + " f.write(converter.convert())\n", + "print(\"Saved tflite file at: %s\" % tflite_output_path)" + ] + } + ], + "metadata": { + "colab": { + "name": "tflite_conversion.ipynb", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb b/音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb new file mode 100644 index 0000000..9a91b44 --- /dev/null +++ b/音频分类/speech-commands/training/browser-fft/training_custom_audio_model_in_python.ipynb @@ -0,0 +1,860 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "z6uizglMgQ26" + }, + "source": [ + "# Training a Custom TensorFlow.js Audio Model\n", + "\n", + "In this notebook, we show how to train a custom audio model based on the model topology of the\n", + "[TensorFlow.js Speech Commands model](https://www.npmjs.com/package/@tensorflow-models/speech-commands).\n", + "The training is done in Python by using a set of audio examples stored as .wav files.\n", + "The trained model is convertible to the\n", + "[TensorFlow.js LayersModel](https://js.tensorflow.org/api/latest/#loadLayersModel) format for\n", + "inference and further fine-tuning in the browser.\n", + "It may also be converted to the [TFLite](https://www.tensorflow.org/lite) format\n", + "for inference on mobile devices.\n", + "\n", + "This example uses a small subset of the\n", + "[Speech Commands v0.02](https://arxiv.org/abs/1804.03209) dataset, and builds\n", + "a model that detects two English words (\"yes\" and \"no\") against background noises. But the methodology demonstrated here is general and can be applied to\n", + "other sounds, as long as they are stored in the same .wav file format as in this example.\n", + "\n", + "## Data format\n", + "\n", + "The training procedure in this notebook makes the following assumption about the raw audio data:\n", + "\n", + "1. The root data directory contains a number of folders. The name of each folder is the name\n", + " of the audio class. You can select any subset of the folders (i.e., classes) to train the\n", + " model on.\n", + "2. Within each folder, there are a number of .wav files. Each .wav file corresponds to an\n", + " example. Each .wav file is mono (single-channel) and has the typical pulse-code modulation\n", + " (PCM) encoding. The duration of each wave file should be 1 second or slightly longer. \n", + "3. There can be a special folder called \"_background_noise_\" that contains .wav files for\n", + " audio samples that fall into the background noise class. Each of these .wav files can be\n", + " much longer than 1 second in duration. This notebook contains code that extracts 1-second\n", + " snippets from these .wav files\n", + " \n", + "The Speech Commands v0.3 dataset used in this notebook meets these data format requirements." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "Grv5UK5rHxyY" + }, + "outputs": [], + "source": [ + "!pip install librosa tensorflowjs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "3BbsTxcuCwYO" + }, + "outputs": [], + "source": [ + "import glob\n", + "import json\n", + "import os\n", + "import random\n", + "\n", + "import librosa\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from scipy import signal\n", + "from scipy.io import wavfile\n", + "import tensorflow as tf\n", + "import tensorflowjs as tfjs\n", + "import tqdm\n", + "\n", + "print(tf.__version__)\n", + "print(tfjs.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 119 + }, + "colab_type": "code", + "id": "wkPnHDHITAJH", + "outputId": "8c64930f-b03e-48df-fc93-7ab894307ee7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sc_preproc_model/\n", + "sc_preproc_model/assets/\n", + "sc_preproc_model/variables/\n", + "sc_preproc_model/variables/variables.data-00000-of-00001\n", + "sc_preproc_model/variables/variables.index\n", + "sc_preproc_model/saved_model.pb\n" + ] + } + ], + "source": [ + "# Download the TensorFlow.js Speech Commands model and the associated\n", + "# preprocesssing model.\n", + "!mkdir -p /tmp/tfjs-sc-model\n", + "!curl -o /tmp/tfjs-sc-model/metadata.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/metadata.json\n", + "!curl -o /tmp/tfjs-sc-model/model.json -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/model.json\n", + "!curl -o /tmp/tfjs-sc-model/group1-shard1of2 -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard1of2\n", + "!curl -o /tmp/tfjs-sc-model/group1-shard2of2 -fsSL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/v0.3/browser_fft/18w/group1-shard2of2\n", + "!curl -o /tmp/tfjs-sc-model/sc_preproc_model.tar.gz -fSsL https://storage.googleapis.com/tfjs-models/tfjs/speech-commands/conversion/sc_preproc_model.tar.gz\n", + "!cd /tmp/tfjs-sc-model/ && tar xzvf sc_preproc_model.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ioTiCDp4HO_V" + }, + "outputs": [], + "source": [ + "# Download Speech Commands v0.02 dataset. The dataset contains 30+ word and\n", + "# sound categories, but we will only use a subset of them\n", + "\n", + "!mkdir -p /tmp/speech_commands_v0.02\n", + "!curl -o /tmp/speech_commands_v0.02/speech_commands_v0.02.tar.gz -fSsL http://download.tensorflow.org/data/speech_commands_v0.02.tar.gz\n", + "!cd /tmp/speech_commands_v0.02 && tar xzf speech_commands_v0.02.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "colab_type": "code", + "id": "TqnjnnPoTR8E", + "outputId": "447dd1df-edc1-4829-ce31-4e8f2f9bb328" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.\n", + "Model: \"audio_preproc\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "audio_preprocessing_layer (A (None, None, None, 1) 2048 \n", + "=================================================================\n", + "Total params: 2,048\n", + "Trainable params: 0\n", + "Non-trainable params: 2,048\n", + "_________________________________________________________________\n" + ] + }, + { + "data": { + "text/plain": [ + "(None, 44032)" + ] + }, + "execution_count": 7, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "# Load the preprocessing model, which transforms audio waveform into \n", + "# spectrograms (2D image-like representation of sound).\n", + "# This preprocessing model replicates WebAudio's AnalyzerNode.getFloatFrequencyData\n", + "# (https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getFloatFrequencyData).\n", + "# It performs short-time Fourier transform (STFT) using a length-2048 Blackman\n", + "# window. It opeartes on mono audio at the 44100-Hz sample rate.\n", + "\n", + "preproc_model_path = '/tmp/tfjs-sc-model/sc_preproc_model'\n", + "preproc_model = tf.keras.models.load_model(preproc_model_path)\n", + "preproc_model.summary()\n", + "preproc_model.input_shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "mihiFei-dE3u" + }, + "outputs": [], + "source": [ + "# Create some constants to be used later.\n", + "\n", + "# Target sampling rate. It is required by the audio preprocessing model.\n", + "TARGET_SAMPLE_RATE = 44100\n", + "# The specific audio tensor length expected by the preprocessing model.\n", + "EXPECTED_WAVEFORM_LEN = preproc_model.input_shape[-1]\n", + "\n", + "# Where the Speech Commands v0.02 dataset has been downloaded.\n", + "DATA_ROOT = \"/tmp/speech_commands_v0.02\"\n", + "\n", + "WORDS = (\"_background_noise_snippets_\", \"no\", \"yes\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 153 + }, + "colab_type": "code", + "id": "0jl1n0SCNYUj", + "outputId": "1a524c46-ddd4-4162-f60a-c2511fd14626" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/pink_noise.wav...\n", + "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/exercise_bike.wav...\n", + "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/dude_miaowing.wav...\n", + "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/running_tap.wav...\n", + "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/doing_the_dishes.wav...\n", + "Extracting snippets from /tmp/speech_commands_v0.02/_background_noise_/white_noise.wav...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:13: WavFileWarning: Chunk (non-data) not understood, skipping it.\n", + " del sys.path[0]\n" + ] + } + ], + "source": [ + "# Unlike word examples, the noise samples in the Speech Commands v0.02 dataset\n", + "# are not divided into 1-second snippets. Instead, they are stored as longer\n", + "# recordings. Therefore we need to cut them up in to 1-second snippet .wav\n", + "# files.\n", + "\n", + "noise_wav_paths = glob.glob(os.path.join(DATA_ROOT, \"_background_noise_\", \"*.wav\"))\n", + "snippets_dir = os.path.join(DATA_ROOT, \"_background_noise_snippets_\")\n", + "os.makedirs(snippets_dir, exist_ok=True)\n", + "\n", + "\n", + "def extract_snippets(wav_path, snippet_duration_sec=1.0):\n", + " basename = os.path.basename(os.path.splitext(wav_path)[0])\n", + " sample_rate, xs = wavfile.read(wav_path)\n", + " assert xs.dtype == np.int16\n", + " n_samples_per_snippet = int(snippet_duration_sec * sample_rate)\n", + " i = 0\n", + " while i + n_samples_per_snippet < len(xs):\n", + " snippet_wav_path = os.path.join(snippets_dir, \"%s_%.5d.wav\" % (basename, i))\n", + " snippet = xs[i : i + n_samples_per_snippet].astype(np.int16)\n", + " wavfile.write(snippet_wav_path, sample_rate, snippet)\n", + " i += n_samples_per_snippet\n", + "\n", + "for noise_wav_path in noise_wav_paths:\n", + " print(\"Extracting snippets from %s...\" % noise_wav_path)\n", + " extract_snippets(noise_wav_path, snippet_duration_sec=1.0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "FSjiThysWrTx" + }, + "outputs": [], + "source": [ + "def resample_wavs(dir_path, target_sample_rate=44100):\n", + " \"\"\"Resample the .wav files in an input directory to given sampling rate.\n", + " \n", + " The resampled waveforms are written to .wav files in the same directory with\n", + " file names that ends in \"_44100hz.wav\".\n", + "\n", + " 44100 Hz is the sample rate required by the preprocessing model. It is also\n", + " the most widely supported sample rate among web browsers and mobile devices.\n", + " For example, see:\n", + " https://developer.mozilla.org/en-US/docs/Web/API/AudioContextOptions/sampleRate\n", + " https://developer.android.com/ndk/guides/audio/sampling-audio\n", + "\n", + " Args:\n", + " dir_path: Path to a directory that contains .wav files.\n", + " target_sapmle_rate: Target sampling rate in Hz.\n", + " \"\"\"\n", + " wav_paths = glob.glob(os.path.join(dir_path, \"*.wav\"))\n", + " resampled_suffix = \"_%shz.wav\" % target_sample_rate\n", + " for i, wav_path in tqdm.tqdm(enumerate(wav_paths)):\n", + " if wav_path.endswith(resampled_suffix):\n", + " continue\n", + " sample_rate, xs = wavfile.read(wav_path)\n", + " xs = xs.astype(np.float32)\n", + " xs = librosa.resample(xs, sample_rate, TARGET_SAMPLE_RATE).astype(np.int16)\n", + " resampled_path = os.path.splitext(wav_path)[0] + resampled_suffix\n", + " wavfile.write(resampled_path, target_sample_rate, xs)\n", + "\n", + "\n", + "for word in WORDS:\n", + " word_dir = os.path.join(DATA_ROOT, word)\n", + " assert os.path.isdir(word_dir)\n", + " resample_wavs(word_dir, target_sample_rate=TARGET_SAMPLE_RATE)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "aFA-TSmpK935" + }, + "outputs": [], + "source": [ + "@tf.function\n", + "def read_wav(filepath):\n", + " file_contents = tf.io.read_file(filepath)\n", + " return tf.expand_dims(tf.squeeze(tf.audio.decode_wav(\n", + " file_contents, \n", + " desired_channels=-1,\n", + " desired_samples=TARGET_SAMPLE_RATE).audio, axis=-1), 0)\n", + "\n", + "\n", + "@tf.function\n", + "def filter_by_waveform_length(waveform, label):\n", + " return tf.size(waveform) > EXPECTED_WAVEFORM_LEN\n", + "\n", + "\n", + "@tf.function\n", + "def crop_and_convert_to_spectrogram(waveform, label):\n", + " cropped = tf.slice(waveform, begin=[0, 0], size=[1, EXPECTED_WAVEFORM_LEN])\n", + " return tf.squeeze(preproc_model(cropped), axis=0), label\n", + "\n", + "\n", + "@tf.function\n", + "def spectrogram_elements_finite(spectrogram, label):\n", + " return tf.math.reduce_all(tf.math.is_finite(spectrogram))\n", + "\n", + "\n", + "def get_dataset(input_wav_paths, labels):\n", + " \"\"\"Get a tf.data.Dataset given input .wav files and their labels.\n", + "\n", + " The returned dataset emits 2-tuples of `(spectrogram, label)`, wherein\n", + " - `spectrogram` is a tensor of dtype tf.float32 and shape [43, 232, 1].\n", + " It is z-normalized (i.e., have a mean of ~0.0 and variance of ~1.0).\n", + " - `label` is a tensor of dtype tf.int32 and shape [] (scalar).\n", + " \n", + " Args:\n", + " input_wav_paths: Input audio .wav file paths as a list of string.\n", + " labels: integer labels (class indices) of the input .wav files. Must have\n", + " the same lengh as `input_wav_paths`.\n", + "\n", + " Returns:\n", + " A tf.data.Dataset object as described above.\n", + " \"\"\"\n", + " ds = tf.data.Dataset.from_tensor_slices(input_wav_paths)\n", + " # Read audio waveform from the .wav files.\n", + " ds = ds.map(read_wav)\n", + " ds = tf.data.Dataset.zip((ds, tf.data.Dataset.from_tensor_slices(labels)))\n", + " # Keep only the waveforms longer than `EXPECTED_WAVEFORM_LEN`.\n", + " ds = ds.filter(filter_by_waveform_length)\n", + " # Crop the waveforms to `EXPECTED_WAVEFORM_LEN` and convert them to\n", + " # spectrograms using the preprocessing layer.\n", + " ds = ds.map(crop_and_convert_to_spectrogram)\n", + " # Discard examples that contain infinite or NaN elements.\n", + " ds = ds.filter(spectrogram_elements_finite)\n", + " return ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 333 + }, + "colab_type": "code", + "id": "tU6gho3nuvQl", + "outputId": "07dea6f2-9b7c-477e-8814-f69772fb39da" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 396 examples for class _background_noise_snippets_\n", + "Found 3941 examples for class no\n", + "Found 4044 examples for class yes\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "input_wav_paths_and_labels = []\n", + "for i, word in enumerate(WORDS):\n", + " wav_paths = glob.glob(os.path.join(DATA_ROOT, word, \"*_%shz.wav\" % TARGET_SAMPLE_RATE))\n", + " print(\"Found %d examples for class %s\" % (len(wav_paths), word))\n", + " labels = [i] * len(wav_paths)\n", + " input_wav_paths_and_labels.extend(zip(wav_paths, labels))\n", + "random.shuffle(input_wav_paths_and_labels)\n", + " \n", + "input_wav_paths, labels = ([t[0] for t in input_wav_paths_and_labels],\n", + " [t[1] for t in input_wav_paths_and_labels])\n", + "dataset = get_dataset(input_wav_paths, labels)\n", + "\n", + "# Show some example spectrograms for inspection.\n", + "fig = plt.figure(figsize=(40, 100))\n", + "dataset_iter = iter(dataset)\n", + "num_spectrograms_to_show = 10\n", + "for i in range(num_spectrograms_to_show):\n", + " ax = fig.add_subplot(1, num_spectrograms_to_show, i + 1)\n", + " spectrogram, label = next(dataset_iter)\n", + " spectrogram = spectrogram.numpy()\n", + " label = label.numpy()\n", + " plt.imshow(np.flipud(np.squeeze(spectrogram, -1).T), aspect=0.2)\n", + " ax.set_title(\"Example of \\\"%s\\\"\" % WORDS[label])\n", + " ax.set_xlabel(\"Time frame #\")\n", + " if i == 0:\n", + " ax.set_ylabel(\"Frequency bin #\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "ZvWr-_R2ym7d", + "outputId": "4784a0d3-d0a3-406a-9199-2c626efe454f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading dataset and converting data to numpy arrays. This may take a few minutes...\n", + "Done.\n" + ] + } + ], + "source": [ + "# The amount of data we have is relatively small. It fits into typical host RAM\n", + "# or GPU memory. For better training performance, we preload the data and\n", + "# put it into numpy arrays:\n", + "# - xs: The audio features (normalized spectrograms).\n", + "# - ys: The labels (class indices).\n", + "print(\n", + " \"Loading dataset and converting data to numpy arrays. \"\n", + " \"This may take a few minutes...\")\n", + "xs_and_ys = list(dataset)\n", + "xs = np.stack([item[0] for item in xs_and_ys])\n", + "ys = np.stack([item[1] for item in xs_and_ys])\n", + "print(\"Done.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 595 + }, + "colab_type": "code", + "id": "o6sV5t2Kwi7p", + "outputId": "d127e5ce-24ef-4ced-bd2e-19f8ca31e586" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"TransferLearnedModel\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d_1 (Conv2D) (None, 42, 225, 8) 136 \n", + "_________________________________________________________________\n", + "max_pooling2d_1 (MaxPooling2 (None, 21, 112, 8) 0 \n", + "_________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 20, 109, 32) 2080 \n", + "_________________________________________________________________\n", + "max_pooling2d_2 (MaxPooling2 (None, 10, 54, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_3 (Conv2D) (None, 9, 51, 32) 8224 \n", + "_________________________________________________________________\n", + "max_pooling2d_3 (MaxPooling2 (None, 4, 25, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_4 (Conv2D) (None, 3, 22, 32) 8224 \n", + "_________________________________________________________________\n", + "max_pooling2d_4 (MaxPooling2 (None, 2, 11, 32) 0 \n", + "_________________________________________________________________\n", + "flatten_1 (Flatten) (None, 704) 0 \n", + "_________________________________________________________________\n", + "dropout_1 (Dropout) (None, 704) 0 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 2000) 1410000 \n", + "_________________________________________________________________\n", + "dropout_2 (Dropout) (None, 2000) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 3) 6003 \n", + "=================================================================\n", + "Total params: 1,434,667\n", + "Trainable params: 6,003\n", + "Non-trainable params: 1,428,664\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "tfjs_model_json_path = '/tmp/tfjs-sc-model/model.json'\n", + "\n", + "# Load the Speech Commands model. Weights are loaded along with the topology,\n", + "# since we train the model from scratch. Instead, we will perform transfer\n", + "# learning based on the model.\n", + "orig_model = tfjs.converters.load_keras_model(tfjs_model_json_path, load_weights=True)\n", + "\n", + "# Remove the top Dense layer and add a new Dense layer of which the output\n", + "# size fits the number of sound classes we care about.\n", + "model = tf.keras.Sequential(name=\"TransferLearnedModel\")\n", + "for layer in orig_model.layers[:-1]:\n", + " model.add(layer)\n", + "model.add(tf.keras.layers.Dense(units=len(WORDS), activation=\"softmax\"))\n", + "\n", + "# Freeze all but the last layer of the model. The last layer will be fine-tuned\n", + "# during transfer learning.\n", + "for layer in model.layers[:-1]:\n", + " layer.trainable = False\n", + "\n", + "model.compile(optimizer=\"sgd\", loss=\"sparse_categorical_crossentropy\", metrics=[\"acc\"])\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "colab_type": "code", + "id": "zRNtKeuPFIaq", + "outputId": "7cd176f4-db38-448f-a153-7d78dcbd24fc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/50\n", + "21/21 [==============================] - 11s 538ms/step - loss: 0.4393 - acc: 0.8521 - val_loss: 0.0732 - val_acc: 0.9756\n", + "Epoch 2/50\n", + "21/21 [==============================] - 11s 527ms/step - loss: 0.1562 - acc: 0.9438 - val_loss: 0.0571 - val_acc: 0.9823\n", + "Epoch 3/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.1207 - acc: 0.9584 - val_loss: 0.0536 - val_acc: 0.9810\n", + "Epoch 4/50\n", + "21/21 [==============================] - 11s 532ms/step - loss: 0.0987 - acc: 0.9653 - val_loss: 0.0471 - val_acc: 0.9827\n", + "Epoch 5/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0894 - acc: 0.9662 - val_loss: 0.0455 - val_acc: 0.9836\n", + "Epoch 6/50\n", + "21/21 [==============================] - 11s 527ms/step - loss: 0.0818 - acc: 0.9730 - val_loss: 0.0442 - val_acc: 0.9841\n", + "Epoch 7/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0791 - acc: 0.9738 - val_loss: 0.0422 - val_acc: 0.9849\n", + "Epoch 8/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0749 - acc: 0.9757 - val_loss: 0.0407 - val_acc: 0.9858\n", + "Epoch 9/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0748 - acc: 0.9736 - val_loss: 0.0399 - val_acc: 0.9863\n", + "Epoch 10/50\n", + "21/21 [==============================] - 11s 532ms/step - loss: 0.0698 - acc: 0.9761 - val_loss: 0.0400 - val_acc: 0.9858\n", + "Epoch 11/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0670 - acc: 0.9774 - val_loss: 0.0389 - val_acc: 0.9867\n", + "Epoch 12/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0676 - acc: 0.9768 - val_loss: 0.0385 - val_acc: 0.9876\n", + "Epoch 13/50\n", + "21/21 [==============================] - 11s 527ms/step - loss: 0.0655 - acc: 0.9770 - val_loss: 0.0378 - val_acc: 0.9872\n", + "Epoch 14/50\n", + "21/21 [==============================] - 11s 527ms/step - loss: 0.0615 - acc: 0.9799 - val_loss: 0.0360 - val_acc: 0.9876\n", + "Epoch 15/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0651 - acc: 0.9765 - val_loss: 0.0362 - val_acc: 0.9876\n", + "Epoch 16/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0477 - acc: 0.9818 - val_loss: 0.0361 - val_acc: 0.9880\n", + "Epoch 17/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0561 - acc: 0.9801 - val_loss: 0.0357 - val_acc: 0.9889\n", + "Epoch 18/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0521 - acc: 0.9816 - val_loss: 0.0350 - val_acc: 0.9885\n", + "Epoch 19/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0659 - acc: 0.9803 - val_loss: 0.0345 - val_acc: 0.9885\n", + "Epoch 20/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0544 - acc: 0.9812 - val_loss: 0.0358 - val_acc: 0.9872\n", + "Epoch 21/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0573 - acc: 0.9787 - val_loss: 0.0333 - val_acc: 0.9885\n", + "Epoch 22/50\n", + "21/21 [==============================] - 11s 530ms/step - loss: 0.0442 - acc: 0.9839 - val_loss: 0.0332 - val_acc: 0.9889\n", + "Epoch 23/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0528 - acc: 0.9820 - val_loss: 0.0335 - val_acc: 0.9889\n", + "Epoch 24/50\n", + "21/21 [==============================] - 11s 530ms/step - loss: 0.0411 - acc: 0.9861 - val_loss: 0.0343 - val_acc: 0.9894\n", + "Epoch 25/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0535 - acc: 0.9812 - val_loss: 0.0333 - val_acc: 0.9889\n", + "Epoch 26/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0418 - acc: 0.9848 - val_loss: 0.0341 - val_acc: 0.9889\n", + "Epoch 27/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0484 - acc: 0.9820 - val_loss: 0.0334 - val_acc: 0.9885\n", + "Epoch 28/50\n", + "21/21 [==============================] - 11s 527ms/step - loss: 0.0474 - acc: 0.9823 - val_loss: 0.0339 - val_acc: 0.9885\n", + "Epoch 29/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0452 - acc: 0.9831 - val_loss: 0.0334 - val_acc: 0.9889\n", + "Epoch 30/50\n", + "21/21 [==============================] - 11s 531ms/step - loss: 0.0465 - acc: 0.9833 - val_loss: 0.0325 - val_acc: 0.9889\n", + "Epoch 31/50\n", + "21/21 [==============================] - 11s 530ms/step - loss: 0.0419 - acc: 0.9860 - val_loss: 0.0327 - val_acc: 0.9889\n", + "Epoch 32/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0415 - acc: 0.9854 - val_loss: 0.0326 - val_acc: 0.9889\n", + "Epoch 33/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0450 - acc: 0.9842 - val_loss: 0.0320 - val_acc: 0.9898\n", + "Epoch 34/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0419 - acc: 0.9863 - val_loss: 0.0325 - val_acc: 0.9889\n", + "Epoch 35/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0447 - acc: 0.9841 - val_loss: 0.0318 - val_acc: 0.9898\n", + "Epoch 36/50\n", + "21/21 [==============================] - 11s 530ms/step - loss: 0.0417 - acc: 0.9848 - val_loss: 0.0317 - val_acc: 0.9894\n", + "Epoch 37/50\n", + "21/21 [==============================] - 11s 532ms/step - loss: 0.0464 - acc: 0.9850 - val_loss: 0.0318 - val_acc: 0.9894\n", + "Epoch 38/50\n", + "21/21 [==============================] - 11s 530ms/step - loss: 0.0355 - acc: 0.9878 - val_loss: 0.0320 - val_acc: 0.9898\n", + "Epoch 39/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0452 - acc: 0.9829 - val_loss: 0.0326 - val_acc: 0.9898\n", + "Epoch 40/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0373 - acc: 0.9875 - val_loss: 0.0320 - val_acc: 0.9898\n", + "Epoch 41/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0389 - acc: 0.9858 - val_loss: 0.0312 - val_acc: 0.9894\n", + "Epoch 42/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0416 - acc: 0.9867 - val_loss: 0.0310 - val_acc: 0.9898\n", + "Epoch 43/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0400 - acc: 0.9863 - val_loss: 0.0315 - val_acc: 0.9898\n", + "Epoch 44/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0420 - acc: 0.9835 - val_loss: 0.0313 - val_acc: 0.9898\n", + "Epoch 45/50\n", + "21/21 [==============================] - 11s 528ms/step - loss: 0.0423 - acc: 0.9856 - val_loss: 0.0305 - val_acc: 0.9894\n", + "Epoch 46/50\n", + "21/21 [==============================] - 11s 530ms/step - loss: 0.0353 - acc: 0.9871 - val_loss: 0.0311 - val_acc: 0.9894\n", + "Epoch 47/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0439 - acc: 0.9837 - val_loss: 0.0329 - val_acc: 0.9898\n", + "Epoch 48/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0409 - acc: 0.9858 - val_loss: 0.0310 - val_acc: 0.9894\n", + "Epoch 49/50\n", + "21/21 [==============================] - 11s 527ms/step - loss: 0.0386 - acc: 0.9858 - val_loss: 0.0298 - val_acc: 0.9898\n", + "Epoch 50/50\n", + "21/21 [==============================] - 11s 529ms/step - loss: 0.0357 - acc: 0.9886 - val_loss: 0.0306 - val_acc: 0.9894\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "# Train the model.\n", + "model.fit(xs, ys, batch_size=256, validation_split=0.3, shuffle=True, epochs=50)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 139 + }, + "colab_type": "code", + "id": "LFHnTUroi_3u", + "outputId": "8a353c2d-b154-41fe-a53c-2d818bebe074" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/tensorflowjs/converters/keras_h5_conversion.py:123: H5pyDeprecationWarning: The default file mode will change to 'r' (read-only) in h5py 3.0. To suppress this warning, pass the mode you need to h5py.File(), or set the global default h5.get_config().default_file_mode, or set the environment variable H5PY_DEFAULT_READONLY=1. Available modes are: 'r', 'r+', 'w', 'w-'/'x', 'a'. See the docs for details.\n", + " return h5py.File(h5file)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total 5.5M\n", + "-rw-r--r-- 1 root root 4.0M Aug 10 13:34 group1-shard1of2.bin\n", + "-rw-r--r-- 1 root root 1.5M Aug 10 13:34 group1-shard2of2.bin\n", + "-rw-r--r-- 1 root root 65 Aug 10 13:34 metadata.json\n", + "-rw-r--r-- 1 root root 6.2K Aug 10 13:34 model.json\n" + ] + } + ], + "source": [ + "# Convert the model to TensorFlow.js Layers model format.\n", + "\n", + "tfjs_model_dir = \"/tmp/tfjs-model\"\n", + "tfjs.converters.save_keras_model(model, tfjs_model_dir)\n", + "\n", + "# Create the metadata.json file.\n", + "metadata = {\"words\": [\"_background_noise_\"] + WORDS[1:], \"frameSize\": model.input_shape[-2]}\n", + "with open(os.path.join(tfjs_model_dir, \"metadata.json\"), \"w\") as f:\n", + " json.dump(metadata, f)\n", + "\n", + "!ls -lh /tmp/tfjs_model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To deploy this model to the web, you can use the\n", + "[speech-commands NPM package](https://www.npmjs.com/package/@tensorflow-models/speech-commands).\n", + "\n", + "The model.json and metadata.json should be hosted together with the two weights (.bin) files in the same HTTP/HTTPS directory.\n", + "\n", + "Then the custom model can be loaded in JavaScript with:\n", + "\n", + "```js\n", + "import * as tf from '@tensorflow/tfjs-core';\n", + "import * as tfl from '@tensorflow/tfjs-layers';\n", + "import * as speechCommands from '@tensorflow-models/speech-commands';\n", + "\n", + "const recognizer = speechCommands.create(\n", + " 'BROWSER_FFT',\n", + " null,\n", + " 'http://test.com/my-audio-model/model.json', // URL to the custom model's model.json\n", + " 'http://test.com/my-audio-model/metadata.json' // URL to the custom model's metadata.json\n", + ");\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 357 + }, + "colab_type": "code", + "id": "AZDMFkxulS8C", + "outputId": "cbd28071-1a09-43f5-a16f-2b793e3fc4e1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"CombinedModel\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "audio_preproc (Sequential) (None, None, None, 1) 2048 \n", + "_________________________________________________________________\n", + "TransferLearnedModel (Sequen (None, 3) 1434667 \n", + "=================================================================\n", + "Total params: 1,436,715\n", + "Trainable params: 6,003\n", + "Non-trainable params: 1,430,712\n", + "_________________________________________________________________\n", + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n", + "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "This property should not be used in TensorFlow 2.0, as updates are applied automatically.\n", + "INFO:tensorflow:Assets written to: /tmp/tmp865tq81o/assets\n", + "Saved tflite file at: /tmp/tfjs-sc-model/combined_model.tflite\n" + ] + } + ], + "source": [ + "# Convert the model to TFLite. \n", + "\n", + "# We need to combine the preprocessing model and the newly trained 3-class model\n", + "# so that the resultant model will be able to preform STFT and spectrogram \n", + "# calculation on mobile devices (i.e., without web browser's WebAudio).\n", + "\n", + "combined_model = tf.keras.Sequential(name='CombinedModel')\n", + "combined_model.add(preproc_model)\n", + "combined_model.add(model)\n", + "combined_model.build([None, EXPECTED_WAVEFORM_LEN])\n", + "combined_model.summary()\n", + "\n", + "tflite_output_path = '/tmp/tfjs-sc-model/combined_model.tflite'\n", + "converter = tf.lite.TFLiteConverter.from_keras_model(combined_model)\n", + "converter.target_spec.supported_ops = [\n", + " tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS\n", + "]\n", + "with open(tflite_output_path, 'wb') as f:\n", + " f.write(converter.convert())\n", + "print(\"Saved tflite file at: %s\" % tflite_output_path)" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "training_custom_audio_model_in_python.ipynb", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/音频分类/speech-commands/training/soft-fft/README.md b/音频分类/speech-commands/training/soft-fft/README.md new file mode 100644 index 0000000..3e55933 --- /dev/null +++ b/音频分类/speech-commands/training/soft-fft/README.md @@ -0,0 +1,125 @@ +# Training a TensorFlow.js model for Speech Commands Using node.js + +## Preparing data for training + +Before you can train your model that uses spectrogram from the browser's +WebAudio as input features, you need to download the speech-commands [data set v0.01](https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz) or [data set v0.02](https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz). + +## Training the TensorFlow.js Model + +The node.js training package comes with a command line tool that will assist your training. Here are the steps: +1. Prepare the node modules dependecies: + +```bash +yarn +``` + +2. Start the CLI program: + +```none +yarn start +``` + +Following are command supported by the CLI: + +```none + Commands: + + help [command...] Provides help for a given command. + exit Exits application. + create_model [labels...] create the audio model + load_dataset all Load all the data from the root directory by the labels + load_dataset