diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 000000000..56f265704 Binary files /dev/null and b/.DS_Store differ diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 833f51910..afa6f943c 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node-version: [14.x] + node-version: [16.x] steps: - uses: actions/checkout@v1 diff --git a/.gitignore b/.gitignore index 48114488c..4393443a7 100644 --- a/.gitignore +++ b/.gitignore @@ -104,9 +104,7 @@ dist .tern-port .idea + # Scratch specific */package-lock.json */package.json -.venv -Pipfile - diff --git a/lerna.json b/lerna.json index ee18484c5..265e9467c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,8 +1,6 @@ { "packages": [ - "packages/scratch-gui", - "packages/scratch-render", - "packages/scratch-vm" + "packages/*" ], "version": "0.0.0" -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..77a543208 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8170 @@ +{ + "name": "root", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@evocateur/libnpmaccess": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", + "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", + "dev": true, + "requires": { + "@evocateur/npm-registry-fetch": "^4.0.0", + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + } + } + }, + "@evocateur/libnpmpublish": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", + "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", + "dev": true, + "requires": { + "@evocateur/npm-registry-fetch": "^4.0.0", + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + } + } + }, + "@evocateur/npm-registry-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", + "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.1.2" + } + }, + "@evocateur/pacote": { + "version": "9.6.5", + "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", + "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", + "dev": true, + "requires": { + "@evocateur/npm-registry-fetch": "^4.0.0", + "bluebird": "^3.5.3", + "cacache": "^12.0.3", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.5.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.4.4", + "npm-pick-manifest": "^3.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.3", + "safe-buffer": "^5.2.0", + "semver": "^5.7.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "@lerna/add": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", + "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", + "dev": true, + "requires": { + "@evocateur/pacote": "^9.6.3", + "@lerna/bootstrap": "3.21.0", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "npm-package-arg": "^6.1.0", + "p-map": "^2.1.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/bootstrap": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", + "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/has-npm-version": "3.16.5", + "@lerna/npm-install": "3.16.5", + "@lerna/package-graph": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.16.5", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", + "@lerna/symlink-binary": "3.17.0", + "@lerna/symlink-dependencies": "3.17.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "get-port": "^4.2.0", + "multimatch": "^3.0.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0", + "read-package-tree": "^5.1.6", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/changed": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", + "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", + "dev": true, + "requires": { + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/listable": "3.18.5", + "@lerna/output": "3.13.0" + } + }, + "@lerna/check-working-tree": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", + "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", + "dev": true, + "requires": { + "@lerna/collect-uncommitted": "3.16.5", + "@lerna/describe-ref": "3.16.5", + "@lerna/validation-error": "3.13.0" + } + }, + "@lerna/child-process": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", + "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "execa": "^1.0.0", + "strong-log-transformer": "^2.0.0" + } + }, + "@lerna/clean": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", + "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/prompt": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.16.5", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0" + } + }, + "@lerna/cli": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", + "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", + "dev": true, + "requires": { + "@lerna/global-options": "3.13.0", + "dedent": "^0.7.0", + "npmlog": "^4.1.2", + "yargs": "^14.2.2" + } + }, + "@lerna/collect-uncommitted": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", + "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "chalk": "^2.3.1", + "figgy-pudding": "^3.5.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/collect-updates": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", + "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/describe-ref": "3.16.5", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "slash": "^2.0.0" + } + }, + "@lerna/command": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", + "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/package-graph": "3.18.5", + "@lerna/project": "3.21.0", + "@lerna/validation-error": "3.13.0", + "@lerna/write-log-file": "3.13.0", + "clone-deep": "^4.0.1", + "dedent": "^0.7.0", + "execa": "^1.0.0", + "is-ci": "^2.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/conventional-commits": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", + "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", + "dev": true, + "requires": { + "@lerna/validation-error": "3.13.0", + "conventional-changelog-angular": "^5.0.3", + "conventional-changelog-core": "^3.1.6", + "conventional-recommended-bump": "^5.0.0", + "fs-extra": "^8.1.0", + "get-stream": "^4.0.0", + "lodash.template": "^4.5.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "pify": "^4.0.1", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/create": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", + "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", + "dev": true, + "requires": { + "@evocateur/pacote": "^9.6.3", + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/validation-error": "3.13.0", + "camelcase": "^5.0.0", + "dedent": "^0.7.0", + "fs-extra": "^8.1.0", + "globby": "^9.2.0", + "init-package-json": "^1.10.3", + "npm-package-arg": "^6.1.0", + "p-reduce": "^1.0.0", + "pify": "^4.0.1", + "semver": "^6.2.0", + "slash": "^2.0.0", + "validate-npm-package-license": "^3.0.3", + "validate-npm-package-name": "^3.0.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/create-symlink": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", + "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", + "dev": true, + "requires": { + "@zkochan/cmd-shim": "^3.1.0", + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/describe-ref": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", + "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "npmlog": "^4.1.2" + } + }, + "@lerna/diff": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", + "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/validation-error": "3.13.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/exec": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", + "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/profiler": "3.20.0", + "@lerna/run-topologically": "3.18.5", + "@lerna/validation-error": "3.13.0", + "p-map": "^2.1.0" + } + }, + "@lerna/filter-options": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", + "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", + "dev": true, + "requires": { + "@lerna/collect-updates": "3.20.0", + "@lerna/filter-packages": "3.18.0", + "dedent": "^0.7.0", + "figgy-pudding": "^3.5.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/filter-packages": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", + "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", + "dev": true, + "requires": { + "@lerna/validation-error": "3.13.0", + "multimatch": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/get-npm-exec-opts": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", + "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/get-packed": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", + "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "ssri": "^6.0.1", + "tar": "^4.4.8" + } + }, + "@lerna/github-client": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", + "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@octokit/plugin-enterprise-rest": "^6.0.1", + "@octokit/rest": "^16.28.4", + "git-url-parse": "^11.1.2", + "npmlog": "^4.1.2" + } + }, + "@lerna/gitlab-client": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", + "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", + "dev": true, + "requires": { + "node-fetch": "^2.5.0", + "npmlog": "^4.1.2", + "whatwg-url": "^7.0.0" + } + }, + "@lerna/global-options": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", + "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", + "dev": true + }, + "@lerna/has-npm-version": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", + "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/import": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", + "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/prompt": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "fs-extra": "^8.1.0", + "p-map-series": "^1.0.0" + } + }, + "@lerna/info": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", + "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/output": "3.13.0", + "envinfo": "^7.3.1" + } + }, + "@lerna/init": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", + "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "fs-extra": "^8.1.0", + "p-map": "^2.1.0", + "write-json-file": "^3.2.0" + } + }, + "@lerna/link": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", + "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/package-graph": "3.18.5", + "@lerna/symlink-dependencies": "3.17.0", + "p-map": "^2.1.0", + "slash": "^2.0.0" + } + }, + "@lerna/list": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", + "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/listable": "3.18.5", + "@lerna/output": "3.13.0" + } + }, + "@lerna/listable": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", + "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", + "dev": true, + "requires": { + "@lerna/query-graph": "3.18.5", + "chalk": "^2.3.1", + "columnify": "^1.5.4" + } + }, + "@lerna/log-packed": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", + "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", + "dev": true, + "requires": { + "byte-size": "^5.0.1", + "columnify": "^1.5.4", + "has-unicode": "^2.0.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/npm-conf": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", + "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", + "dev": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^4.0.1" + } + }, + "@lerna/npm-dist-tag": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", + "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", + "dev": true, + "requires": { + "@evocateur/npm-registry-fetch": "^4.0.0", + "@lerna/otplease": "3.18.5", + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/npm-install": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", + "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/get-npm-exec-opts": "3.13.0", + "fs-extra": "^8.1.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "signal-exit": "^3.0.2", + "write-pkg": "^3.1.0" + } + }, + "@lerna/npm-publish": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", + "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", + "dev": true, + "requires": { + "@evocateur/libnpmpublish": "^1.2.2", + "@lerna/otplease": "3.18.5", + "@lerna/run-lifecycle": "3.16.2", + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "pify": "^4.0.1", + "read-package-json": "^2.0.13" + } + }, + "@lerna/npm-run-script": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", + "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/get-npm-exec-opts": "3.13.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/otplease": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", + "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", + "dev": true, + "requires": { + "@lerna/prompt": "3.18.5", + "figgy-pudding": "^3.5.1" + } + }, + "@lerna/output": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", + "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/pack-directory": { + "version": "3.16.4", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", + "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", + "dev": true, + "requires": { + "@lerna/get-packed": "3.16.0", + "@lerna/package": "3.16.0", + "@lerna/run-lifecycle": "3.16.2", + "figgy-pudding": "^3.5.1", + "npm-packlist": "^1.4.4", + "npmlog": "^4.1.2", + "tar": "^4.4.10", + "temp-write": "^3.4.0" + } + }, + "@lerna/package": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", + "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", + "dev": true, + "requires": { + "load-json-file": "^5.3.0", + "npm-package-arg": "^6.1.0", + "write-pkg": "^3.1.0" + } + }, + "@lerna/package-graph": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", + "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", + "dev": true, + "requires": { + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/validation-error": "3.13.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/prerelease-id-from-version": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", + "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", + "dev": true, + "requires": { + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/profiler": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", + "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2", + "upath": "^1.2.0" + } + }, + "@lerna/project": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", + "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", + "dev": true, + "requires": { + "@lerna/package": "3.16.0", + "@lerna/validation-error": "3.13.0", + "cosmiconfig": "^5.1.0", + "dedent": "^0.7.0", + "dot-prop": "^4.2.0", + "glob-parent": "^5.0.0", + "globby": "^9.2.0", + "load-json-file": "^5.3.0", + "npmlog": "^4.1.2", + "p-map": "^2.1.0", + "resolve-from": "^4.0.0", + "write-json-file": "^3.2.0" + } + }, + "@lerna/prompt": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", + "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", + "dev": true, + "requires": { + "inquirer": "^6.2.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/publish": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", + "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", + "dev": true, + "requires": { + "@evocateur/libnpmaccess": "^3.1.2", + "@evocateur/npm-registry-fetch": "^4.0.0", + "@evocateur/pacote": "^9.6.3", + "@lerna/check-working-tree": "3.16.5", + "@lerna/child-process": "3.16.5", + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/describe-ref": "3.16.5", + "@lerna/log-packed": "3.16.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/npm-dist-tag": "3.18.5", + "@lerna/npm-publish": "3.18.5", + "@lerna/otplease": "3.18.5", + "@lerna/output": "3.13.0", + "@lerna/pack-directory": "3.16.4", + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/prompt": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", + "@lerna/validation-error": "3.13.0", + "@lerna/version": "3.22.1", + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-pipe": "^1.2.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/pulse-till-done": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", + "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/query-graph": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", + "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", + "dev": true, + "requires": { + "@lerna/package-graph": "3.18.5", + "figgy-pudding": "^3.5.1" + } + }, + "@lerna/resolve-symlink": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", + "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2", + "read-cmd-shim": "^1.0.1" + } + }, + "@lerna/rimraf-dir": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", + "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "npmlog": "^4.1.2", + "path-exists": "^3.0.0", + "rimraf": "^2.6.2" + } + }, + "@lerna/run": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", + "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/npm-run-script": "3.16.5", + "@lerna/output": "3.13.0", + "@lerna/profiler": "3.20.0", + "@lerna/run-topologically": "3.18.5", + "@lerna/timer": "3.13.0", + "@lerna/validation-error": "3.13.0", + "p-map": "^2.1.0" + } + }, + "@lerna/run-lifecycle": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", + "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", + "dev": true, + "requires": { + "@lerna/npm-conf": "3.16.0", + "figgy-pudding": "^3.5.1", + "npm-lifecycle": "^3.1.2", + "npmlog": "^4.1.2" + } + }, + "@lerna/run-topologically": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", + "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", + "dev": true, + "requires": { + "@lerna/query-graph": "3.18.5", + "figgy-pudding": "^3.5.1", + "p-queue": "^4.0.0" + } + }, + "@lerna/symlink-binary": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", + "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", + "dev": true, + "requires": { + "@lerna/create-symlink": "3.16.2", + "@lerna/package": "3.16.0", + "fs-extra": "^8.1.0", + "p-map": "^2.1.0" + } + }, + "@lerna/symlink-dependencies": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", + "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", + "dev": true, + "requires": { + "@lerna/create-symlink": "3.16.2", + "@lerna/resolve-symlink": "3.16.0", + "@lerna/symlink-binary": "3.17.0", + "fs-extra": "^8.1.0", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0" + } + }, + "@lerna/timer": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", + "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", + "dev": true + }, + "@lerna/validation-error": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", + "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/version": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", + "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", + "dev": true, + "requires": { + "@lerna/check-working-tree": "3.16.5", + "@lerna/child-process": "3.16.5", + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/conventional-commits": "3.22.0", + "@lerna/github-client": "3.22.0", + "@lerna/gitlab-client": "3.15.0", + "@lerna/output": "3.13.0", + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/prompt": "3.18.5", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", + "@lerna/validation-error": "3.13.0", + "chalk": "^2.3.1", + "dedent": "^0.7.0", + "load-json-file": "^5.3.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "p-map": "^2.1.0", + "p-pipe": "^1.2.0", + "p-reduce": "^1.0.0", + "p-waterfall": "^1.0.0", + "semver": "^6.2.0", + "slash": "^2.0.0", + "temp-write": "^3.4.0", + "write-json-file": "^3.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/write-log-file": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", + "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", + "dev": true, + "requires": { + "npmlog": "^4.1.2", + "write-file-atomic": "^2.3.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@octokit/auth-token": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz", + "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==", + "dev": true, + "requires": { + "@octokit/types": "^5.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.3.tgz", + "integrity": "sha512-Y900+r0gIz+cWp6ytnkibbD95ucEzDSKzlEnaWS52hbCDNcCJYO5mRmWW7HRAnDc7am+N/5Lnd8MppSaTYx1Yg==", + "dev": true, + "requires": { + "@octokit/types": "^5.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "dev": true, + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true + }, + "universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } + } + } + }, + "@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", + "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", + "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", + "dev": true + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", + "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1", + "deprecation": "^2.3.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/request": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.5.tgz", + "integrity": "sha512-atAs5GAGbZedvJXXdjtKljin+e2SltEs48B3naJjqWupYl2IUBbB/CJisyjbNHcKpHzb3E+OYEZ46G8eakXgQg==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^5.0.0", + "deprecation": "^2.0.0", + "is-plain-object": "^3.0.0", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^5.0.0" + }, + "dependencies": { + "@octokit/request-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.1.tgz", + "integrity": "sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ==", + "dev": true, + "requires": { + "@octokit/types": "^4.0.1", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", + "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "dev": true, + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true + }, + "universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } + } + } + }, + "@octokit/request-error": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", + "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/rest": { + "version": "16.43.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz", + "integrity": "sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.0", + "@octokit/plugin-paginate-rest": "^1.1.1", + "@octokit/plugin-request-log": "^1.0.0", + "@octokit/plugin-rest-endpoint-methods": "2.4.0", + "@octokit/request": "^5.2.0", + "@octokit/request-error": "^1.0.2", + "atob-lite": "^2.0.0", + "before-after-hook": "^2.0.0", + "btoa-lite": "^1.0.0", + "deprecation": "^2.0.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "once": "^1.4.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.0.0.tgz", + "integrity": "sha512-3LVS+MbeqwSd5G4KS8123cZz+hWomsiGeMnQ/QJIBFDwL/YHX8kkr0FZXrgWEMO7Fgi2/VOrhbiFnk9sZ+s4qA==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + }, + "@types/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/node": { + "version": "14.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "@zkochan/cmd-shim": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", + "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", + "dev": true, + "requires": { + "is-windows": "^1.0.0", + "mkdirp-promise": "^5.0.1", + "mz": "^2.5.0" + } + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, + "afinn-165": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/afinn-165/-/afinn-165-1.0.4.tgz", + "integrity": "sha512-7+Wlx3BImrK0HiG6y3lU4xX7SpBPSSu8T9iguPMlaueRFxjbYwAQrp9lqZUuFikqKbd/en8lVREILvP2J80uJA==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "requires": { + "sylvester": ">= 0.0.8" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "before-after-hook": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "optional": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", + "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "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-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-func": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", + "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + } + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "conventional-changelog-angular": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz", + "integrity": "sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", + "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", + "dev": true, + "requires": { + "conventional-changelog-writer": "^4.0.6", + "conventional-commits-parser": "^3.0.3", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "2.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^2.0.3", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz", + "integrity": "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.6", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^7.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "conventional-commits-filter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", + "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", + "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^7.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "conventional-recommended-bump": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", + "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.1.1", + "conventional-commits-filter": "^2.0.2", + "conventional-commits-parser": "^3.0.3", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^2.0.3", + "meow": "^4.0.0", + "q": "^1.5.1" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "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": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "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-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "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": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "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" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "envinfo": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", + "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "git-semver-tags": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", + "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", + "dev": true, + "requires": { + "meow": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "git-up": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "git-url-parse": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "dev": true, + "requires": { + "git-up": "^4.0.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "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" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", + "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-ssh": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", + "dev": true, + "requires": { + "protocols": "^1.1.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lerna": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", + "integrity": "sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg==", + "dev": true, + "requires": { + "@lerna/add": "3.21.0", + "@lerna/bootstrap": "3.21.0", + "@lerna/changed": "3.21.0", + "@lerna/clean": "3.21.0", + "@lerna/cli": "3.18.5", + "@lerna/create": "3.22.0", + "@lerna/diff": "3.21.0", + "@lerna/exec": "3.21.0", + "@lerna/import": "3.22.0", + "@lerna/info": "3.21.0", + "@lerna/init": "3.21.0", + "@lerna/link": "3.21.0", + "@lerna/list": "3.21.0", + "@lerna/publish": "3.22.1", + "@lerna/run": "3.21.0", + "@lerna/version": "3.22.1", + "import-local": "^2.0.0", + "npmlog": "^4.1.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "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": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "requires": { + "mkdirp": "*" + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", + "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", + "dev": true, + "requires": { + "array-differ": "^2.0.3", + "array-union": "^1.0.2", + "arrify": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "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": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/natural/-/natural-2.1.5.tgz", + "integrity": "sha512-z5ljUGW3Nqgu+e1m0/sN0b7GSsbGyGCTCgQJ6hv0sxOe2+8FaIlkdHIGkP0y1zCxO0vYawukOEUTryY9NKix7w==", + "requires": { + "afinn-165": "^1.0.2", + "apparatus": "^0.0.10", + "json-stable-stringify": "^1.0.1", + "sylvester": "^0.0.12", + "underscore": "^1.9.1", + "webpack": "^4.29.0", + "wordnet-db": "^3.1.11" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", + "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "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" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-lifecycle": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", + "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", + "dev": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.15", + "node-gyp": "^5.0.2", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "numpy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/numpy/-/numpy-0.0.1.tgz", + "integrity": "sha1-xrvUxJtFvVN/dooJySIKKQ3kFZg=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "octokit-pagination-methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", + "dev": true + }, + "p-queue": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz", + "integrity": "sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==", + "dev": true, + "requires": { + "eventemitter3": "^3.1.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "p-waterfall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz", + "integrity": "sha1-ftlLPOszMngjU69qrhGqn8I1uwA=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "papaparse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", + "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "parse-url": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "normalize-url": "^3.3.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "requires": { + "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": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "promzard": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "dev": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "protocols": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", + "dev": true + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", + "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-package-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "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": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "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": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "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" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sylvester": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.12.tgz", + "integrity": "sha1-WohEFc0tACxX56OqyZRip1zp/bQ=" + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "temp-write": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", + "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "is-stream": "^1.1.0", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.3" + } + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true + }, + "umask": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", + "dev": true + }, + "underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-user-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", + "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "watchpack": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "requires": { + "chokidar": "^3.4.0", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "windows-release": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.1.tgz", + "integrity": "sha512-Pngk/RDCaI/DkuHPlGTdIkDiTAnAkyMjoQMZqRsxydNl1qGXNIoZrB7RK8g53F2tEgQBMqQJHQdYZuQEEAu54A==", + "dev": true, + "requires": { + "execa": "^1.0.0" + } + }, + "wordnet-db": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/wordnet-db/-/wordnet-db-3.1.14.tgz", + "integrity": "sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "dev": true, + "requires": { + "sort-keys": "^2.0.0", + "write-json-file": "^2.2.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json index b06a49faa..7eed1045f 100644 --- a/package.json +++ b/package.json @@ -4,5 +4,10 @@ "private": true, "devDependencies": { "lerna": "^3.20.2" + }, + "dependencies": { + "natural": "^2.1.5", + "numpy": "0.0.1", + "papaparse": "^5.3.0" } } diff --git a/packages/.DS_Store b/packages/.DS_Store new file mode 100644 index 000000000..287deb5a7 Binary files /dev/null and b/packages/.DS_Store differ diff --git a/packages/scratch-blocks/.editorconfig b/packages/scratch-blocks/.editorconfig deleted file mode 100644 index 0f099897b..000000000 --- a/packages/scratch-blocks/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -# editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/scratch-blocks/.eslintignore b/packages/scratch-blocks/.eslintignore deleted file mode 100644 index d13589d3b..000000000 --- a/packages/scratch-blocks/.eslintignore +++ /dev/null @@ -1,16 +0,0 @@ -*_compressed*.js -*_uncompressed*.js -/msg/* -/core/css.js -/i18n/* -/tests/jsunit/* -/tests/workspace_svg/* -/tests/blocks/* -/demos/* -/accessible/* -/appengine/* -/shim/* -/dist/* -/gh-pages/* -/webpack.config.js -/build/* diff --git a/packages/scratch-blocks/.eslintrc b/packages/scratch-blocks/.eslintrc deleted file mode 100644 index 85432cdfc..000000000 --- a/packages/scratch-blocks/.eslintrc +++ /dev/null @@ -1,60 +0,0 @@ -{ - "rules": { - "curly": ["error", "multi-line"], - "eol-last": ["error"], - "indent": [ - "error", 2, # Blockly/Google use 2-space indents - # Blockly/Google uses +4 space indents for line continuations. - { - "SwitchCase": 1, - "MemberExpression": 2, - "ObjectExpression": 1, - "FunctionDeclaration": { - "body": 1, - "parameters": 2 - }, - "FunctionExpression": { - "body": 1, - "parameters": 2 - }, - "CallExpression": { - "arguments": 2 - }, - # Ignore default rules for ternary expressions. - "ignoredNodes": ["ConditionalExpression"] - } - ], - "linebreak-style": ["error", "unix"], - "max-len": ["error", 120, 4], - "no-trailing-spaces": ["error", { "skipBlankLines": true }], - "no-unused-vars": [ - "error", - { - "args": "after-used", - # Ignore vars starting with an underscore. - "varsIgnorePattern": "^_", - # Ignore arguments starting with an underscore. - "argsIgnorePattern": "^_" - } - ], - "no-use-before-define": ["error"], - "quotes": ["off"], # Blockly mixes single and double quotes - "semi": ["error", "always"], - "space-before-function-paren": ["error", "never"], # Blockly doesn't have space before function paren - "space-infix-ops": ["error"], - "strict": ["off"], # Blockly uses 'use strict' in files - "no-cond-assign": ["off"], # Blockly often uses cond-assignment in loops - "no-redeclare": ["off"], # Closure style allows redeclarations - "valid-jsdoc": ["error", {"requireReturn": false}], - "no-console": ["off"], - "no-constant-condition": ["off"] - }, - "env": { - "browser": true - }, - "globals": { - "Blockly": true, # Blockly global - "goog": true, # goog closure libraries/includes - }, - "extends": "eslint:recommended" -} diff --git a/packages/scratch-blocks/.github/CONTRIBUTING.md b/packages/scratch-blocks/.github/CONTRIBUTING.md deleted file mode 100644 index 37c4e5cd0..000000000 --- a/packages/scratch-blocks/.github/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -## Contributing -The development of Scratch is an ongoing process, and we love to have people in the Scratch and open source communities help us along the way. - -If you're interested in contributing, please take a look at the [issues](https://github.com/LLK/scratch-blocks/issues) on this repository. -Two great ways of helping are by identifying bugs and documenting them as issues, or fixing issues and creating pull requests. When looking for bugs to fix, please look for the ["Help Wanted" label](https://github.com/LLK/scratch-blocks/issues?q=label%3A%22help+wanted%22). Bugs with this label have been specifically set aside for Open Source contributors. Issues without the label can also be worked on but we ask that you comment on the issue prior to starting work. When submitting pull requests please be patient -- it can take a while to find time to review them. The organization and class structures can't be radically changed without significant coordination and collaboration from the Scratch Team, so these types of changes should be avoided. - -It's been said that the Scratch Team spends about one hour of design discussion for every pixel in Scratch, but some think that estimate is a little low. While we welcome suggestions for new features in our [suggestions forum](https://scratch.mit.edu/discuss/1/) (especially ones that come with mockups), we are unlikely to accept PRs with new features that haven't been thought through and discussed as a group. Why? Because we have a strong belief in the value of keeping things simple for new users. To learn more about our design philosophy, see [the Scratch Developers page](https://scratch.mit.edu/developers), or [this paper](http://web.media.mit.edu/~mres/papers/Scratch-CACM-final.pdf). - -Beyond this repo, there are also some other resources that you might want to take a look at: -* [Community Guidelines](https://github.com/LLK/scratch-www/wiki/Community-Guidelines) (we find it important to maintain a constructive and welcoming community, just like on Scratch) -* [Open Source forum](https://scratch.mit.edu/discuss/49/) on Scratch -* [Suggestions forum](https://scratch.mit.edu/discuss/1/) on Scratch -* [Bugs & Glitches forum](https://scratch.mit.edu/discuss/3/) on Scratch diff --git a/packages/scratch-blocks/.github/ISSUE_TEMPLATE.md b/packages/scratch-blocks/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 38756937c..000000000 --- a/packages/scratch-blocks/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,15 +0,0 @@ -### Expected Behavior - -_Please describe what should happen_ - -### Actual Behavior - -_Describe what actually happens_ - -### Steps to Reproduce - -_Explain what someone needs to do in order to see what's described in *Actual behavior* above_ - -### Operating System and Browser - -_e.g. Mac OS 10.11.6 Safari 10.0_ diff --git a/packages/scratch-blocks/.github/PULL_REQUEST_TEMPLATE.md b/packages/scratch-blocks/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 33ff6dfde..000000000 --- a/packages/scratch-blocks/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,15 +0,0 @@ -### Resolves - -_What Github issue does this resolve (please include link)?_ - -### Proposed Changes - -_Describe what this Pull Request does_ - -### Reason for Changes - -_Explain why these changes should be made_ - -### Test Coverage - -_Please show how you have added tests to cover your changes_ diff --git a/packages/scratch-blocks/.gitignore b/packages/scratch-blocks/.gitignore deleted file mode 100644 index ca5e13595..000000000 --- a/packages/scratch-blocks/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# OSX -.DS_Store - -# NPM -/node_modules -npm-* - -# Localization / I18N -common.pyc -.settings -.project -*.pyc -*.komodoproject -/nbproject/private/ - -# Unused by scratch-blocks -dart_compressed.js -javascript_compressed.js -lua_compressed.js -php_compressed.js -python_compressed.js - -# Editor -.vscode - -/accessible/* -/dist -/msg/js/* -!/msg/js/en.js -/msg/json/* -!/msg/json/en.json -/blockly_compressed_horizontal.js -/blockly_compressed_vertical.js -/blockly_uncompressed_horizontal.js -/blockly_uncompressed_vertical.js -/blocks_compressed_horizontal.js -/blocks_compressed_vertical.js -/blocks_compressed.js -/gh-pages/main.js -/gh-pages/playgrounds -/gh-pages/Gemfile.lock -/gh-pages/closure-library -/gh-pages/_site -/*compiler*.jar -/local_blockly_compressed_vertical.js -/chromedriver diff --git a/packages/scratch-blocks/.npmignore b/packages/scratch-blocks/.npmignore deleted file mode 100644 index 795aaf6e1..000000000 --- a/packages/scratch-blocks/.npmignore +++ /dev/null @@ -1,26 +0,0 @@ -# Development files -.eslintrc -/.editorconfig -/.eslintignore -/.gitattributes -/.github -/.travis.yml -/.tx -/tests -/webpack.config.js - -# Localization / I18N -common.pyc -.settings -.project -*.pyc -*.komodoproject -/nbproject/private/ - -/accessible/* - -# Build created files -/gh-pages - -# Exclude already built packages from testing with npm pack -/scratch-blocks-*.{tar,tgz} diff --git a/packages/scratch-blocks/.npmrc b/packages/scratch-blocks/.npmrc deleted file mode 100644 index 214c29d13..000000000 --- a/packages/scratch-blocks/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry=https://registry.npmjs.org/ diff --git a/packages/scratch-blocks/.travis.yml b/packages/scratch-blocks/.travis.yml deleted file mode 100644 index 3b60d72cc..000000000 --- a/packages/scratch-blocks/.travis.yml +++ /dev/null @@ -1,44 +0,0 @@ -language: node_js -node_js: -- "8" -- "stable" -sudo: required -addons: - chrome: stable -cache: - directories: - - node_modules - -before_install: -# Symlink closure library -- ln -s $(npm root)/google-closure-library ../closure-library - -before_script: - - export DISPLAY=:99.0 - - tests/scripts/setup_linux_env.sh - - sleep 2 - -after_script: -- | - # RELEASE_BRANCHES and NPM_TOKEN defined in Travis settings panel - declare exitCode - $(npm bin)/travis-after-all - exitCode=$? - if [[ - # Execute after all jobs finish successfully - $exitCode = 0 && - # Only release on release branches - $RELEASE_BRANCHES =~ $TRAVIS_BRANCH && - # Don't release on PR builds - $TRAVIS_PULL_REQUEST = "false" - ]]; then - # Authenticate NPM - echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc - # Set version to timestamp - npm --no-git-tag-version version $($(npm bin)/json -f package.json version)-prerelease.$(date +%s) - npm publish - # Publish to gh-pages as most recent committer - git config --global user.email $(git log --pretty=format:"%ae" -n1) - git config --global user.name $(git log --pretty=format:"%an" -n1) - npm run --silent deploy -- -x -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git - fi diff --git a/packages/scratch-blocks/.tx/config b/packages/scratch-blocks/.tx/config deleted file mode 100644 index fcff4d3b5..000000000 --- a/packages/scratch-blocks/.tx/config +++ /dev/null @@ -1,9 +0,0 @@ -[main] -host = https://www.transifex.com -lang_map = zh_CN:zh-cn, zh_TW:zh-tw, pt_BR:pt-br, es_419:es-419 - -[scratch-editor.blocks] -file_filter = msg/json/.json -source_file = msg/json/en.json -source_lang = en -type = KEYVALUEJSON diff --git a/packages/scratch-blocks/LICENSE b/packages/scratch-blocks/LICENSE deleted file mode 100644 index 6a1992987..000000000 --- a/packages/scratch-blocks/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2011 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/packages/scratch-blocks/README.md b/packages/scratch-blocks/README.md deleted file mode 100644 index d84aabec9..000000000 --- a/packages/scratch-blocks/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# scratch-blocks -#### Scratch Blocks is a library for building creative computing interfaces. -[![Build Status](https://travis-ci.org/LLK/scratch-blocks.svg?branch=develop)](https://travis-ci.org/LLK/scratch-blocks) -[![Dependency Status](https://david-dm.org/LLK/scratch-blocks.svg)](https://david-dm.org/LLK/scratch-blocks) -[![devDependency Status](https://david-dm.org/LLK/scratch-blocks/dev-status.svg)](https://david-dm.org/LLK/scratch-blocks#info=devDependencies) - -![](https://cloud.githubusercontent.com/assets/747641/15227351/c37c09da-1854-11e6-8dc7-9a298f2b1f01.jpg) - -## Introduction -Scratch Blocks is a fork of Google's [Blockly](https://github.com/google/blockly) project that provides a design specification and codebase for building creative computing interfaces. Together with the [Scratch Virtual Machine (VM)](https://github.com/LLK/scratch-vm) this codebase allows for the rapid design and development of visual programming interfaces. Unlike [Blockly](https://github.com/google/blockly), Scratch Blocks does not use [code generators](https://developers.google.com/blockly/guides/configure/web/code-generators), but rather leverages the [Scratch Virtual Machine](https://github.com/LLK/scratch-vm) to create highly dynamic, interactive programming environments. - -*This project is in active development and should be considered a "developer preview" at this time.* - -## Two Types of Blocks -![](https://cloud.githubusercontent.com/assets/747641/15255731/dad4d028-190b-11e6-9c16-8df7445adc96.png) - -Scratch Blocks brings together two different programming "grammars" that the Scratch Team has designed and continued to refine over the past decade. The standard [Scratch](https://scratch.mit.edu) grammar uses blocks that snap together vertically, much like LEGO bricks. For our [ScratchJr](https://scratchjr.org) software, intended for younger children, we developed blocks that are labelled with icons rather than words, and snap together horizontally rather than vertically. We have found that the horizontal grammar is not only friendlier for beginning programmers but also better suited for devices with small screens. - -## Documentation -The "getting started" guide including [FAQ](https://scratch.mit.edu/developers#faq) and [design documentation](https://github.com/LLK/scratch-blocks/wiki/Design) can be found in the [wiki](https://github.com/LLK/scratch-blocks/wiki). - -## Donate -We provide [Scratch](https://scratch.mit.edu) free of charge, and want to keep it that way! Please consider making a [donation](https://secure.donationpay.org/scratchfoundation/) to support our continued engineering, design, community, and resource development efforts. Donations of any size are appreciated. Thank you! diff --git a/packages/scratch-blocks/TRADEMARK b/packages/scratch-blocks/TRADEMARK deleted file mode 100644 index 17b5d4c91..000000000 --- a/packages/scratch-blocks/TRADEMARK +++ /dev/null @@ -1 +0,0 @@ -The Scratch trademarks, including the Scratch name, logo, the Scratch Cat, Gobo, Pico, Nano, Tera and Giga graphics (the "Marks"), are property of the Massachusetts Institute of Technology (MIT). Marks may not be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/packages/scratch-blocks/blocks_common/colour.js b/packages/scratch-blocks/blocks_common/colour.js deleted file mode 100644 index 30be7523a..000000000 --- a/packages/scratch-blocks/blocks_common/colour.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Colour blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.colour'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.constants'); - -/** - * Pick a random colour. - * @return {string} #RRGGBB for random colour. - */ -function randomColour() { - var num = Math.floor(Math.random() * Math.pow(2, 24)); - return '#' + ('00000' + num.toString(16)).substr(-6); -} - -Blockly.Blocks['colour_picker'] = { - /** - * Block for colour picker. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_colour_slider", - "name": "COLOUR", - "colour": randomColour() - } - ], - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "output": "Colour" - }); - } -}; diff --git a/packages/scratch-blocks/blocks_common/math.js b/packages/scratch-blocks/blocks_common/math.js deleted file mode 100644 index 615228ff7..000000000 --- a/packages/scratch-blocks/blocks_common/math.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Math blocks for Blockly. - * @author q.neutron@gmail.com (Quynh Neutron) - */ -'use strict'; - -goog.provide('Blockly.Blocks.math'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -goog.require('Blockly.constants'); - -Blockly.Blocks['math_number'] = { - /** - * Block for generic numeric value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_number", - "name": "NUM", - "value": "0" - } - ], - "output": "Number", - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; - -Blockly.Blocks['math_integer'] = { - /** - * Block for integer value (no decimal, + or -). - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_number", - "name": "NUM", - "precision": 1 - } - ], - "output": "Number", - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; - -Blockly.Blocks['math_whole_number'] = { - /** - * Block for whole number value, no negatives or decimals. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_number", - "name": "NUM", - "min": 0, - "precision": 1 - } - ], - "output": "Number", - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; - -Blockly.Blocks['math_positive_number'] = { - /** - * Block for positive number value, with decimal. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_number", - "name": "NUM", - "min": 0 - } - ], - "output": "Number", - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; - -Blockly.Blocks['math_angle'] = { - /** - * Block for angle picker. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_angle", - "name": "NUM", - "value": 90 - } - ], - "output": "Number", - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; diff --git a/packages/scratch-blocks/blocks_common/matrix.js b/packages/scratch-blocks/blocks_common/matrix.js deleted file mode 100644 index 8945f8b09..000000000 --- a/packages/scratch-blocks/blocks_common/matrix.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Matrix blocks for Blockly. - * @author khanning@gmail.com (Kreg Hanning) - */ -'use strict'; - -goog.provide('Blockly.Blocks.matrix'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -goog.require('Blockly.constants'); - -Blockly.Blocks['matrix'] = { - /** - * Block for matrix value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_matrix", - "name": "MATRIX" - } - ], - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "output": "Number", - "extensions": ["colours_pen"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_common/note.js b/packages/scratch-blocks/blocks_common/note.js deleted file mode 100644 index 91ffffd5e..000000000 --- a/packages/scratch-blocks/blocks_common/note.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Note block. - * @author ericr@media.mit.edu (Eric Rosenbaum) - */ -'use strict'; - -goog.provide('Blockly.Blocks.note'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -goog.require('Blockly.constants'); - -Blockly.Blocks['note'] = { - /** - * Block for musical note value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_note", - "name": "NOTE", - "value": 60 - } - ], - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "output": "Number", - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; diff --git a/packages/scratch-blocks/blocks_common/text.js b/packages/scratch-blocks/blocks_common/text.js deleted file mode 100644 index 1c2c57f00..000000000 --- a/packages/scratch-blocks/blocks_common/text.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Text blocks for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Blocks.texts'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -goog.require('Blockly.constants'); - -Blockly.Blocks['text'] = { - /** - * Block for text value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_input", - "name": "TEXT" - } - ], - "output": "String", - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField - }); - } -}; diff --git a/packages/scratch-blocks/blocks_horizontal/control.js b/packages/scratch-blocks/blocks_horizontal/control.js deleted file mode 100644 index 8aa9418fe..000000000 --- a/packages/scratch-blocks/blocks_horizontal/control.js +++ /dev/null @@ -1,207 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Control blocks for Scratch (Horizontal) - * @author ascii@media.mit.edu - */ -'use strict'; - -goog.provide('Blockly.Blocks.control'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -Blockly.Blocks['control_repeat'] = { - /** - * Block for repeat n times (external number). - * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_repeat", - "message0": "%1 %2 %3", - "args0": [ - { - "type": "input_statement", - "name": "SUBSTACK" - }, - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_repeat.svg", - "width": 40, - "height": 40, - "alt": "*", - "flip_rtl": true - }, - { - "type": "input_value", - "name": "TIMES", - "check": "Number" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.control, - "colour": Blockly.Colours.control.primary, - "colourSecondary": Blockly.Colours.control.secondary, - "colourTertiary": Blockly.Colours.control.tertiary - }); - } -}; - -Blockly.Blocks['control_forever'] = { - /** - * Block for repeat n times (external number). - * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#5eke39 - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_forever", - "message0": "%1 %2", - "args0": [ - { - "type": "input_statement", - "name": "SUBSTACK" - }, - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_forever.svg", - "width": 40, - "height": 40, - "alt": "*", - "flip_rtl": true - } - ], - "inputsInline": true, - "previousStatement": null, - "category": Blockly.Categories.control, - "colour": Blockly.Colours.control.primary, - "colourSecondary": Blockly.Colours.control.secondary, - "colourTertiary": Blockly.Colours.control.tertiary - }); - } -}; - -Blockly.Blocks['control_repeat'] = { - /** - * Block for repeat n times (external number). - * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_repeat", - "message0": "%1 %2 %3", - "args0": [ - { - "type": "input_statement", - "name": "SUBSTACK" - }, - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_repeat.svg", - "width": 40, - "height": 40, - "alt": "*", - "flip_rtl": true - }, - { - "type": "input_value", - "name": "TIMES", - "check": "Number" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.control, - "colour": Blockly.Colours.control.primary, - "colourSecondary": Blockly.Colours.control.secondary, - "colourTertiary": Blockly.Colours.control.tertiary - }); - } -}; - -Blockly.Blocks['control_stop'] = { - /** - * Block for stop all scripts. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_stop", - "message0": "%1", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_stop.svg", - "width": 40, - "height": 40, - "alt": "Stop" - } - ], - "inputsInline": true, - "previousStatement": null, - "category": Blockly.Categories.control, - "colour": Blockly.Colours.control.primary, - "colourSecondary": Blockly.Colours.control.secondary, - "colourTertiary": Blockly.Colours.control.tertiary - }); - } -}; - -Blockly.Blocks['control_wait'] = { - /** - * Block to wait (pause) stack. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_wait", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/control_wait.svg", - "width": 40, - "height": 40, - "alt": "Wait" - }, - { - "type": "input_value", - "name": "DURATION", - "check": "Number" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.control, - "colour": Blockly.Colours.control.primary, - "colourSecondary": Blockly.Colours.control.secondary, - "colourTertiary": Blockly.Colours.control.tertiary - }); - } -}; diff --git a/packages/scratch-blocks/blocks_horizontal/default_toolbox.js b/packages/scratch-blocks/blocks_horizontal/default_toolbox.js deleted file mode 100644 index f5fd741c5..000000000 --- a/packages/scratch-blocks/blocks_horizontal/default_toolbox.js +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.defaultToolbox'); - -goog.require('Blockly.Blocks'); - -/** - * @fileoverview Provide a default toolbox XML. - */ - -Blockly.Blocks.defaultToolbox = ''; - -Blockly.Blocks.defaultToolboxSimple = ''; diff --git a/packages/scratch-blocks/blocks_horizontal/event.js b/packages/scratch-blocks/blocks_horizontal/event.js deleted file mode 100644 index 19a6ebab0..000000000 --- a/packages/scratch-blocks/blocks_horizontal/event.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Control blocks for Scratch (Horizontal) - * @author ascii@media.mit.edu - */ -'use strict'; - -goog.provide('Blockly.Blocks.event'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -Blockly.Blocks['event_whenflagclicked'] = { - /** - * Block for when flag clicked. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_whenflagclicked", - "message0": "%1", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_whenflagclicked.svg", - "width": 40, - "height": 40, - "alt": "When green flag clicked", - "flip_rtl": true - } - ], - "inputsInline": true, - "nextStatement": null, - "category": Blockly.Categories.event, - "colour": Blockly.Colours.event.primary, - "colourSecondary": Blockly.Colours.event.secondary, - "colourTertiary": Blockly.Colours.event.tertiary - }); - } -}; - -Blockly.Blocks['dropdown_whenbroadcast'] = { - /** - * Block for when broadcast dropdown (used for shadow). - * @this Blockly.Block - */ - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldIconMenu( - [ - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_blue.svg', - value: 'blue', width: 48, height: 48, alt: 'Blue'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_green.svg', - value: 'green', width: 48, height: 48, alt: 'Green'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_coral.svg', - value: 'coral', width: 48, height: 48, alt: 'Coral'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_magenta.svg', - value: 'magenta', width: 48, height: 48, alt: 'Magenta'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_orange.svg', - value: 'orange', width: 48, height: 48, alt: 'Orange'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_when-broadcast-received_purple.svg', - value: 'purple', width: 48, height: 48, alt: 'Purple'} - ]), 'CHOICE'); - this.setOutput(true); - this.setColour(Blockly.Colours.event.primary, - Blockly.Colours.event.secondary, - Blockly.Colours.event.tertiary - ); - } -}; - -Blockly.Blocks['event_whenbroadcastreceived'] = { - /** - * Block for when broadcast received. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_whenbroadcastreceived", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_when-broadcast-received_blue.svg", - "width": 40, - "height": 40, - "alt": "Broadcast received" - }, - { - "type": "input_value", - "name": "CHOICE" - } - ], - "inputsInline": true, - "nextStatement": null, - "category": Blockly.Categories.event, - "colour": Blockly.Colours.event.primary, - "colourSecondary": Blockly.Colours.event.secondary, - "colourTertiary": Blockly.Colours.event.tertiary - }); - } -}; - -Blockly.Blocks['dropdown_broadcast'] = { - /** - * Block for broadcast dropdown (used for shadow). - * @this Blockly.Block - */ - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldIconMenu( - [ - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_blue.svg', - value: 'blue', width: 48, height: 48, alt: 'Blue'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_green.svg', - value: 'green', width: 48, height: 48, alt: 'Green'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_coral.svg', - value: 'coral', width: 48, height: 48, alt: 'Coral'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_magenta.svg', - value: 'magenta', width: 48, height: 48, alt: 'Magenta'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_orange.svg', - value: 'orange', width: 48, height: 48, alt: 'Orange'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/event_broadcast_purple.svg', - value: 'purple', width: 48, height: 48, alt: 'Purple'} - ]), 'CHOICE'); - this.setOutput(true); - this.setColour(Blockly.Colours.event.primary, - Blockly.Colours.event.secondary, - Blockly.Colours.event.tertiary - ); - } -}; - -Blockly.Blocks['event_broadcast'] = { - /** - * Block to send a broadcast. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_broadcast", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/event_broadcast_blue.svg", - "width": 40, - "height": 40, - "alt": "Broadcast" - }, - { - "type": "input_value", - "name": "CHOICE" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.event, - "colour": Blockly.Colours.event.primary, - "colourSecondary": Blockly.Colours.event.secondary, - "colourTertiary": Blockly.Colours.event.tertiary - }); - } -}; diff --git a/packages/scratch-blocks/blocks_horizontal/wedo.js b/packages/scratch-blocks/blocks_horizontal/wedo.js deleted file mode 100644 index f2052aa29..000000000 --- a/packages/scratch-blocks/blocks_horizontal/wedo.js +++ /dev/null @@ -1,316 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Wedo blocks for Scratch (Horizontal) - * @author ascii@media.mit.edu - */ -'use strict'; - -goog.provide('Blockly.Blocks.wedo'); - -goog.require('Blockly.Blocks'); - -goog.require('Blockly.Colours'); - -Blockly.Blocks['dropdown_wedo_setcolor'] = { - /** - * Block for set color drop-down (used for shadow). - * @this Blockly.Block - */ - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldIconMenu( - [ - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_mystery.svg', - value: 'mystery', width: 48, height: 48, alt: 'Mystery'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_yellow.svg', - value: 'yellow', width: 48, height: 48, alt: 'Yellow'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_orange.svg', - value: 'orange', width: 48, height: 48, alt: 'Orange'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_coral.svg', - value: 'coral', width: 48, height: 48, alt: 'Coral'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_magenta.svg', - value: 'magenta', width: 48, height: 48, alt: 'Magenta'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_purple.svg', - value: 'purple', width: 48, height: 48, alt: 'Purple'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_blue.svg', - value: 'blue', width: 48, height: 48, alt: 'Blue'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_green.svg', - value: 'green', width: 48, height: 48, alt: 'Green'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/set-led_white.svg', - value: 'white', width: 48, height: 48, alt: 'White'} - ]), 'CHOICE'); - this.setOutput(true); - this.setColour(Blockly.Colours.looks.primary, - Blockly.Colours.looks.secondary, - Blockly.Colours.looks.tertiary - ); - } -}; - -Blockly.Blocks['wedo_setcolor'] = { - /** - * Block to set color of LED - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "wedo_setcolor", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/set-led_blue.svg", - "width": 40, - "height": 40, - "alt": "Set LED Color" - }, - { - "type": "input_value", - "name": "CHOICE" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.looks, - "colour": Blockly.Colours.looks.primary, - "colourSecondary": Blockly.Colours.looks.secondary, - "colourTertiary": Blockly.Colours.looks.tertiary - }); - } -}; - -Blockly.Blocks['wedo_motorclockwise'] = { - /** - * Block to spin motor clockwise. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "wedo_motorclockwise", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_motor-clockwise.svg", - "width": 40, - "height": 40, - "alt": "Turn motor clockwise" - }, - { - "type": "input_value", - "name": "DURATION", - "check": "Number" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.motion, - "colour": Blockly.Colours.motion.primary, - "colourSecondary": Blockly.Colours.motion.secondary, - "colourTertiary": Blockly.Colours.motion.tertiary - }); - } -}; - -Blockly.Blocks['wedo_motorcounterclockwise'] = { - /** - * Block to spin motor counter-clockwise. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "wedo_motorcounterclockwise", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_motor-counterclockwise.svg", - "width": 40, - "height": 40, - "alt": "Turn motor counter-clockwise" - }, - { - "type": "input_value", - "name": "DURATION", - "check": "Number" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.motion, - "colour": Blockly.Colours.motion.primary, - "colourSecondary": Blockly.Colours.motion.secondary, - "colourTertiary": Blockly.Colours.motion.tertiary - }); - } -}; - -Blockly.Blocks['dropdown_wedo_motorspeed'] = { - /** - * Block for motor speed drop-down (used for shadow). - * @this Blockly.Block - */ - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldIconMenu( - [ - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_motor-speed_slow.svg', - value: 'slow', width: 48, height: 48, alt: 'Slow'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_motor-speed_med.svg', - value: 'medium', width: 48, height: 48, alt: 'Medium'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_motor-speed_fast.svg', - value: 'fast', width: 48, height: 48, alt: 'Fast'} - ]), 'CHOICE'); - this.setOutput(true); - this.setColour(Blockly.Colours.motion.primary, - Blockly.Colours.motion.secondary, - Blockly.Colours.motion.tertiary - ); - } -}; - -Blockly.Blocks['wedo_motorspeed'] = { - /** - * Block to set motor speed. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "wedo_motorspeed", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_motor-speed_fast.svg", - "width": 40, - "height": 40, - "alt": "Motor Speed" - }, - { - "type": "input_value", - "name": "CHOICE" - } - ], - "inputsInline": true, - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.motion, - "colour": Blockly.Colours.motion.primary, - "colourSecondary": Blockly.Colours.motion.secondary, - "colourTertiary": Blockly.Colours.motion.tertiary - }); - } -}; - -Blockly.Blocks['dropdown_wedo_whentilt'] = { - /** - * Block for when tilt drop-down (used for shadow). - * @this Blockly.Block - */ - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldIconMenu( - [ - {type: 'placeholder', width: 48, height: 48}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-forward.svg', - value: 'forward', width: 48, height: 48, alt: 'Tilt forward'}, - {type: 'placeholder', width: 48, height: 48}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-left.svg', - value: 'left', width: 48, height: 48, alt: 'Tilt left'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt.svg', - value: 'any', width: 48, height: 48, alt: 'Tilt any'}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-right.svg', - value: 'right', width: 48, height: 48, alt: 'Tilt right'}, - {type: 'placeholder', width: 48, height: 48}, - {src: Blockly.mainWorkspace.options.pathToMedia + 'icons/wedo_when-tilt-backward.svg', - value: 'backward', width: 48, height: 48, alt: 'Tilt backward'} - ]), 'CHOICE'); - this.setOutput(true); - this.setColour(Blockly.Colours.event.primary, - Blockly.Colours.event.secondary, - Blockly.Colours.event.tertiary - ); - } -}; - -Blockly.Blocks['wedo_whentilt'] = { - /** - * Block for when tilted. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "wedo_whentilt", - "message0": "%1 %2", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_when-tilt.svg", - "width": 40, - "height": 40, - "alt": "When tilted" - }, - { - "type": "input_value", - "name": "CHOICE" - } - ], - "inputsInline": true, - "nextStatement": null, - "category": Blockly.Categories.event, - "colour": Blockly.Colours.event.primary, - "colourSecondary": Blockly.Colours.event.secondary, - "colourTertiary": Blockly.Colours.event.tertiary - }); - } -}; - -Blockly.Blocks['wedo_whendistanceclose'] = { - /** - * Block for when distance sensor is close. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "wedo_whendistanceclose", - "message0": "%1", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "icons/wedo_when-distance_close.svg", - "width": 40, - "height": 40, - "alt": "When distance close" - } - ], - "inputsInline": true, - "nextStatement": null, - "category": Blockly.Categories.event, - "colour": Blockly.Colours.event.primary, - "colourSecondary": Blockly.Colours.event.secondary, - "colourTertiary": Blockly.Colours.event.tertiary - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/control.js b/packages/scratch-blocks/blocks_vertical/control.js deleted file mode 100644 index e5bb20b55..000000000 --- a/packages/scratch-blocks/blocks_vertical/control.js +++ /dev/null @@ -1,531 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.control'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - - -Blockly.Blocks['control_forever'] = { - /** - * Block for repeat n times (external number). - * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#5eke39 - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_forever", - "message0": Blockly.Msg.CONTROL_FOREVER, - "message1": "%1", // Statement - "message2": "%1", // Icon - "lastDummyAlign2": "RIGHT", - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "args2": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", - "width": 24, - "height": 24, - "alt": "*", - "flip_rtl": true - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_end"] - }); - } -}; - -Blockly.Blocks['control_repeat'] = { - /** - * Block for repeat n times (external number). - * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9 - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_repeat", - "message0": Blockly.Msg.CONTROL_REPEAT, - "message1": "%1", // Statement - "message2": "%1", // Icon - "lastDummyAlign2": "RIGHT", - "args0": [ - { - "type": "input_value", - "name": "TIMES" - } - ], - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "args2": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", - "width": 24, - "height": 24, - "alt": "*", - "flip_rtl": true - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_if'] = { - /** - * Block for if-then. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "type": "control_if", - "message0": Blockly.Msg.CONTROL_IF, - "message1": "%1", // Statement - "args0": [ - { - "type": "input_value", - "name": "CONDITION", - "check": "Boolean" - } - ], - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_if_else'] = { - /** - * Block for if-else. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "type": "control_if_else", - "message0": Blockly.Msg.CONTROL_IF, - "message1": "%1", - "message2": Blockly.Msg.CONTROL_ELSE, - "message3": "%1", - "args0": [ - { - "type": "input_value", - "name": "CONDITION", - "check": "Boolean" - } - ], - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "args3": [ - { - "type": "input_statement", - "name": "SUBSTACK2" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_stop'] = { - /** - * Block for stop all scripts. - * @this Blockly.Block - */ - init: function() { - var ALL_SCRIPTS = 'all'; - var THIS_SCRIPT = 'this script'; - var OTHER_SCRIPTS = 'other scripts in sprite'; - var stopDropdown = new Blockly.FieldDropdown(function() { - if (this.sourceBlock_ && - this.sourceBlock_.nextConnection && - this.sourceBlock_.nextConnection.isConnected()) { - return [ - [Blockly.Msg.CONTROL_STOP_OTHER, OTHER_SCRIPTS] - ]; - } - return [[Blockly.Msg.CONTROL_STOP_ALL, ALL_SCRIPTS], - [Blockly.Msg.CONTROL_STOP_THIS, THIS_SCRIPT], - [Blockly.Msg.CONTROL_STOP_OTHER, OTHER_SCRIPTS] - ]; - }, function(option) { - // Create an event group to keep field value and mutator in sync - // Return null at the end because setValue is called here already. - Blockly.Events.setGroup(true); - var oldMutation = Blockly.Xml.domToText(this.sourceBlock_.mutationToDom()); - this.sourceBlock_.setNextStatement(option == OTHER_SCRIPTS); - var newMutation = Blockly.Xml.domToText(this.sourceBlock_.mutationToDom()); - Blockly.Events.fire(new Blockly.Events.BlockChange(this.sourceBlock_, - 'mutation', null, oldMutation, newMutation)); - this.setValue(option); - Blockly.Events.setGroup(false); - return null; - }); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROL_STOP) - .appendField(stopDropdown, 'STOP_OPTION'); - this.setCategory(Blockly.Categories.control); - this.setColour(Blockly.Colours.control.primary, - Blockly.Colours.control.secondary, - Blockly.Colours.control.tertiary - ); - this.setPreviousStatement(true); - }, - mutationToDom: function() { - var container = document.createElement('mutation'); - container.setAttribute('hasnext', this.nextConnection != null); - return container; - }, - domToMutation: function(xmlElement) { - var hasNext = (xmlElement.getAttribute('hasnext') == 'true'); - this.setNextStatement(hasNext); - } -}; - -Blockly.Blocks['control_wait'] = { - /** - * Block to wait (pause) stack. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_wait", - "message0": Blockly.Msg.CONTROL_WAIT, - "args0": [ - { - "type": "input_value", - "name": "DURATION" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_wait_until'] = { - /** - * Block to wait until a condition becomes true. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_WAITUNTIL, - "args0": [ - { - "type": "input_value", - "name": "CONDITION", - "check": "Boolean" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_repeat_until'] = { - /** - * Block to repeat until a condition becomes true. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_REPEATUNTIL, - "message1": "%1", - "message2": "%1", - "lastDummyAlign2": "RIGHT", - "args0": [ - { - "type": "input_value", - "name": "CONDITION", - "check": "Boolean" - } - ], - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "args2": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", - "width": 24, - "height": 24, - "alt": "*", - "flip_rtl": true - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_while'] = { - /** - * Block to repeat until a condition becomes false. - * (This is an obsolete "hacked" block, for compatibility with 2.0.) - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_WHILE, - "message1": "%1", - "message2": "%1", - "lastDummyAlign2": "RIGHT", - "args0": [ - { - "type": "input_value", - "name": "CONDITION", - "check": "Boolean" - } - ], - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "args2": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg", - "width": 24, - "height": 24, - "alt": "*", - "flip_rtl": true - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_for_each'] = { - /** - * Block for for-each. This is an obsolete block that is implemented for - * compatibility with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "type": "control_for_each", - "message0": Blockly.Msg.CONTROL_FOREACH, - "message1": "%1", - "args0": [ - { - "type": "field_variable", - "name": "VARIABLE" - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_start_as_clone'] = { - /** - * Block for "when I start as a clone" hat. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_start_as_clone", - "message0": Blockly.Msg.CONTROL_STARTASCLONE, - "args0": [ - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_hat"] - }); - } -}; - -Blockly.Blocks['control_create_clone_of_menu'] = { - /** - * Create-clone drop-down menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "CLONE_OPTION", - "options": [ - [Blockly.Msg.CONTROL_CREATECLONEOF_MYSELF, '_myself_'] - ] - } - ], - "extensions": ["colours_control", "output_string"] - }); - } -}; - -Blockly.Blocks['control_create_clone_of'] = { - /** - * Block for "create clone of..." - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "control_start_as_clone", - "message0": Blockly.Msg.CONTROL_CREATECLONEOF, - "args0": [ - { - "type": "input_value", - "name": "CLONE_OPTION" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_delete_this_clone'] = { - /** - * Block for "delete this clone." - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_DELETETHISCLONE, - "args0": [ - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_end"] - }); - } -}; - -Blockly.Blocks['control_get_counter'] = { - /** - * Block to get the counter value. This is an obsolete block that is - * implemented for compatibility with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_COUNTER, - "category": Blockly.Categories.control, - "extensions": ["colours_control", "output_number"] - }); - } -}; - -Blockly.Blocks['control_incr_counter'] = { - /** - * Block to add one to the counter value. This is an obsolete block that is - * implemented for compatibility with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_INCRCOUNTER, - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_clear_counter'] = { - /** - * Block to clear the counter value. This is an obsolete block that is - * implemented for compatibility with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_CLEARCOUNTER, - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; - -Blockly.Blocks['control_all_at_once'] = { - /** - * Block to run the contained script. This is an obsolete block that is - * implemented for compatibility with Scratch 2.0 projects. Note that - * this was originally designed to run all of the contained blocks - * (sequentially, like normal) within a single frame, but this feature - * was removed in place of custom blocks marked "run without screen - * refresh". The "all at once" block was changed to run the contained - * blocks ordinarily, functioning the same way as an "if" block with a - * reporter that is always true (e.g. "if 1 = 1"). Also note that the - * Scratch 2.0 spec for this block is "warpSpeed", but the label shows - * "all at once". - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.CONTROL_ALLATONCE, - "message1": "%1", // Statement - "args1": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ], - "category": Blockly.Categories.control, - "extensions": ["colours_control", "shape_statement"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/data.js b/packages/scratch-blocks/blocks_vertical/data.js deleted file mode 100644 index a2e1df0e0..000000000 --- a/packages/scratch-blocks/blocks_vertical/data.js +++ /dev/null @@ -1,670 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.data'); -goog.provide('Blockly.Constants.Data'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - - -Blockly.Blocks['data_variable'] = { - /** - * Block of Variables - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "lastDummyAlign0": "CENTRE", - "args0": [ - { - "type": "field_variable_getter", - "text": "", - "name": "VARIABLE", - "variableType": "" - } - ], - "category": Blockly.Categories.data, - "checkboxInFlyout": true, - "extensions": ["contextMenu_getVariableBlock", "colours_data", "output_string"] - }); - } -}; - -Blockly.Blocks['data_setvariableto'] = { - /** - * Block to set variable to a certain value - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_SETVARIABLETO, - "args0": [ - { - "type": "field_variable", - "name": "VARIABLE" - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "category": Blockly.Categories.data, - "extensions": ["colours_data", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_changevariableby'] = { - /** - * Block to change variable by a certain value - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_CHANGEVARIABLEBY, - "args0": [ - { - "type": "field_variable", - "name": "VARIABLE" - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "category": Blockly.Categories.data, - "extensions": ["colours_data", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_showvariable'] = { - /** - * Block to show a variable - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_SHOWVARIABLE, - "args0": [ - { - "type": "field_variable", - "name": "VARIABLE" - } - ], - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.data, - "colour": Blockly.Colours.data.primary, - "colourSecondary": Blockly.Colours.data.secondary, - "colourTertiary": Blockly.Colours.data.tertiary - }); - } -}; - -Blockly.Blocks['data_hidevariable'] = { - /** - * Block to hide a variable - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_HIDEVARIABLE, - "args0": [ - { - "type": "field_variable", - "name": "VARIABLE" - } - ], - "previousStatement": null, - "nextStatement": null, - "category": Blockly.Categories.data, - "colour": Blockly.Colours.data.primary, - "colourSecondary": Blockly.Colours.data.secondary, - "colourTertiary": Blockly.Colours.data.tertiary - }); - } -}; - -Blockly.Blocks['data_listcontents'] = { - /** - * List reporter. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_variable_getter", - "text": "", - "name": "LIST", - "variableType": Blockly.LIST_VARIABLE_TYPE - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["contextMenu_getListBlock", "colours_data_lists", "output_string"], - "checkboxInFlyout": true - }); - } -}; - -Blockly.Blocks['data_listindexall'] = { - /** - * List index menu, with all option. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_numberdropdown", - "name": "INDEX", - "value": "1", - "min": 1, - "precision": 1, - "options": [ - ["1", "1"], - [Blockly.Msg.DATA_INDEX_LAST, "last"], - [Blockly.Msg.DATA_INDEX_ALL, "all"] - ] - } - ], - "category": Blockly.Categories.data, - "extensions": ["colours_textfield", "output_string"] - }); - } -}; - -Blockly.Blocks['data_listindexrandom'] = { - /** - * List index menu, with random option. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_numberdropdown", - "name": "INDEX", - "value": "1", - "min": 1, - "precision": 1, - "options": [ - ["1", "1"], - [Blockly.Msg.DATA_INDEX_LAST, "last"], - [Blockly.Msg.DATA_INDEX_RANDOM, "random"] - ] - } - ], - "category": Blockly.Categories.data, - "extensions": ["colours_textfield", "output_string"] - }); - } -}; - -Blockly.Blocks['data_addtolist'] = { - /** - * Block to add item to list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_ADDTOLIST, - "args0": [ - { - "type": "input_value", - "name": "ITEM" - }, - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_deleteoflist'] = { - /** - * Block to delete item from list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_DELETEOFLIST, - "args0": [ - { - "type": "input_value", - "name": "INDEX" - }, - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_deletealloflist'] = { - /** - * Block to delete all items from list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_DELETEALLOFLIST, - "args0": [ - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_insertatlist'] = { - /** - * Block to insert item to list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_INSERTATLIST, - "args0": [ - { - "type": "input_value", - "name": "ITEM" - }, - { - "type": "input_value", - "name": "INDEX" - }, - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_replaceitemoflist'] = { - /** - * Block to insert item to list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_REPLACEITEMOFLIST, - "args0": [ - { - "type": "input_value", - "name": "INDEX" - }, - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - }, - { - "type": "input_value", - "name": "ITEM" - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_itemoflist'] = { - /** - * Block for reporting item of list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_ITEMOFLIST, - "args0": [ - { - "type": "input_value", - "name": "INDEX" - }, - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "output": null, - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists"], - "outputShape": Blockly.OUTPUT_SHAPE_ROUND - }); - } -}; - -Blockly.Blocks['data_itemnumoflist'] = { - /** - * Block for reporting the item # of a string in a list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_ITEMNUMOFLIST, - "args0": [ - { - "type": "input_value", - "name": "ITEM" - }, - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "output": null, - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists"], - "outputShape": Blockly.OUTPUT_SHAPE_ROUND - }); - } -}; - -Blockly.Blocks['data_lengthoflist'] = { - /** - * Block for reporting length of list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_LENGTHOFLIST, - "args0": [ - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "output_number"] - }); - } -}; - -Blockly.Blocks['data_listcontainsitem'] = { - /** - * Block to report whether list contains item. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_LISTCONTAINSITEM, - "args0": [ - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - }, - { - "type": "input_value", - "name": "ITEM" - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "output_boolean"] - }); - } -}; - -Blockly.Blocks['data_showlist'] = { - /** - * Block to show a list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_SHOWLIST, - "args0": [ - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -Blockly.Blocks['data_hidelist'] = { - /** - * Block to hide a list. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.DATA_HIDELIST, - "args0": [ - { - "type": "field_variable", - "name": "LIST", - "variableTypes": [Blockly.LIST_VARIABLE_TYPE] - } - ], - "category": Blockly.Categories.dataLists, - "extensions": ["colours_data_lists", "shape_statement"] - }); - } -}; - -/** - * Mixin to add a context menu for a data_variable block. It adds one item for - * each variable defined on the workspace. - * @mixin - * @augments Blockly.Block - * @package - * @readonly - */ -Blockly.Constants.Data.CUSTOM_CONTEXT_MENU_GET_VARIABLE_MIXIN = { - /** - * Add context menu option to change the selected variable. - * @param {!Array} options List of menu options to add to. - * @this Blockly.Block - */ - customContextMenu: function(options) { - var fieldName = 'VARIABLE'; - if (this.isCollapsed()) { - return; - } - var currentVarName = this.getField(fieldName).text_; - if (!this.isInFlyout) { - var variablesList = this.workspace.getVariablesOfType(''); - variablesList.sort(function(a, b) { - return Blockly.scratchBlocksUtils.compareStrings(a.name, b.name); - }); - for (var i = 0; i < variablesList.length; i++) { - var varName = variablesList[i].name; - if (varName == currentVarName) continue; - - var option = {enabled: true}; - option.text = varName; - - option.callback = - Blockly.Constants.Data.VARIABLE_OPTION_CALLBACK_FACTORY(this, - variablesList[i].getId(), fieldName); - options.push(option); - } - } else { - var renameOption = { - text: Blockly.Msg.RENAME_VARIABLE, - enabled: true, - callback: Blockly.Constants.Data.RENAME_OPTION_CALLBACK_FACTORY(this, - fieldName) - }; - var deleteOption = { - text: Blockly.Msg.DELETE_VARIABLE.replace('%1', currentVarName), - enabled: true, - callback: Blockly.Constants.Data.DELETE_OPTION_CALLBACK_FACTORY(this, - fieldName) - }; - options.push(renameOption); - options.push(deleteOption); - } - } -}; - -Blockly.Extensions.registerMixin('contextMenu_getVariableBlock', - Blockly.Constants.Data.CUSTOM_CONTEXT_MENU_GET_VARIABLE_MIXIN); - -/** - * Mixin to add a context menu for a data_listcontents block. It adds one item for - * each list defined on the workspace. - * @mixin - * @augments Blockly.Block - * @package - * @readonly - */ -Blockly.Constants.Data.CUSTOM_CONTEXT_MENU_GET_LIST_MIXIN = { - /** - * Add context menu option to change the selected list. - * @param {!Array} options List of menu options to add to. - * @this Blockly.Block - */ - customContextMenu: function(options) { - var fieldName = 'LIST'; - if (this.isCollapsed()) { - return; - } - var currentVarName = this.getField(fieldName).text_; - if (!this.isInFlyout) { - var variablesList = this.workspace.getVariablesOfType('list'); - variablesList.sort(function(a, b) { - return Blockly.scratchBlocksUtils.compareStrings(a.name, b.name); - }); - for (var i = 0; i < variablesList.length; i++) { - var varName = variablesList[i].name; - if (varName == currentVarName) continue; - - var option = {enabled: true}; - option.text = varName; - - option.callback = - Blockly.Constants.Data.VARIABLE_OPTION_CALLBACK_FACTORY(this, - variablesList[i].getId(), fieldName); - options.push(option); - } - } else { - var renameOption = { - text: Blockly.Msg.RENAME_LIST, - enabled: true, - callback: Blockly.Constants.Data.RENAME_OPTION_CALLBACK_FACTORY(this, - fieldName) - }; - var deleteOption = { - text: Blockly.Msg.DELETE_LIST.replace('%1', currentVarName), - enabled: true, - callback: Blockly.Constants.Data.DELETE_OPTION_CALLBACK_FACTORY(this, - fieldName) - }; - options.push(renameOption); - options.push(deleteOption); - } - } -}; -Blockly.Extensions.registerMixin('contextMenu_getListBlock', - Blockly.Constants.Data.CUSTOM_CONTEXT_MENU_GET_LIST_MIXIN); - -/** - * Callback factory for dropdown menu options associated with a variable getter - * block. Each variable on the workspace gets its own item in the dropdown - * menu, and clicking on that item changes the text of the field on the source - * block. - * @param {!Blockly.Block} block The block to update. - * @param {string} id The id of the variable to set on this block. - * @param {string} fieldName The name of the field to update on the block. - * @return {!function()} A function that updates the block with the new name. - */ -Blockly.Constants.Data.VARIABLE_OPTION_CALLBACK_FACTORY = function(block, - id, fieldName) { - return function() { - var variableField = block.getField(fieldName); - if (!variableField) { - console.log("Tried to get a variable field on the wrong type of block."); - } - variableField.setValue(id); - }; -}; - -/** - * Callback for rename variable dropdown menu option associated with a - * variable getter block. - * @param {!Blockly.Block} block The block with the variable to rename. - * @param {string} fieldName The name of the field to inspect on the block. - * @return {!function()} A function that renames the variable. - */ -Blockly.Constants.Data.RENAME_OPTION_CALLBACK_FACTORY = function(block, - fieldName) { - return function() { - var workspace = block.workspace; - var variable = block.getField(fieldName).getVariable(); - Blockly.Variables.renameVariable(workspace, variable); - }; -}; - -/** - * Callback for delete variable dropdown menu option associated with a - * variable getter block. - * @param {!Blockly.Block} block The block with the variable to delete. - * @param {string} fieldName The name of the field to inspect on the block. - * @return {!function()} A function that deletes the variable. - */ -Blockly.Constants.Data.DELETE_OPTION_CALLBACK_FACTORY = function(block, - fieldName) { - return function() { - var workspace = block.workspace; - var variable = block.getField(fieldName).getVariable(); - workspace.deleteVariableById(variable.getId()); - }; -}; diff --git a/packages/scratch-blocks/blocks_vertical/default_toolbox.js b/packages/scratch-blocks/blocks_vertical/default_toolbox.js deleted file mode 100644 index 8c5624fad..000000000 --- a/packages/scratch-blocks/blocks_vertical/default_toolbox.js +++ /dev/null @@ -1,564 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.defaultToolbox'); - -goog.require('Blockly.Blocks'); - -/** - * @fileoverview Provide a default toolbox XML. - */ - -Blockly.Blocks.defaultToolbox = ''; diff --git a/packages/scratch-blocks/blocks_vertical/event.js b/packages/scratch-blocks/blocks_vertical/event.js deleted file mode 100644 index c51a93cb9..000000000 --- a/packages/scratch-blocks/blocks_vertical/event.js +++ /dev/null @@ -1,328 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.event'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - -Blockly.Blocks['event_whentouchingobject'] = { - /** - * Block for when a sprite is touching an object. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.EVENT_WHENTOUCHINGOBJECT, - "args0": [ - { - "type": "input_value", - "name": "TOUCHINGOBJECTMENU" - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; - -Blockly.Blocks['event_touchingobjectmenu'] = { - /** - * "Touching [Object]" Block Menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "TOUCHINGOBJECTMENU", - "options": [ - [Blockly.Msg.SENSING_TOUCHINGOBJECT_POINTER, '_mouse_'], - [Blockly.Msg.SENSING_TOUCHINGOBJECT_EDGE, '_edge_'] - ] - } - ], - "extensions": ["colours_event", "output_string"] - }); - } -}; - -Blockly.Blocks['event_whenflagclicked'] = { - /** - * Block for when flag clicked. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_whenflagclicked", - "message0": Blockly.Msg.EVENT_WHENFLAGCLICKED, - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "green-flag.svg", - "width": 24, - "height": 24, - "alt": "flag" - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; - -Blockly.Blocks['event_whenthisspriteclicked'] = { - /** - * Block for when this sprite clicked. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.EVENT_WHENTHISSPRITECLICKED, - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } - -}; - -Blockly.Blocks['event_whenstageclicked'] = { - /** - * Block for when the stage is clicked. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.EVENT_WHENSTAGECLICKED, - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; - -Blockly.Blocks['event_whenbroadcastreceived'] = { - /** - * Block for when broadcast received. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_whenbroadcastreceived", - "message0": Blockly.Msg.EVENT_WHENBROADCASTRECEIVED, - "args0": [ - { - "type": "field_variable", - "name": "BROADCAST_OPTION", - "variableTypes": [Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE], - "variable": Blockly.Msg.DEFAULT_BROADCAST_MESSAGE_NAME - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; - -Blockly.Blocks['event_whenbackdropswitchesto'] = { - /** - * Block for when the current backdrop switched to a selected backdrop. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.EVENT_WHENBACKDROPSWITCHESTO, - "args0": [ - { - "type": "field_dropdown", - "name": "BACKDROP", - "options": [ - ['backdrop1', 'BACKDROP1'] - ] - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; - -Blockly.Blocks['event_whengreaterthan'] = { - /** - * Block for when loudness/timer/video motion is greater than the value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.EVENT_WHENGREATERTHAN, - "args0": [ - { - "type": "field_dropdown", - "name": "WHENGREATERTHANMENU", - "options": [ - [Blockly.Msg.EVENT_WHENGREATERTHAN_LOUDNESS, 'LOUDNESS'], - [Blockly.Msg.EVENT_WHENGREATERTHAN_TIMER, 'TIMER'] - ] - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; - -Blockly.Blocks['event_broadcast_menu'] = { - /** - * Broadcast drop-down menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_variable", - "name": "BROADCAST_OPTION", - "variableTypes":[Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE], - "variable": Blockly.Msg.DEFAULT_BROADCAST_MESSAGE_NAME - } - ], - "colour": Blockly.Colours.event.secondary, - "colourSecondary": Blockly.Colours.event.secondary, - "colourTertiary": Blockly.Colours.event.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['event_broadcast'] = { - /** - * Block to send a broadcast. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_broadcast", - "message0": Blockly.Msg.EVENT_BROADCAST, - "args0": [ - { - "type": "input_value", - "name": "BROADCAST_INPUT" - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_statement"] - }); - } -}; - -Blockly.Blocks['event_broadcastandwait'] = { - /** - * Block to send a broadcast. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.EVENT_BROADCASTANDWAIT, - "args0": [ - { - "type":"input_value", - "name":"BROADCAST_INPUT" - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_statement"] - }); - } -}; - -Blockly.Blocks['event_whenkeypressed'] = { - /** - * Block to send a broadcast. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "event_whenkeypressed", - "message0": Blockly.Msg.EVENT_WHENKEYPRESSED, - "args0": [ - { - "type": "field_dropdown", - "name": "KEY_OPTION", - "options": [ - [Blockly.Msg.EVENT_WHENKEYPRESSED_SPACE, 'space'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_UP, 'up arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_DOWN, 'down arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_RIGHT, 'right arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_LEFT, 'left arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_ANY, 'any'], - ['a', 'a'], - ['b', 'b'], - ['c', 'c'], - ['d', 'd'], - ['e', 'e'], - ['f', 'f'], - ['g', 'g'], - ['h', 'h'], - ['i', 'i'], - ['j', 'j'], - ['k', 'k'], - ['l', 'l'], - ['m', 'm'], - ['n', 'n'], - ['o', 'o'], - ['p', 'p'], - ['q', 'q'], - ['r', 'r'], - ['s', 's'], - ['t', 't'], - ['u', 'u'], - ['v', 'v'], - ['w', 'w'], - ['x', 'x'], - ['y', 'y'], - ['z', 'z'], - ['0', '0'], - ['1', '1'], - ['2', '2'], - ['3', '3'], - ['4', '4'], - ['5', '5'], - ['6', '6'], - ['7', '7'], - ['8', '8'], - ['9', '9'] - ] - } - ], - "category": Blockly.Categories.event, - "extensions": ["colours_event", "shape_hat"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/extensions.js b/packages/scratch-blocks/blocks_vertical/extensions.js deleted file mode 100644 index 499a3961d..000000000 --- a/packages/scratch-blocks/blocks_vertical/extensions.js +++ /dev/null @@ -1,294 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.extensions'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - -Blockly.Blocks['extension_pen_down'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 pen down", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/pen-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "shape_statement", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_music_drum'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 play drum %3", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/music-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - }, - { - "type": "input_value", - "name": "NUMBER" - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "shape_statement", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_wedo_motor'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 turn a motor %3", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/wedo2-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - }, - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "rotate-right.svg", - "width": 24, - "height": 24 - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "shape_statement", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_wedo_hat'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 when I am wearing a hat", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/wedo2-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "shape_hat", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_wedo_boolean'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 O RLY?", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/wedo2-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "output_boolean", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_wedo_tilt_reporter'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 tilt angle %3", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/wedo2-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - }, - { - "type": "input_value", - "name": "TILT" - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "output_number", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_wedo_tilt_menu'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "TILT", - "options": [ - ['Any', 'Any'], - ['Whirl', 'Whirl'], - ['South', 'South'], - ['Back in time', 'Back in time'] - ] - } - ], - "extensions": ["colours_more", "output_string"] - }); - } -}; - -Blockly.Blocks['extension_music_reporter'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 hey now, you're an all-star", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/music-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - } - ], - "category": Blockly.Categories.more, - "extensions": ["colours_more", "output_number", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_microbit_display'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 display %3", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/microbit-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - }, - { - "type": "input_value", - "name": "MATRIX" - }, - ], - "category": Blockly.Categories.pen, - "extensions": ["colours_pen", "shape_statement", "scratch_extension"] - }); - } -}; - -Blockly.Blocks['extension_music_play_note'] = { - /** - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1 %2 play note %3 for %4 beats", - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "extensions/music-block-icon.svg", - "width": 40, - "height": 40 - }, - { - "type": "field_vertical_separator" - }, - { - "type": "input_value", - "name": "NOTE" - }, - { - "type": "input_value", - "name": "BEATS" - } - ], - "category": Blockly.Categories.pen, - "extensions": ["colours_pen", "shape_statement", "scratch_extension"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/looks.js b/packages/scratch-blocks/blocks_vertical/looks.js deleted file mode 100644 index 92629a6da..000000000 --- a/packages/scratch-blocks/blocks_vertical/looks.js +++ /dev/null @@ -1,589 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.looks'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - - -Blockly.Blocks['looks_sayforsecs'] = { - /** - * Block to say for some time. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SAYFORSECS, - "args0": [ - { - "type": "input_value", - "name": "MESSAGE" - }, - { - "type": "input_value", - "name": "SECS" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_say'] = { - /** - * Block to say. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SAY, - "args0": [ - { - "type": "input_value", - "name": "MESSAGE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_thinkforsecs'] = { - /** - * Block to think for some time. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_THINKFORSECS, - "args0": [ - { - "type": "input_value", - "name": "MESSAGE" - }, - { - "type": "input_value", - "name": "SECS" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_think'] = { - /** - * Block to think. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_THINK, - "args0": [ - { - "type": "input_value", - "name": "MESSAGE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_show'] = { - /** - * Show block. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SHOW, - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_hide'] = { - /** - * Hide block. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_HIDE, - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_hideallsprites'] = { - /** - * Hide-all-sprites block. Does not actually do anything. This is an - * obsolete block that is implemented for compatibility with Scratch 2.0 - * projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_HIDEALLSPRITES, - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_changeeffectby'] = { - /** - * Block to change graphic effect. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_CHANGEEFFECTBY, - "args0": [ - { - "type": "field_dropdown", - "name": "EFFECT", - "options": [ - [Blockly.Msg.LOOKS_EFFECT_COLOR, 'COLOR'], - [Blockly.Msg.LOOKS_EFFECT_FISHEYE, 'FISHEYE'], - [Blockly.Msg.LOOKS_EFFECT_WHIRL, 'WHIRL'], - [Blockly.Msg.LOOKS_EFFECT_PIXELATE, 'PIXELATE'], - [Blockly.Msg.LOOKS_EFFECT_MOSAIC, 'MOSAIC'], - [Blockly.Msg.LOOKS_EFFECT_BRIGHTNESS, 'BRIGHTNESS'], - [Blockly.Msg.LOOKS_EFFECT_GHOST, 'GHOST'] - ] - }, - { - "type": "input_value", - "name": "CHANGE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_seteffectto'] = { - /** - * Block to set graphic effect. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SETEFFECTTO, - "args0": [ - { - "type": "field_dropdown", - "name": "EFFECT", - "options": [ - [Blockly.Msg.LOOKS_EFFECT_COLOR, 'COLOR'], - [Blockly.Msg.LOOKS_EFFECT_FISHEYE, 'FISHEYE'], - [Blockly.Msg.LOOKS_EFFECT_WHIRL, 'WHIRL'], - [Blockly.Msg.LOOKS_EFFECT_PIXELATE, 'PIXELATE'], - [Blockly.Msg.LOOKS_EFFECT_MOSAIC, 'MOSAIC'], - [Blockly.Msg.LOOKS_EFFECT_BRIGHTNESS, 'BRIGHTNESS'], - [Blockly.Msg.LOOKS_EFFECT_GHOST, 'GHOST'] - ] - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_cleargraphiceffects'] = { - /** - * Block to clear graphic effects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_CLEARGRAPHICEFFECTS, - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_changesizeby'] = { - /** - * Block to change size - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_CHANGESIZEBY, - "args0": [ - { - "type": "input_value", - "name": "CHANGE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_setsizeto'] = { - /** - * Block to set size - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SETSIZETO, - "args0": [ - { - "type": "input_value", - "name": "SIZE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_size'] = { - /** - * Block to report size - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SIZE, - "category": Blockly.Categories.looks, - "checkboxInFlyout": true, - "extensions": ["colours_looks", "output_number"] - }); - } -}; - -Blockly.Blocks['looks_changestretchby'] = { - /** - * Block to change stretch. Does not actually do anything. This is an - * obsolete block that is implemented for compatibility with Scratch 1.4 - * projects as well as 2.0 projects that still have the block. - * The "stretch" blocks were introduced in very early versions of Scratch, - * but their functionality was removed shortly later. They still appeared - * correctly up until (and including) Scratch 1.4 - as "change stretch by" - * and "set stretch to" - but were removed altogether in Scratch 2.0, and - * displayed as red "undefined" blocks. Some Scratch projects still contain - * these blocks, however, and they don't open in 3.0 unless the blocks - * actually exist (though they still don't funcitonally do anything). - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_CHANGESTRETCHBY, - "args0": [ - { - "type": "input_value", - "name": "CHANGE" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_setstretchto'] = { - /** - * Block to set stretch. Does not actually do anything. This is an obsolete - * block that is implemented for compatibility with Scratch 1.4 projects - * (see looks_changestretchby). - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SETSTRETCHTO, - "args0": [ - { - "type": "input_value", - "name": "STRETCH" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_costume'] = { - /** - * Costumes drop-down menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "COSTUME", - "options": [ - ['costume1', 'COSTUME1'], - ['costume2', 'COSTUME2'] - ] - } - ], - "colour": Blockly.Colours.looks.secondary, - "colourSecondary": Blockly.Colours.looks.secondary, - "colourTertiary": Blockly.Colours.looks.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['looks_switchcostumeto'] = { - /** - * Block to switch the sprite's costume to the selected one. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SWITCHCOSTUMETO, - "args0": [ - { - "type": "input_value", - "name": "COSTUME" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_nextcostume'] = { - /** - * Block to switch the sprite's costume to the next one. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_NEXTCOSTUME, - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_switchbackdropto'] = { - /** - * Block to switch the backdrop to the selected one. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SWITCHBACKDROPTO, - "args0": [ - { - "type": "input_value", - "name": "BACKDROP" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_backdrops'] = { - /** - * Backdrop list - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "id": "looks_backdrops", - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "BACKDROP", - "options": [ - ['backdrop1', 'BACKDROP1'] - ] - } - ], - "colour": Blockly.Colours.looks.secondary, - "colourSecondary": Blockly.Colours.looks.secondary, - "colourTertiary": Blockly.Colours.looks.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['looks_gotofrontback'] = { - /** - * "Go to front/back" Block. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_GOTOFRONTBACK, - "args0": [ - { - "type": "field_dropdown", - "name": "FRONT_BACK", - "options": [ - [Blockly.Msg.LOOKS_GOTOFRONTBACK_FRONT, 'front'], - [Blockly.Msg.LOOKS_GOTOFRONTBACK_BACK, 'back'] - ] - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_goforwardbackwardlayers'] = { - /** - * "Go forward/backward [Number] Layers" Block. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS, - "args0": [ - { - "type": "field_dropdown", - "name": "FORWARD_BACKWARD", - "options": [ - [Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD, 'forward'], - [Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD, 'backward'] - ] - }, - { - "type": "input_value", - "name": "NUM" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_backdropnumbername'] = { - /** - * Block to report backdrop's number or name - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_BACKDROPNUMBERNAME, - "args0": [ - { - "type": "field_dropdown", - "name": "NUMBER_NAME", - "options": [ - [Blockly.Msg.LOOKS_NUMBERNAME_NUMBER, 'number'], - [Blockly.Msg.LOOKS_NUMBERNAME_NAME, 'name'] - ] - } - ], - "category": Blockly.Categories.looks, - "checkboxInFlyout": true, - "extensions": ["colours_looks", "output_number"] - }); - } -}; - -Blockly.Blocks['looks_costumenumbername'] = { - /** - * Block to report costume's number or name - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_COSTUMENUMBERNAME, - "args0": [ - { - "type": "field_dropdown", - "name": "NUMBER_NAME", - "options": [ - [Blockly.Msg.LOOKS_NUMBERNAME_NUMBER, 'number'], - [Blockly.Msg.LOOKS_NUMBERNAME_NAME, 'name'] - ] - } - ], - "category": Blockly.Categories.looks, - "checkboxInFlyout": true, - "extensions": ["colours_looks", "output_number"] - }); - } -}; - -Blockly.Blocks['looks_switchbackdroptoandwait'] = { - /** - * Block to switch the backdrop to the selected one and wait. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_SWITCHBACKDROPTOANDWAIT, - "args0": [ - { - "type": "input_value", - "name": "BACKDROP" - } - ], - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; - -Blockly.Blocks['looks_nextbackdrop'] = { - /** - * Block to switch the backdrop to the next one. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.LOOKS_NEXTBACKDROP_BLOCK, - "category": Blockly.Categories.looks, - "extensions": ["colours_looks", "shape_statement"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/motion.js b/packages/scratch-blocks/blocks_vertical/motion.js deleted file mode 100644 index b40d2b03c..000000000 --- a/packages/scratch-blocks/blocks_vertical/motion.js +++ /dev/null @@ -1,584 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.motion'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - - -Blockly.Blocks['motion_movesteps'] = { - /** - * Block to move steps. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_MOVESTEPS, - "args0": [ - { - "type": "input_value", - "name": "STEPS" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_turnright'] = { - /** - * Block to turn right. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_TURNRIGHT, - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "rotate-right.svg", - "width": 24, - "height": 24 - }, - { - "type": "input_value", - "name": "DEGREES" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_turnleft'] = { - /** - * Block to turn left. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_TURNLEFT, - "args0": [ - { - "type": "field_image", - "src": Blockly.mainWorkspace.options.pathToMedia + "rotate-left.svg", - "width": 24, - "height": 24 - }, - { - "type": "input_value", - "name": "DEGREES" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_pointindirection'] = { - /** - * Block to point in direction. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_POINTINDIRECTION, - "args0": [ - { - "type": "input_value", - "name": "DIRECTION" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_pointtowards_menu'] = { - /** - * Point towards drop-down menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "TOWARDS", - "options": [ - [Blockly.Msg.MOTION_POINTTOWARDS_POINTER, '_mouse_'], - [Blockly.Msg.MOTION_POINTTOWARDS_RANDOM, '_random_'] - ] - } - ], - "colour": Blockly.Colours.motion.secondary, - "colourSecondary": Blockly.Colours.motion.secondary, - "colourTertiary": Blockly.Colours.motion.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['motion_pointtowards'] = { - /** - * Block to point in direction. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_POINTTOWARDS, - "args0": [ - { - "type": "input_value", - "name": "TOWARDS" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_goto_menu'] = { - /** - * Go to drop-down menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "TO", - "options": [ - [Blockly.Msg.MOTION_GOTO_POINTER, '_mouse_'], - [Blockly.Msg.MOTION_GOTO_RANDOM, '_random_'] - ] - } - ], - "colour": Blockly.Colours.motion.secondary, - "colourSecondary": Blockly.Colours.motion.secondary, - "colourTertiary": Blockly.Colours.motion.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['motion_gotoxy'] = { - /** - * Block to go to X, Y. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_GOTOXY, - "args0": [ - { - "type": "input_value", - "name": "X" - }, - { - "type": "input_value", - "name": "Y" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_goto'] = { - /** - * Block to go to a menu item. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_GOTO, - "args0": [ - { - "type": "input_value", - "name": "TO" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_glidesecstoxy'] = { - /** - * Block to glide for a specified time. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_GLIDESECSTOXY, - "args0": [ - { - "type": "input_value", - "name": "SECS" - }, - { - "type": "input_value", - "name": "X" - }, - { - "type": "input_value", - "name": "Y" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_glideto_menu'] = { - /** - * Glide to drop-down menu - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "TO", - "options": [ - [Blockly.Msg.MOTION_GLIDETO_POINTER, '_mouse_'], - [Blockly.Msg.MOTION_GLIDETO_RANDOM, '_random_'] - ] - } - ], - "colour": Blockly.Colours.motion.secondary, - "colourSecondary": Blockly.Colours.motion.secondary, - "colourTertiary": Blockly.Colours.motion.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['motion_glideto'] = { - /** - * Block to glide to a menu item - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_GLIDETO, - "args0": [ - { - "type": "input_value", - "name": "SECS" - }, - { - "type": "input_value", - "name": "TO" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_changexby'] = { - /** - * Block to change X. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_CHANGEXBY, - "args0": [ - { - "type": "input_value", - "name": "DX" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_setx'] = { - /** - * Block to set X. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_SETX, - "args0": [ - { - "type": "input_value", - "name": "X" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_changeyby'] = { - /** - * Block to change Y. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_CHANGEYBY, - "args0": [ - { - "type": "input_value", - "name": "DY" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_sety'] = { - /** - * Block to set Y. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_SETY, - "args0": [ - { - "type": "input_value", - "name": "Y" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_ifonedgebounce'] = { - /** - * Block to bounce on edge. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_IFONEDGEBOUNCE, - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_setrotationstyle'] = { - /** - * Block to set rotation style. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_SETROTATIONSTYLE, - "args0": [ - { - "type": "field_dropdown", - "name": "STYLE", - "options": [ - [Blockly.Msg.MOTION_SETROTATIONSTYLE_LEFTRIGHT, 'left-right'], - [Blockly.Msg.MOTION_SETROTATIONSTYLE_DONTROTATE, 'don\'t rotate'], - [Blockly.Msg.MOTION_SETROTATIONSTYLE_ALLAROUND, 'all around'] - ] - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_xposition'] = { - /** - * Block to report X. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_XPOSITION, - "category": Blockly.Categories.motion, - "checkboxInFlyout": true, - "extensions": ["colours_motion", "output_number"] - }); - } -}; - -Blockly.Blocks['motion_yposition'] = { - /** - * Block to report Y. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_YPOSITION, - "category": Blockly.Categories.motion, - "checkboxInFlyout": true, - "extensions": ["colours_motion", "output_number"] - }); - } -}; - -Blockly.Blocks['motion_direction'] = { - /** - * Block to report direction. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_DIRECTION, - "category": Blockly.Categories.motion, - "checkboxInFlyout": true, - "extensions": ["colours_motion", "output_number"] - }); - } -}; - -Blockly.Blocks['motion_scroll_right'] = { - /** - * Block to scroll the stage right. Does not actually do anything. This is - * an obsolete block that is implemented for compatibility with Scratch 2.0 - * projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_SCROLLRIGHT, - "args0": [ - { - "type": "input_value", - "name": "DISTANCE" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_scroll_up'] = { - /** - * Block to scroll the stage up. Does not actually do anything. This is an - * obsolete block that is implemented for compatibility with Scratch 2.0 - * projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_SCROLLUP, - "args0": [ - { - "type": "input_value", - "name": "DISTANCE" - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_align_scene'] = { - /** - * Block to change the stage's scrolling alignment. Does not actually do - * anything. This is an obsolete block that is implemented for compatibility - * with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_ALIGNSCENE, - "args0": [ - { - "type": "field_dropdown", - "name": "ALIGNMENT", - "options": [ - [Blockly.Msg.MOTION_ALIGNSCENE_BOTTOMLEFT, 'bottom-left'], - [Blockly.Msg.MOTION_ALIGNSCENE_BOTTOMRIGHT, 'bottom-right'], - [Blockly.Msg.MOTION_ALIGNSCENE_MIDDLE, 'middle'], - [Blockly.Msg.MOTION_ALIGNSCENE_TOPLEFT, 'top-left'], - [Blockly.Msg.MOTION_ALIGNSCENE_TOPRIGHT, 'top-right'] - ] - } - ], - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "shape_statement"] - }); - } -}; - -Blockly.Blocks['motion_xscroll'] = { - /** - * Block to report the stage's scroll position's X value. Does not actually - * do anything. This is an obsolete block that is implemented for - * compatibility with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_XSCROLL, - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "output_number"] - }); - } -}; - -Blockly.Blocks['motion_yscroll'] = { - /** - * Block to report the stage's scroll position's Y value. Does not actually - * do anything. This is an obsolete block that is implemented for - * compatibility with Scratch 2.0 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.MOTION_YSCROLL, - "category": Blockly.Categories.motion, - "extensions": ["colours_motion", "output_number"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/operators.js b/packages/scratch-blocks/blocks_vertical/operators.js deleted file mode 100644 index 1caa04481..000000000 --- a/packages/scratch-blocks/blocks_vertical/operators.js +++ /dev/null @@ -1,470 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.operators'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - - -Blockly.Blocks['operator_add'] = { - /** - * Block for adding two numbers. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_ADD, - "args0": [ - { - "type": "input_value", - "name": "NUM1" - }, - { - "type": "input_value", - "name": "NUM2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_subtract'] = { - /** - * Block for subtracting two numbers. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_SUBTRACT, - "args0": [ - { - "type": "input_value", - "name": "NUM1" - }, - { - "type": "input_value", - "name": "NUM2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_multiply'] = { - /** - * Block for multiplying two numbers. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_MULTIPLY, - "args0": [ - { - "type": "input_value", - "name": "NUM1" - }, - { - "type": "input_value", - "name": "NUM2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_divide'] = { - /** - * Block for dividing two numbers. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_DIVIDE, - "args0": [ - { - "type": "input_value", - "name": "NUM1" - }, - { - "type": "input_value", - "name": "NUM2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_random'] = { - /** - * Block for picking a random number. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_RANDOM, - "args0": [ - { - "type": "input_value", - "name": "FROM" - }, - { - "type": "input_value", - "name": "TO" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_lt'] = { - /** - * Block for less than comparator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_LT, - "args0": [ - { - "type": "input_value", - "name": "OPERAND1" - }, - { - "type": "input_value", - "name": "OPERAND2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_equals'] = { - /** - * Block for equals comparator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_EQUALS, - "args0": [ - { - "type": "input_value", - "name": "OPERAND1" - }, - { - "type": "input_value", - "name": "OPERAND2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_gt'] = { - /** - * Block for greater than comparator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_GT, - "args0": [ - { - "type": "input_value", - "name": "OPERAND1" - }, - { - "type": "input_value", - "name": "OPERAND2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_and'] = { - /** - * Block for "and" boolean comparator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_AND, - "args0": [ - { - "type": "input_value", - "name": "OPERAND1", - "check": "Boolean" - }, - { - "type": "input_value", - "name": "OPERAND2", - "check": "Boolean" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_or'] = { - /** - * Block for "or" boolean comparator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_OR, - "args0": [ - { - "type": "input_value", - "name": "OPERAND1", - "check": "Boolean" - }, - { - "type": "input_value", - "name": "OPERAND2", - "check": "Boolean" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_not'] = { - /** - * Block for "not" unary boolean operator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_NOT, - "args0": [ - { - "type": "input_value", - "name": "OPERAND", - "check": "Boolean" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_join'] = { - /** - * Block for string join operator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_JOIN, - "args0": [ - { - "type": "input_value", - "name": "STRING1" - }, - { - "type": "input_value", - "name": "STRING2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_string"] - }); - } -}; - -Blockly.Blocks['operator_letter_of'] = { - /** - * Block for "letter _ of _" operator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_LETTEROF, - "args0": [ - { - "type": "input_value", - "name": "LETTER" - }, - { - "type": "input_value", - "name": "STRING" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_string"] - }); - } -}; - -Blockly.Blocks['operator_length'] = { - /** - * Block for string length operator. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_LENGTH, - "args0": [ - { - "type": "input_value", - "name": "STRING" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_string"] - }); - } -}; - -Blockly.Blocks['operator_contains'] = { - /** - * Block for _ contains _ operator - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_CONTAINS, - "args0": [ - { - "type": "input_value", - "name": "STRING1" - }, - { - "type": "input_value", - "name": "STRING2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_boolean"] - }); - } -}; - -Blockly.Blocks['operator_mod'] = { - /** - * Block for mod two numbers. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_MOD, - "args0": [ - { - "type": "input_value", - "name": "NUM1" - }, - { - "type": "input_value", - "name": "NUM2" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_round'] = { - /** - * Block for rounding a numbers. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_ROUND, - "args0": [ - { - "type": "input_value", - "name": "NUM" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; - -Blockly.Blocks['operator_mathop'] = { - /** - * Block for "advanced" math ops on a number. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.OPERATORS_MATHOP, - "args0": [ - { - "type": "field_dropdown", - "name": "OPERATOR", - "options": [ - [Blockly.Msg.OPERATORS_MATHOP_ABS, 'abs'], - [Blockly.Msg.OPERATORS_MATHOP_FLOOR, 'floor'], - [Blockly.Msg.OPERATORS_MATHOP_CEILING, 'ceiling'], - [Blockly.Msg.OPERATORS_MATHOP_SQRT, 'sqrt'], - [Blockly.Msg.OPERATORS_MATHOP_SIN, 'sin'], - [Blockly.Msg.OPERATORS_MATHOP_COS, 'cos'], - [Blockly.Msg.OPERATORS_MATHOP_TAN, 'tan'], - [Blockly.Msg.OPERATORS_MATHOP_ASIN, 'asin'], - [Blockly.Msg.OPERATORS_MATHOP_ACOS, 'acos'], - [Blockly.Msg.OPERATORS_MATHOP_ATAN, 'atan'], - [Blockly.Msg.OPERATORS_MATHOP_LN, 'ln'], - [Blockly.Msg.OPERATORS_MATHOP_LOG, 'log'], - [Blockly.Msg.OPERATORS_MATHOP_EEXP, 'e ^'], - [Blockly.Msg.OPERATORS_MATHOP_10EXP, '10 ^'] - ] - }, - { - "type": "input_value", - "name": "NUM" - } - ], - "category": Blockly.Categories.operators, - "extensions": ["colours_operators", "output_number"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/procedures.js b/packages/scratch-blocks/blocks_vertical/procedures.js deleted file mode 100644 index fc7df2907..000000000 --- a/packages/scratch-blocks/blocks_vertical/procedures.js +++ /dev/null @@ -1,971 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Procedure blocks for Scratch. - */ -'use strict'; - -goog.provide('Blockly.ScratchBlocks.ProcedureUtils'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - -// Serialization and deserialization. - -/** - * Create XML to represent the (non-editable) name and arguments of a procedure - * call block. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.callerMutationToDom = function() { - var container = document.createElement('mutation'); - container.setAttribute('proccode', this.procCode_); - container.setAttribute('argumentids', JSON.stringify(this.argumentIds_)); - container.setAttribute('warp', JSON.stringify(this.warp_)); - return container; -}; - -/** - * Parse XML to restore the (non-editable) name and arguments of a procedure - * call block. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.callerDomToMutation = function(xmlElement) { - this.procCode_ = xmlElement.getAttribute('proccode'); - this.generateShadows_ = - JSON.parse(xmlElement.getAttribute('generateshadows')); - this.argumentIds_ = JSON.parse(xmlElement.getAttribute('argumentids')); - this.warp_ = JSON.parse(xmlElement.getAttribute('warp')); - this.updateDisplay_(); -}; - -/** - * Create XML to represent the (non-editable) name and arguments of a - * procedures_prototype block or a procedures_declaration block. - * @param {boolean=} opt_generateShadows Whether to include the generateshadows - * flag in the generated XML. False if not provided. - * @return {!Element} XML storage element. - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.definitionMutationToDom = function( - opt_generateShadows) { - var container = document.createElement('mutation'); - - if (opt_generateShadows) { - container.setAttribute('generateshadows', true); - } - container.setAttribute('proccode', this.procCode_); - container.setAttribute('argumentids', JSON.stringify(this.argumentIds_)); - container.setAttribute('argumentnames', JSON.stringify(this.displayNames_)); - container.setAttribute('argumentdefaults', - JSON.stringify(this.argumentDefaults_)); - container.setAttribute('warp', JSON.stringify(this.warp_)); - return container; -}; - -/** - * Parse XML to restore the (non-editable) name and arguments of a - * procedures_prototype block or a procedures_declaration block. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.definitionDomToMutation = function(xmlElement) { - this.procCode_ = xmlElement.getAttribute('proccode'); - this.warp_ = JSON.parse(xmlElement.getAttribute('warp')); - - var prevArgIds = this.argumentIds_; - var prevDisplayNames = this.displayNames_; - - this.argumentIds_ = JSON.parse(xmlElement.getAttribute('argumentids')); - this.displayNames_ = JSON.parse(xmlElement.getAttribute('argumentnames')); - this.argumentDefaults_ = JSON.parse( - xmlElement.getAttribute('argumentdefaults')); - this.updateDisplay_(); - if (this.updateArgumentReporterNames_) { - this.updateArgumentReporterNames_(prevArgIds, prevDisplayNames); - } -}; - -// End of serialization and deserialization. - -// Shared by all three procedure blocks (procedures_declaration, -// procedures_call, and procedures_prototype). -/** - * Returns the name of the procedure this block calls, or the empty string if - * it has not yet been set. - * @return {string} Procedure name. - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.getProcCode = function() { - return this.procCode_; -}; - -/** - * Update the block's structure and appearance to match the internally stored - * mutation. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.updateDisplay_ = function() { - var wasRendered = this.rendered; - this.rendered = false; - - var connectionMap = this.disconnectOldBlocks_(); - this.removeAllInputs_(); - - this.createAllInputs_(connectionMap); - this.deleteShadows_(connectionMap); - - this.rendered = wasRendered; - if (wasRendered && !this.isInsertionMarker()) { - this.initSvg(); - this.render(); - } -}; - -/** - * Disconnect old blocks from all value inputs on this block, but hold onto them - * in case they can be reattached later. Also save the shadow DOM if it exists. - * The result is a map from argument ID to information that was associated with - * that argument at the beginning of the mutation. - * @return {!Object.} An object - * mapping argument IDs to blocks and shadow DOMs. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.disconnectOldBlocks_ = function() { - // Remove old stuff - var connectionMap = {}; - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection) { - var target = input.connection.targetBlock(); - var saveInfo = { - shadow: input.connection.getShadowDom(), - block: target - }; - connectionMap[input.name] = saveInfo; - - // Remove the shadow DOM, then disconnect the block. Otherwise a shadow - // block will respawn instantly, and we'd have to remove it when we remove - // the input. - input.connection.setShadowDom(null); - if (target) { - input.connection.disconnect(); - } - } - } - return connectionMap; -}; - -/** - * Remove all inputs on the block, including dummy inputs. - * Assumes no input has shadow DOM set. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.removeAllInputs_ = function() { - // Delete inputs directly instead of with block.removeInput to avoid splicing - // out of the input list at every index. - for (var i = 0, input; input = this.inputList[i]; i++) { - input.dispose(); - } - this.inputList = []; -}; - -/** - * Create all inputs specified by the new procCode, and populate them with - * shadow blocks or reconnected old blocks as appropriate. - * @param {!Object.} - * connectionMap An object mapping argument IDs to blocks and shadow DOMs. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.createAllInputs_ = function(connectionMap) { - // Split the proc into components, by %n, %b, and %s (ignoring escaped). - var procComponents = this.procCode_.split(/(?=[^\\]%[nbs])/); - procComponents = procComponents.map(function(c) { - return c.trim(); // Strip whitespace. - }); - // Create arguments and labels as appropriate. - var argumentCount = 0; - for (var i = 0, component; component = procComponents[i]; i++) { - var labelText; - if (component.substring(0, 1) == '%') { - var argumentType = component.substring(1, 2); - if (!(argumentType == 'n' || argumentType == 'b' || argumentType == 's')) { - throw new Error( - 'Found an custom procedure with an invalid type: ' + argumentType); - } - labelText = component.substring(2).trim(); - - var id = this.argumentIds_[argumentCount]; - - var input = this.appendValueInput(id); - if (argumentType == 'b') { - input.setCheck('Boolean'); - } - this.populateArgument_(argumentType, argumentCount, connectionMap, id, - input); - argumentCount++; - } else { - labelText = component.trim(); - } - this.addProcedureLabel_(labelText.replace(/\\%/, '%')); - } -}; - -/** - * Delete all shadow blocks in the given map. - * @param {!Object.} connectionMap An object mapping - * argument IDs to the blocks that were connected to those IDs at the - * beginning of the mutation. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.deleteShadows_ = function(connectionMap) { - // Get rid of all of the old shadow blocks if they aren't connected. - if (connectionMap) { - for (var id in connectionMap) { - var saveInfo = connectionMap[id]; - if (saveInfo) { - var block = saveInfo['block']; - if (block && block.isShadow()) { - block.dispose(); - connectionMap[id] = null; - // At this point we know which shadow DOMs are about to be orphaned in - // the VM. What do we do with that information? - } - } - } - } -}; -// End of shared code. - -/** - * Add a label field with the given text to a procedures_call or - * procedures_prototype block. - * @param {string} text The label text. - * @private - */ -Blockly.ScratchBlocks.ProcedureUtils.addLabelField_ = function(text) { - this.appendDummyInput().appendField(text); -}; - -/** - * Add a label editor with the given text to a procedures_declaration - * block. Editing the text in the label editor updates the text of the - * corresponding label fields on function calls. - * @param {string} text The label text. - * @private - */ -Blockly.ScratchBlocks.ProcedureUtils.addLabelEditor_ = function(text) { - if (text) { - this.appendDummyInput(Blockly.utils.genUid()). - appendField(new Blockly.FieldTextInputRemovable(text)); - } -}; - -/** - * Build a DOM node representing a shadow block of the given type. - * @param {string} type One of 's' (string) or 'n' (number). - * @return {!Element} The DOM node representing the new shadow block. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.buildShadowDom_ = function(type) { - var shadowDom = goog.dom.createDom('shadow'); - if (type == 'n') { - var shadowType = 'math_number'; - var fieldName = 'NUM'; - var fieldValue = '1'; - } else { - var shadowType = 'text'; - var fieldName = 'TEXT'; - var fieldValue = ''; - } - shadowDom.setAttribute('type', shadowType); - var fieldDom = goog.dom.createDom('field', null, fieldValue); - fieldDom.setAttribute('name', fieldName); - shadowDom.appendChild(fieldDom); - return shadowDom; -}; - -/** - * Create a new shadow block and attach it to the given input. - * @param {!Blockly.Input} input The value input to attach a block to. - * @param {string} argumentType One of 'b' (boolean), 's' (string) or - * 'n' (number). - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.attachShadow_ = function(input, - argumentType) { - if (argumentType == 'n' || argumentType == 's') { - var blockType = argumentType == 'n' ? 'math_number' : 'text'; - Blockly.Events.disable(); - try { - var newBlock = this.workspace.newBlock(blockType); - if (argumentType == 'n') { - newBlock.setFieldValue('1', 'NUM'); - } else { - newBlock.setFieldValue('', 'TEXT'); - } - newBlock.setShadow(true); - if (!this.isInsertionMarker()) { - newBlock.initSvg(); - newBlock.render(false); - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); - } - newBlock.outputConnection.connect(input.connection); - } -}; - -/** - * Create a new argument reporter block. - * @param {string} argumentType One of 'b' (boolean), 's' (string) or - * 'n' (number). - * @param {string} displayName The name of the argument as provided by the - * user, which becomes the text of the label on the argument reporter block. - * @return {!Blockly.BlockSvg} The newly created argument reporter block. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.createArgumentReporter_ = function( - argumentType, displayName) { - if (argumentType == 'n' || argumentType == 's') { - var blockType = 'argument_reporter_string_number'; - } else { - var blockType = 'argument_reporter_boolean'; - } - Blockly.Events.disable(); - try { - var newBlock = this.workspace.newBlock(blockType); - newBlock.setShadow(true); - newBlock.setFieldValue(displayName, 'VALUE'); - if (!this.isInsertionMarker()) { - newBlock.initSvg(); - newBlock.render(false); - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); - } - return newBlock; -}; - -/** - * Populate the argument by attaching the correct child block or shadow to the - * given input. - * @param {string} type One of 'b' (boolean), 's' (string) or 'n' (number). - * @param {number} index The index of this argument into the argument id array. - * @param {!Object.} - * connectionMap An object mapping argument IDs to blocks and shadow DOMs. - * @param {string} id The ID of the input to populate. - * @param {!Blockly.Input} input The newly created input to populate. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.populateArgumentOnCaller_ = function(type, - index, connectionMap, id, input) { - var oldBlock = null; - var oldShadow = null; - if (connectionMap && (id in connectionMap)) { - var saveInfo = connectionMap[id]; - oldBlock = saveInfo['block']; - oldShadow = saveInfo['shadow']; - } - - if (connectionMap && oldBlock) { - // Reattach the old block and shadow DOM. - connectionMap[input.name] = null; - oldBlock.outputConnection.connect(input.connection); - if (type != 'b' && this.generateShadows_) { - var shadowDom = oldShadow || this.buildShadowDom_(type); - console.log("setting shadow dom: " + shadowDom); - input.connection.setShadowDom(shadowDom); - } - } else if (this.generateShadows_) { - this.attachShadow_(input, type); - } -}; - -/** - * Populate the argument by attaching the correct argument reporter to the given - * input. - * @param {string} type One of 'b' (boolean), 's' (string) or 'n' (number). - * @param {number} index The index of this argument into the argument ID and - * argument display name arrays. - * @param {!Object.} - * connectionMap An object mapping argument IDs to blocks and shadow DOMs. - * @param {string} id The ID of the input to populate. - * @param {!Blockly.Input} input The newly created input to populate. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.populateArgumentOnPrototype_ = function( - type, index, connectionMap, id, input) { - var oldBlock = null; - if (connectionMap && (id in connectionMap)) { - var saveInfo = connectionMap[id]; - oldBlock = saveInfo['block']; - } - - var oldTypeMatches = - Blockly.ScratchBlocks.ProcedureUtils.checkOldTypeMatches_(oldBlock, type); - var displayName = this.displayNames_[index]; - - // Decide which block to attach. - if (connectionMap && oldBlock && oldTypeMatches) { - // Update the text if needed. The old argument reporter is the same type, - // and on the same input, but the argument's display name may have changed. - var argumentReporter = oldBlock; - argumentReporter.setFieldValue(displayName, 'VALUE'); - connectionMap[input.name] = null; - } else { - var argumentReporter = this.createArgumentReporter_(type, displayName); - } - - // Attach the block. - input.connection.connect(argumentReporter.outputConnection); -}; - -/** - * Populate the argument by attaching the correct argument editor to the given - * input. - * @param {string} type One of 'b' (boolean), 's' (string) or 'n' (number). - * @param {number} index The index of this argument into the argument id and - * argument display name arrays. - * @param {!Object.} - * connectionMap An object mapping argument IDs to blocks and shadow DOMs. - * @param {string} id The ID of the input to populate. - * @param {!Blockly.Input} input The newly created input to populate. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.populateArgumentOnDeclaration_ = function( - type, index, connectionMap, id, input) { - - var oldBlock = null; - if (connectionMap && (id in connectionMap)) { - var saveInfo = connectionMap[id]; - oldBlock = saveInfo['block']; - } - - // TODO: This always returns false, because it checks for argument reporter - // blocks instead of argument editor blocks. Create a new version for argument - // editors. - var oldTypeMatches = - Blockly.ScratchBlocks.ProcedureUtils.checkOldTypeMatches_(oldBlock, type); - var displayName = this.displayNames_[index]; - - // Decide which block to attach. - if (oldBlock && oldTypeMatches) { - var argumentEditor = oldBlock; - oldBlock.setFieldValue(displayName, 'TEXT'); - connectionMap[input.name] = null; - } else { - var argumentEditor = this.createArgumentEditor_(type, displayName); - } - - // Attach the block. - input.connection.connect(argumentEditor.outputConnection); -}; - -/** - * Check whether the type of the old block corresponds to the given argument - * type. - * @param {Blockly.BlockSvg} oldBlock The old block to check. - * @param {string} type The argument type. One of 'n', 'n', or 's'. - * @return {boolean} True if the type matches, false otherwise. - */ -Blockly.ScratchBlocks.ProcedureUtils.checkOldTypeMatches_ = function(oldBlock, - type) { - if (!oldBlock) { - return false; - } - if ((type == 'n' || type == 's') && - oldBlock.type == 'argument_reporter_string_number') { - return true; - } - if (type == 'b' && oldBlock.type == 'argument_reporter_boolean') { - return true; - } - return false; -}; - -/** - * Create an argument editor. - * An argument editor is a shadow block with a single text field, which is used - * to set the display name of the argument. - * @param {string} argumentType One of 'b' (boolean), 's' (string) or - * 'n' (number). - * @param {string} displayName The display name of this argument, which is the - * text of the field on the shadow block. - * @return {!Blockly.BlockSvg} The newly created argument editor block. - * @private - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.createArgumentEditor_ = function( - argumentType, displayName) { - Blockly.Events.disable(); - try { - if (argumentType == 'n' || argumentType == 's') { - var newBlock = this.workspace.newBlock('argument_editor_string_number'); - } else { - var newBlock = this.workspace.newBlock('argument_editor_boolean'); - } - newBlock.setFieldValue(displayName, 'TEXT'); - newBlock.setShadow(true); - if (!this.isInsertionMarker()) { - newBlock.initSvg(); - newBlock.render(false); - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); - } - return newBlock; -}; - -/** - * Update the serializable information on the block based on the existing inputs - * and their text. - */ -Blockly.ScratchBlocks.ProcedureUtils.updateDeclarationProcCode_ = function() { - this.procCode_ = ''; - this.displayNames_ = []; - this.argumentIds_ = []; - for (var i = 0; i < this.inputList.length; i++) { - if (i != 0) { - this.procCode_ += ' '; - } - var input = this.inputList[i]; - if (input.type == Blockly.DUMMY_INPUT) { - this.procCode_ += input.fieldRow[0].getValue(); - } else if (input.type == Blockly.INPUT_VALUE) { - // Inspect the argument editor. - var target = input.connection.targetBlock(); - this.displayNames_.push(target.getFieldValue('TEXT')); - this.argumentIds_.push(input.name); - if (target.type == 'argument_editor_boolean') { - this.procCode_ += '%b'; - } else { - this.procCode_ += '%s'; - } - } else { - throw new Error( - 'Unexpected input type on a procedure mutator root: ' + input.type); - } - } -}; - -/** - * Focus on the last argument editor or label editor on the block. - * @private - */ -Blockly.ScratchBlocks.ProcedureUtils.focusLastEditor_ = function() { - if (this.inputList.length > 0) { - var newInput = this.inputList[this.inputList.length - 1]; - if (newInput.type == Blockly.DUMMY_INPUT) { - newInput.fieldRow[0].showEditor_(); - } else if (newInput.type == Blockly.INPUT_VALUE) { - // Inspect the argument editor. - var target = newInput.connection.targetBlock(); - target.getField('TEXT').showEditor_(); - } - } -}; - -/** - * Externally-visible function to add a label to the procedure declaration. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.addLabelExternal = function() { - Blockly.WidgetDiv.hide(true); - this.procCode_ = this.procCode_ + ' label text'; - this.updateDisplay_(); - this.focusLastEditor_(); -}; - -/** - * Externally-visible function to add a boolean argument to the procedure - * declaration. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.addBooleanExternal = function() { - Blockly.WidgetDiv.hide(true); - this.procCode_ = this.procCode_ + ' %b'; - this.displayNames_.push('boolean'); - this.argumentIds_.push(Blockly.utils.genUid()); - this.argumentDefaults_.push('false'); - this.updateDisplay_(); - this.focusLastEditor_(); -}; - -/** - * Externally-visible function to add a string/number argument to the procedure - * declaration. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.addStringNumberExternal = function() { - Blockly.WidgetDiv.hide(true); - this.procCode_ = this.procCode_ + ' %s'; - this.displayNames_.push('number or text'); - this.argumentIds_.push(Blockly.utils.genUid()); - this.argumentDefaults_.push(''); - this.updateDisplay_(); - this.focusLastEditor_(); -}; - -/** - * Externally-visible function to get the warp on procedure declaration. - * @return {boolean} The value of the warp_ property. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.getWarp = function() { - return this.warp_; -}; - -/** - * Externally-visible function to set the warp on procedure declaration. - * @param {boolean} warp The value of the warp_ property. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.setWarp = function(warp) { - this.warp_ = warp; -}; - -/** - * Callback to remove a field, only for the declaration block. - * @param {Blockly.Field} field The field being removed. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.removeFieldCallback = function(field) { - // Do not delete if there is only one input - if (this.inputList.length === 1) { - return; - } - var inputNameToRemove = null; - for (var n = 0; n < this.inputList.length; n++) { - var input = this.inputList[n]; - if (input.connection) { - var target = input.connection.targetBlock(); - if (target.getField(field.name) == field) { - inputNameToRemove = input.name; - } - } else { - for (var j = 0; j < input.fieldRow.length; j++) { - if (input.fieldRow[j] == field) { - inputNameToRemove = input.name; - } - } - } - } - if (inputNameToRemove) { - Blockly.WidgetDiv.hide(true); - this.removeInput(inputNameToRemove); - this.onChangeFn(); - this.updateDisplay_(); - } -}; - -/** - * Callback to pass removeField up to the declaration block from arguments. - * @param {Blockly.Field} field The field being removed. - * @public - */ -Blockly.ScratchBlocks.ProcedureUtils.removeArgumentCallback_ = function( - field) { - if (this.parentBlock_ && this.parentBlock_.removeFieldCallback) { - this.parentBlock_.removeFieldCallback(field); - } -}; - -/** - * Update argument reporter field values after an edit to the prototype mutation - * using previous argument ids and names. - * Because the argument reporters only store names and not which argument ids they - * are linked to, it would not be safe to update all argument reporters on the workspace - * since they may be argument reporters with the same name from a different procedure. - * Until there is a more explicit way of identifying argument reporter blocks using ids, - * be conservative and only update argument reporters that are used in the - * stack below the prototype, ie the definition. - * @param {!Array} prevArgIds The previous ordering of argument ids. - * @param {!Array} prevDisplayNames The previous argument names. - * @this Blockly.Block - */ -Blockly.ScratchBlocks.ProcedureUtils.updateArgumentReporterNames_ = function(prevArgIds, prevDisplayNames) { - var nameChanges = []; - var argReporters = []; - var definitionBlock = this.getParent(); - if (!definitionBlock) return; - - // Create a list of argument reporters that are descendants of the definition stack (see above comment) - var allBlocks = definitionBlock.getDescendants(false); - for (var i = 0; i < allBlocks.length; i++) { - var block = allBlocks[i]; - if ((block.type === 'argument_reporter_string_number' || - block.type === 'argument_reporter_boolean') && - !block.isShadow()) { // Exclude arg reporters in the prototype block, which are shadows. - argReporters.push(block); - } - } - - // Create a list of "name changes", including the new name and blocks matching the old name - // Only search over the current set of argument ids, ignore args that have been removed - for (var i = 0, id; id = this.argumentIds_[i]; i++) { - // Find the previous index of this argument id. Could be -1 if it is newly added. - var prevIndex = prevArgIds.indexOf(id); - if (prevIndex == -1) continue; // Newly added argument, no corresponding previous argument to update. - var prevName = prevDisplayNames[prevIndex]; - if (prevName != this.displayNames_[i]) { - nameChanges.push({ - newName: this.displayNames_[i], - blocks: argReporters.filter(function(block) { - return block.getFieldValue('VALUE') == prevName; - }) - }); - } - } - - // Finally update the blocks for each name change. - // Do this after creating the lists to avoid cycles of renaming. - for (var j = 0, nameChange; nameChange = nameChanges[j]; j++) { - for (var k = 0, block; block = nameChange.blocks[k]; k++) { - block.setFieldValue(nameChange.newName, 'VALUE'); - } - } -}; - -Blockly.Blocks['procedures_definition'] = { - /** - * Block for defining a procedure with no return value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.PROCEDURES_DEFINITION, - "args0": [ - { - "type": "input_statement", - "name": "custom_block" - } - ], - "extensions": ["colours_more", "shape_hat", "procedure_def_contextmenu"] - }); - } -}; - -Blockly.Blocks['procedures_call'] = { - /** - * Block for calling a procedure with no return value. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "extensions": ["colours_more", "shape_statement", "procedure_call_contextmenu"] - }); - this.procCode_ = ''; - this.argumentIds_ = []; - this.warp_ = false; - }, - // Shared. - getProcCode: Blockly.ScratchBlocks.ProcedureUtils.getProcCode, - removeAllInputs_: Blockly.ScratchBlocks.ProcedureUtils.removeAllInputs_, - disconnectOldBlocks_: Blockly.ScratchBlocks.ProcedureUtils.disconnectOldBlocks_, - deleteShadows_: Blockly.ScratchBlocks.ProcedureUtils.deleteShadows_, - createAllInputs_: Blockly.ScratchBlocks.ProcedureUtils.createAllInputs_, - updateDisplay_: Blockly.ScratchBlocks.ProcedureUtils.updateDisplay_, - - // Exist on all three blocks, but have different implementations. - mutationToDom: Blockly.ScratchBlocks.ProcedureUtils.callerMutationToDom, - domToMutation: Blockly.ScratchBlocks.ProcedureUtils.callerDomToMutation, - populateArgument_: Blockly.ScratchBlocks.ProcedureUtils.populateArgumentOnCaller_, - addProcedureLabel_: Blockly.ScratchBlocks.ProcedureUtils.addLabelField_, - - // Only exists on the external caller. - attachShadow_: Blockly.ScratchBlocks.ProcedureUtils.attachShadow_, - buildShadowDom_: Blockly.ScratchBlocks.ProcedureUtils.buildShadowDom_ -}; - -Blockly.Blocks['procedures_prototype'] = { - /** - * Block for calling a procedure with no return value, for rendering inside - * define block. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "extensions": ["colours_more", "shape_statement"] - }); - - /* Data known about the procedure. */ - this.procCode_ = ''; - this.displayNames_ = []; - this.argumentIds_ = []; - this.argumentDefaults_ = []; - this.warp_ = false; - }, - // Shared. - getProcCode: Blockly.ScratchBlocks.ProcedureUtils.getProcCode, - removeAllInputs_: Blockly.ScratchBlocks.ProcedureUtils.removeAllInputs_, - disconnectOldBlocks_: Blockly.ScratchBlocks.ProcedureUtils.disconnectOldBlocks_, - deleteShadows_: Blockly.ScratchBlocks.ProcedureUtils.deleteShadows_, - createAllInputs_: Blockly.ScratchBlocks.ProcedureUtils.createAllInputs_, - updateDisplay_: Blockly.ScratchBlocks.ProcedureUtils.updateDisplay_, - - // Exist on all three blocks, but have different implementations. - mutationToDom: Blockly.ScratchBlocks.ProcedureUtils.definitionMutationToDom, - domToMutation: Blockly.ScratchBlocks.ProcedureUtils.definitionDomToMutation, - populateArgument_: Blockly.ScratchBlocks.ProcedureUtils.populateArgumentOnPrototype_, - addProcedureLabel_: Blockly.ScratchBlocks.ProcedureUtils.addLabelField_, - - // Only exists on procedures_prototype. - createArgumentReporter_: Blockly.ScratchBlocks.ProcedureUtils.createArgumentReporter_, - updateArgumentReporterNames_: Blockly.ScratchBlocks.ProcedureUtils.updateArgumentReporterNames_ -}; - -Blockly.Blocks['procedures_declaration'] = { - /** - * The root block in the procedure declaration editor. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "extensions": ["colours_more", "shape_statement"] - }); - /* Data known about the procedure. */ - this.procCode_ = ''; - this.displayNames_ = []; - this.argumentIds_ = []; - this.argumentDefaults_ = []; - this.warp_ = false; - }, - // Shared. - getProcCode: Blockly.ScratchBlocks.ProcedureUtils.getProcCode, - removeAllInputs_: Blockly.ScratchBlocks.ProcedureUtils.removeAllInputs_, - disconnectOldBlocks_: Blockly.ScratchBlocks.ProcedureUtils.disconnectOldBlocks_, - deleteShadows_: Blockly.ScratchBlocks.ProcedureUtils.deleteShadows_, - createAllInputs_: Blockly.ScratchBlocks.ProcedureUtils.createAllInputs_, - updateDisplay_: Blockly.ScratchBlocks.ProcedureUtils.updateDisplay_, - - // Exist on all three blocks, but have different implementations. - mutationToDom: Blockly.ScratchBlocks.ProcedureUtils.definitionMutationToDom, - domToMutation: Blockly.ScratchBlocks.ProcedureUtils.definitionDomToMutation, - populateArgument_: Blockly.ScratchBlocks.ProcedureUtils.populateArgumentOnDeclaration_, - addProcedureLabel_: Blockly.ScratchBlocks.ProcedureUtils.addLabelEditor_, - - // Exist on declaration and arguments editors, with different implementations. - removeFieldCallback: Blockly.ScratchBlocks.ProcedureUtils.removeFieldCallback, - - // Only exist on procedures_declaration. - createArgumentEditor_: Blockly.ScratchBlocks.ProcedureUtils.createArgumentEditor_, - focusLastEditor_: Blockly.ScratchBlocks.ProcedureUtils.focusLastEditor_, - getWarp: Blockly.ScratchBlocks.ProcedureUtils.getWarp, - setWarp: Blockly.ScratchBlocks.ProcedureUtils.setWarp, - addLabelExternal: Blockly.ScratchBlocks.ProcedureUtils.addLabelExternal, - addBooleanExternal: Blockly.ScratchBlocks.ProcedureUtils.addBooleanExternal, - addStringNumberExternal: Blockly.ScratchBlocks.ProcedureUtils.addStringNumberExternal, - onChangeFn: Blockly.ScratchBlocks.ProcedureUtils.updateDeclarationProcCode_ -}; - -Blockly.Blocks['argument_reporter_boolean'] = { - init: function() { - this.jsonInit({ "message0": " %1", - "args0": [ - { - "type": "field_label_serializable", - "name": "VALUE", - "text": "" - } - ], - "extensions": ["colours_more", "output_boolean"] - }); - } -}; - -Blockly.Blocks['argument_reporter_string_number'] = { - init: function() { - this.jsonInit({ "message0": " %1", - "args0": [ - { - "type": "field_label_serializable", - "name": "VALUE", - "text": "" - } - ], - "extensions": ["colours_more", "output_number", "output_string"] - }); - } -}; - -Blockly.Blocks['argument_editor_boolean'] = { - init: function() { - this.jsonInit({ "message0": " %1", - "args0": [ - { - "type": "field_input_removable", - "name": "TEXT", - "text": "foo" - } - ], - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField, - "extensions": ["output_boolean"] - }); - }, - // Exist on declaration and arguments editors, with different implementations. - removeFieldCallback: Blockly.ScratchBlocks.ProcedureUtils.removeArgumentCallback_ -}; - -Blockly.Blocks['argument_editor_string_number'] = { - init: function() { - this.jsonInit({ "message0": " %1", - "args0": [ - { - "type": "field_input_removable", - "name": "TEXT", - "text": "foo" - } - ], - "colour": Blockly.Colours.textField, - "colourSecondary": Blockly.Colours.textField, - "colourTertiary": Blockly.Colours.textField, - "extensions": ["output_number", "output_string"] - }); - }, - // Exist on declaration and arguments editors, with different implementations. - removeFieldCallback: Blockly.ScratchBlocks.ProcedureUtils.removeArgumentCallback_ -}; diff --git a/packages/scratch-blocks/blocks_vertical/sensing.js b/packages/scratch-blocks/blocks_vertical/sensing.js deleted file mode 100644 index cd75de8d1..000000000 --- a/packages/scratch-blocks/blocks_vertical/sensing.js +++ /dev/null @@ -1,539 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.sensing'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - - -Blockly.Blocks['sensing_touchingobject'] = { - /** - * Block to Report if its touching a Object. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_TOUCHINGOBJECT, - "args0": [ - { - "type": "input_value", - "name": "TOUCHINGOBJECTMENU" - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_boolean"] - }); - } -}; - -Blockly.Blocks['sensing_touchingobjectmenu'] = { - /** - * "Touching [Object]" Block Menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "TOUCHINGOBJECTMENU", - "options": [ - [Blockly.Msg.SENSING_TOUCHINGOBJECT_POINTER, '_mouse_'], - [Blockly.Msg.SENSING_TOUCHINGOBJECT_EDGE, '_edge_'] - ] - } - ], - "extensions": ["colours_sensing", "output_string"] - }); - } -}; - -Blockly.Blocks['sensing_touchingcolor'] = { - /** - * Block to Report if its touching a certain Color. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_TOUCHINGCOLOR, - "args0": [ - { - "type": "input_value", - "name": "COLOR" - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_boolean"] - }); - } -}; - -Blockly.Blocks['sensing_coloristouchingcolor'] = { - /** - * Block to Report if a color is touching a certain Color. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_COLORISTOUCHINGCOLOR, - "args0": [ - { - "type": "input_value", - "name": "COLOR" - }, - { - "type": "input_value", - "name": "COLOR2" - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_boolean"] - }); - } -}; - -Blockly.Blocks['sensing_distanceto'] = { - /** - * Block to Report distance to another Object. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_DISTANCETO, - "args0": [ - { - "type": "input_value", - "name": "DISTANCETOMENU" - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_distancetomenu'] = { - /** - * "Distance to [Object]" Block Menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "DISTANCETOMENU", - "options": [ - [Blockly.Msg.SENSING_DISTANCETO_POINTER, '_mouse_'] - ] - } - ], - "extensions": ["colours_sensing", "output_string"] - }); - } -}; - -Blockly.Blocks['sensing_askandwait'] = { - /** - * Block to ask a question and wait - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_ASKANDWAIT, - "args0": [ - { - "type": "input_value", - "name": "QUESTION" - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sensing_answer'] = { - /** - * Block to report answer - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_ANSWER, - "category": Blockly.Categories.sensing, - "checkboxInFlyout": true, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_keypressed'] = { - /** - * Block to Report if a key is pressed. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_KEYPRESSED, - "args0": [ - { - "type": "input_value", - "name": "KEY_OPTION" - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_boolean"] - }); - } -}; - -Blockly.Blocks['sensing_keyoptions'] = { - /** - * Options for Keys - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "KEY_OPTION", - "options": [ - [Blockly.Msg.EVENT_WHENKEYPRESSED_SPACE, 'space'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_UP, 'up arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_DOWN, 'down arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_RIGHT, 'right arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_LEFT, 'left arrow'], - [Blockly.Msg.EVENT_WHENKEYPRESSED_ANY, 'any'], - ['a', 'a'], - ['b', 'b'], - ['c', 'c'], - ['d', 'd'], - ['e', 'e'], - ['f', 'f'], - ['g', 'g'], - ['h', 'h'], - ['i', 'i'], - ['j', 'j'], - ['k', 'k'], - ['l', 'l'], - ['m', 'm'], - ['n', 'n'], - ['o', 'o'], - ['p', 'p'], - ['q', 'q'], - ['r', 'r'], - ['s', 's'], - ['t', 't'], - ['u', 'u'], - ['v', 'v'], - ['w', 'w'], - ['x', 'x'], - ['y', 'y'], - ['z', 'z'], - ['0', '0'], - ['1', '1'], - ['2', '2'], - ['3', '3'], - ['4', '4'], - ['5', '5'], - ['6', '6'], - ['7', '7'], - ['8', '8'], - ['9', '9'] - ] - } - ], - "extensions": ["colours_sensing", "output_string"] - }); - } -}; - -Blockly.Blocks['sensing_mousedown'] = { - /** - * Block to Report if the mouse is down. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_MOUSEDOWN, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_boolean"] - }); - } -}; - -Blockly.Blocks['sensing_mousex'] = { - /** - * Block to report mouse's x position - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_MOUSEX, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_mousey'] = { - /** - * Block to report mouse's y position - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_MOUSEY, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_setdragmode'] = { - /** - * Block to set drag mode. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_SETDRAGMODE, - "args0": [ - { - "type": "field_dropdown", - "name": "DRAG_MODE", - "options": [ - [Blockly.Msg.SENSING_SETDRAGMODE_DRAGGABLE, 'draggable'], - [Blockly.Msg.SENSING_SETDRAGMODE_NOTDRAGGABLE, 'not draggable'] - ] - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sensing_loudness'] = { - /** - * Block to report loudness - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_LOUDNESS, - "category": Blockly.Categories.sensing, - "checkboxInFlyout": true, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_loud'] = { - /** - * Block to report if the loudness is "loud" (greater than 10). This is an - * obsolete block that is implemented for compatibility with Scratch 2.0 and - * 1.4 projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_LOUD, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_boolean"] - }); - } -}; - -Blockly.Blocks['sensing_timer'] = { - /** - * Block to report timer - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_TIMER, - "category": Blockly.Categories.sensing, - "checkboxInFlyout": true, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_resettimer'] = { - /** - * Block to reset timer - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_RESETTIMER, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sensing_of_object_menu'] = { - /** - * "* of _" object menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "OBJECT", - "options": [ - ['Sprite1', 'Sprite1'], - ['Stage', '_stage_'] - ] - } - ], - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_string"] - }); - } -}; - - -Blockly.Blocks['sensing_of'] = { - /** - * Block to report properties of sprites. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_OF, - "args0": [ - { - "type": "field_dropdown", - "name": "PROPERTY", - "options": [ - [Blockly.Msg.SENSING_OF_XPOSITION, 'x position'], - [Blockly.Msg.SENSING_OF_YPOSITION, 'y position'], - [Blockly.Msg.SENSING_OF_DIRECTION, 'direction'], - [Blockly.Msg.SENSING_OF_COSTUMENUMBER, 'costume #'], - [Blockly.Msg.SENSING_OF_COSTUMENAME, 'costume name'], - [Blockly.Msg.SENSING_OF_SIZE, 'size'], - [Blockly.Msg.SENSING_OF_VOLUME, 'volume'], - [Blockly.Msg.SENSING_OF_BACKDROPNUMBER, 'backdrop #'], - [Blockly.Msg.SENSING_OF_BACKDROPNAME, 'backdrop name'] - ] - }, - { - "type": "input_value", - "name": "OBJECT" - } - ], - "output": true, - "category": Blockly.Categories.sensing, - "outputShape": Blockly.OUTPUT_SHAPE_ROUND, - "extensions": ["colours_sensing"] - }); - } -}; - -Blockly.Blocks['sensing_current'] = { - /** - * Block to Report the current option. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_CURRENT, - "args0": [ - { - "type": "field_dropdown", - "name": "CURRENTMENU", - "options": [ - [Blockly.Msg.SENSING_CURRENT_YEAR, 'YEAR'], - [Blockly.Msg.SENSING_CURRENT_MONTH, 'MONTH'], - [Blockly.Msg.SENSING_CURRENT_DATE, 'DATE'], - [Blockly.Msg.SENSING_CURRENT_DAYOFWEEK, 'DAYOFWEEK'], - [Blockly.Msg.SENSING_CURRENT_HOUR, 'HOUR'], - [Blockly.Msg.SENSING_CURRENT_MINUTE, 'MINUTE'], - [Blockly.Msg.SENSING_CURRENT_SECOND, 'SECOND'] - ] - } - ], - "category": Blockly.Categories.sensing, - "checkboxInFlyout": true, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_dayssince2000'] = { - /** - * Block to report days since 2000 - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_DAYSSINCE2000, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_username'] = { - /** - * Block to report user's username - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_USERNAME, - "category": Blockly.Categories.sensing, - "checkboxInFlyout": true, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; - -Blockly.Blocks['sensing_userid'] = { - /** - * Block to report user's ID. Does not actually do anything. This is an - * obsolete block that is implemented for compatibility with Scratch 2.0 - * projects. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SENSING_USERID, - "category": Blockly.Categories.sensing, - "extensions": ["colours_sensing", "output_number"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/sound.js b/packages/scratch-blocks/blocks_vertical/sound.js deleted file mode 100644 index d4e4e8245..000000000 --- a/packages/scratch-blocks/blocks_vertical/sound.js +++ /dev/null @@ -1,245 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Blocks.sound'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); -goog.require('Blockly.ScratchBlocks.VerticalExtensions'); - -Blockly.Blocks['sound_sounds_menu'] = { - /** - * Sound effects drop-down menu. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "SOUND_MENU", - "options": [ - ['1', '0'], - ['2', '1'], - ['3', '2'], - ['4', '3'], - ['5', '4'], - ['6', '5'], - ['7', '6'], - ['8', '7'], - ['9', '8'], - ['10', '9'], - ['call a function', function() { - window.alert('function called!');} - ] - ] - } - ], - "colour": Blockly.Colours.sounds.secondary, - "colourSecondary": Blockly.Colours.sounds.secondary, - "colourTertiary": Blockly.Colours.sounds.tertiary, - "extensions": ["output_string"] - }); - } -}; - -Blockly.Blocks['sound_play'] = { - /** - * Block to play sound. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_PLAY, - "args0": [ - { - "type": "input_value", - "name": "SOUND_MENU" - } - ], - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_playuntildone'] = { - /** - * Block to play sound until done. - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_PLAYUNTILDONE, - "args0": [ - { - "type": "input_value", - "name": "SOUND_MENU" - } - ], - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_stopallsounds'] = { - /** - * Block to stop all sounds - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_STOPALLSOUNDS, - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_seteffectto'] = { - /** - * Block to set the audio effect - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_SETEFFECTO, - "args0": [ - { - "type": "field_dropdown", - "name": "EFFECT", - "options": [ - [Blockly.Msg.SOUND_EFFECTS_PITCH, 'PITCH'], - [Blockly.Msg.SOUND_EFFECTS_PAN, 'PAN'] - ] - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - - -Blockly.Blocks['sound_changeeffectby'] = { - /** - * Block to change the audio effect - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_CHANGEEFFECTBY, - "args0": [ - { - "type": "field_dropdown", - "name": "EFFECT", - "options": [ - [Blockly.Msg.SOUND_EFFECTS_PITCH, 'PITCH'], - [Blockly.Msg.SOUND_EFFECTS_PAN, 'PAN'] - ] - }, - { - "type": "input_value", - "name": "VALUE" - } - ], - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_cleareffects'] = { - /** - * Block to clear audio effects - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_CLEAREFFECTS, - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_changevolumeby'] = { - /** - * Block to change the sprite's volume by a certain value - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_CHANGEVOLUMEBY, - "args0": [ - { - "type": "input_value", - "name": "VOLUME" - } - ], - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_setvolumeto'] = { - /** - * Block to set the sprite's volume to a certain percent - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_SETVOLUMETO, - "args0": [ - { - "type": "input_value", - "name": "VOLUME" - } - ], - "category": Blockly.Categories.sound, - "extensions": ["colours_sounds", "shape_statement"] - }); - } -}; - -Blockly.Blocks['sound_volume'] = { - /** - * Block to report volume - * @this Blockly.Block - */ - init: function() { - this.jsonInit({ - "message0": Blockly.Msg.SOUND_VOLUME, - "category": Blockly.Categories.sound, - "checkboxInFlyout": true, - "extensions": ["colours_sounds", "output_number"] - }); - } -}; diff --git a/packages/scratch-blocks/blocks_vertical/vertical_extensions.js b/packages/scratch-blocks/blocks_vertical/vertical_extensions.js deleted file mode 100644 index e56227d1e..000000000 --- a/packages/scratch-blocks/blocks_vertical/vertical_extensions.js +++ /dev/null @@ -1,265 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Extensions for vertical blocks in scratch-blocks. - * The following extensions can be used to describe a block in Scratch terms. - * For instance, a block in the operators colour scheme with a number output - * would have the "colours_operators" and "output_number" extensions. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.ScratchBlocks.VerticalExtensions'); - -goog.require('Blockly.Colours'); -goog.require('Blockly.constants'); - - -/** - * Helper function that generates an extension based on a category name. - * The generated function will set primary, secondary, and tertiary colours - * based on the category name. - * @param {String} category The name of the category to set colours for. - * @return {function} An extension function that sets colours based on the given - * category. - */ -Blockly.ScratchBlocks.VerticalExtensions.colourHelper = function(category) { - var colours = Blockly.Colours[category]; - if (!(colours && colours.primary && colours.secondary && colours.tertiary)) { - throw new Error('Could not find colours for category "' + category + '"'); - } - /** - * Set the primary, secondary, and tertiary colours on this block for the - * given category. - * @this {Blockly.Block} - */ - return function() { - this.setColourFromRawValues_(colours.primary, colours.secondary, - colours.tertiary); - }; -}; - -/** - * Extension to set the colours of a text field, which are all the same. - */ -Blockly.ScratchBlocks.VerticalExtensions.COLOUR_TEXTFIELD = function() { - this.setColourFromRawValues_(Blockly.Colours.textField, - Blockly.Colours.textField, Blockly.Colours.textField); -}; - -/** - * Extension to make a block fit into a stack of statements, regardless of its - * inputs. That means the block should have a previous connection and a next - * connection and have inline inputs. - * @this {Blockly.Block} - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.SHAPE_STATEMENT = function() { - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); -}; - -/** - * Extension to make a block be shaped as a hat block, regardless of its - * inputs. That means the block should have a next connection and have inline - * inputs, but have no previous connection. - * @this {Blockly.Block} - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.SHAPE_HAT = function() { - this.setInputsInline(true); - this.setNextStatement(true, null); -}; - -/** - * Extension to make a block be shaped as an end block, regardless of its - * inputs. That means the block should have a previous connection and have - * inline inputs, but have no next connection. - * @this {Blockly.Block} - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.SHAPE_END = function() { - this.setInputsInline(true); - this.setPreviousStatement(true, null); -}; - -/** - * Extension to make represent a number reporter in Scratch-Blocks. - * That means the block has inline inputs, a round output shape, and a 'Number' - * output type. - * @this {Blockly.Block} - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_NUMBER = function() { - this.setInputsInline(true); - this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND); - this.setOutput(true, 'Number'); -}; - -/** - * Extension to make represent a string reporter in Scratch-Blocks. - * That means the block has inline inputs, a round output shape, and a 'String' - * output type. - * @this {Blockly.Block} - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_STRING = function() { - this.setInputsInline(true); - this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND); - this.setOutput(true, 'String'); -}; - -/** - * Extension to make represent a boolean reporter in Scratch-Blocks. - * That means the block has inline inputs, a round output shape, and a 'Boolean' - * output type. - * @this {Blockly.Block} - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_BOOLEAN = function() { - this.setInputsInline(true); - this.setOutputShape(Blockly.OUTPUT_SHAPE_HEXAGONAL); - this.setOutput(true, 'Boolean'); -}; - -/** - * Mixin to add a context menu for a procedure definition block. - * It adds the "edit" option and removes the "duplicate" option. - * @mixin - * @augments Blockly.Block - * @package - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.PROCEDURE_DEF_CONTEXTMENU = { - /** - * Add the "edit" option and removes the "duplicate" option from the context - * menu. - * @param {!Array.} menuOptions List of menu options to edit. - * @this Blockly.Block - */ - customContextMenu: function(menuOptions) { - // Add the edit option at the end. - menuOptions.push(Blockly.Procedures.makeEditOption(this)); - - // Find the delete option and update its callback to be specific to - // functions. - for (var i = 0, option; option = menuOptions[i]; i++) { - if (option.text == Blockly.Msg.DELETE_BLOCK) { - var input = this.getInput('custom_block'); - // this is the root block, not the shadow block. - if (input && input.connection && input.connection.targetBlock()) { - var procCode = input.connection.targetBlock().getProcCode(); - } else { - return; - } - var rootBlock = this; - option.callback = function() { - var didDelete = Blockly.Procedures.deleteProcedureDefCallback( - procCode, rootBlock); - if (!didDelete) { - // TODO:(#1151) - alert('To delete a block definition, first remove all uses of the block'); - } - }; - } - } - // Find and remove the duplicate option - for (var i = 0, option; option = menuOptions[i]; i++) { - if (option.text == Blockly.Msg.DUPLICATE) { - menuOptions.splice(i, 1); - break; - } - } - } -}; - -/** - * Mixin to add a context menu for a procedure call block. - * It adds the "edit" option and the "define" option. - * @mixin - * @augments Blockly.Block - * @package - * @readonly - */ -Blockly.ScratchBlocks.VerticalExtensions.PROCEDURE_CALL_CONTEXTMENU = { - /** - * Add the "edit" option to the context menu. - * @todo Add "go to definition" option once implemented. - * @param {!Array.} menuOptions List of menu options to edit. - * @this Blockly.Block - */ - customContextMenu: function(menuOptions) { - menuOptions.push(Blockly.Procedures.makeEditOption(this)); - } -}; - - -Blockly.ScratchBlocks.VerticalExtensions.SCRATCH_EXTENSION = function() { - this.isScratchExtension = true; -}; -/** - * Register all extensions for scratch-blocks. - * @package - */ -Blockly.ScratchBlocks.VerticalExtensions.registerAll = function() { - var categoryNames = - ['control', 'data', 'data_lists', 'sounds', 'motion', 'looks', 'event', - 'sensing', 'pen', 'operators', 'more']; - // Register functions for all category colours. - for (var i = 0; i < categoryNames.length; i++) { - var name = categoryNames[i]; - Blockly.Extensions.register('colours_' + name, - Blockly.ScratchBlocks.VerticalExtensions.colourHelper(name)); - } - - // Text fields transcend categories. - Blockly.Extensions.register('colours_textfield', - Blockly.ScratchBlocks.VerticalExtensions.COLOUR_TEXTFIELD); - - // Register extensions for common block shapes. - Blockly.Extensions.register('shape_statement', - Blockly.ScratchBlocks.VerticalExtensions.SHAPE_STATEMENT); - Blockly.Extensions.register('shape_hat', - Blockly.ScratchBlocks.VerticalExtensions.SHAPE_HAT); - Blockly.Extensions.register('shape_end', - Blockly.ScratchBlocks.VerticalExtensions.SHAPE_END); - - // Output shapes and types are related. - Blockly.Extensions.register('output_number', - Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_NUMBER); - Blockly.Extensions.register('output_string', - Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_STRING); - Blockly.Extensions.register('output_boolean', - Blockly.ScratchBlocks.VerticalExtensions.OUTPUT_BOOLEAN); - - // Custom procedures have interesting context menus. - Blockly.Extensions.registerMixin('procedure_def_contextmenu', - Blockly.ScratchBlocks.VerticalExtensions.PROCEDURE_DEF_CONTEXTMENU); - Blockly.Extensions.registerMixin('procedure_call_contextmenu', - Blockly.ScratchBlocks.VerticalExtensions.PROCEDURE_CALL_CONTEXTMENU); - - // Extension blocks have slightly different block rendering. - Blockly.Extensions.register('scratch_extension', - Blockly.ScratchBlocks.VerticalExtensions.SCRATCH_EXTENSION); -}; - -Blockly.ScratchBlocks.VerticalExtensions.registerAll(); diff --git a/packages/scratch-blocks/build.py b/packages/scratch-blocks/build.py deleted file mode 100755 index b56059961..000000000 --- a/packages/scratch-blocks/build.py +++ /dev/null @@ -1,630 +0,0 @@ -#!/usr/bin/python2.7 -# Compresses the core Blockly files into a single JavaScript file. -# -# Copyright 2012 Google Inc. -# https://developers.google.com/blockly/ -# -# 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. - -# This script generates two versions of Blockly's core files: -# blockly_compressed.js -# blockly_uncompressed.js -# The compressed file is a concatenation of all of Blockly's core files which -# have been run through Google's Closure Compiler. This is done using the -# online API (which takes a few seconds and requires an Internet connection). -# The uncompressed file is a script that loads in each of Blockly's core files -# one by one. This takes much longer for a browser to load, but is useful -# when debugging code since line numbers are meaningful and variables haven't -# been renamed. The uncompressed file also allows for a faster developement -# cycle since there is no need to rebuild or recompile, just reload. -# -# This script also generates: -# blocks_compressed.js: The compressed common blocks. -# blocks_horizontal_compressed.js: The compressed Scratch horizontal blocks. -# blocks_vertical_compressed.js: The compressed Scratch vertical blocks. -# msg/js/.js for every language defined in msg/js/.json. - -import sys -if sys.version_info[0] != 2: - raise Exception("Blockly build only compatible with Python 2.x.\n" - "You are using: " + sys.version) - -import errno, glob, httplib, json, os, re, subprocess, threading, urllib - -REMOTE_COMPILER = "remote" - -CLOSURE_DIR = os.path.pardir -CLOSURE_ROOT = os.path.pardir -CLOSURE_LIBRARY = "closure-library" -CLOSURE_COMPILER = REMOTE_COMPILER - -CLOSURE_DIR_NPM = "node_modules" -CLOSURE_ROOT_NPM = os.path.join("node_modules") -CLOSURE_LIBRARY_NPM = "google-closure-library" -CLOSURE_COMPILER_NPM = "google-closure-compiler" - -def import_path(fullpath): - """Import a file with full path specification. - Allows one to import from any directory, something __import__ does not do. - - Args: - fullpath: Path and filename of import. - - Returns: - An imported module. - """ - path, filename = os.path.split(fullpath) - filename, ext = os.path.splitext(filename) - sys.path.append(path) - module = __import__(filename) - reload(module) # Might be out of date. - del sys.path[-1] - return module - -def read(filename): - f = open(filename) - content = "".join(f.readlines()) - f.close() - return content - -HEADER = ("// Do not edit this file; automatically generated by build.py.\n" - "'use strict';\n") - - -class Gen_uncompressed(threading.Thread): - """Generate a JavaScript file that loads Blockly's raw files. - Runs in a separate thread. - """ - def __init__(self, search_paths, vertical, closure_env): - threading.Thread.__init__(self) - self.search_paths = search_paths - self.vertical = vertical - self.closure_env = closure_env - - def run(self): - if self.vertical: - target_filename = 'blockly_uncompressed_vertical.js' - else: - target_filename = 'blockly_uncompressed_horizontal.js' - f = open(target_filename, 'w') - f.write(HEADER) - f.write(self.format_js(""" -var isNodeJS = !!(typeof module !== 'undefined' && module.exports && - typeof window === 'undefined'); - -if (isNodeJS) { - var window = {}; - require('{closure_library}'); -} - -window.BLOCKLY_DIR = (function() { - if (!isNodeJS) { - // Find name of current directory. - var scripts = document.getElementsByTagName('script'); - var re = new RegExp('(.+)[\/]blockly_uncompressed(_vertical|_horizontal|)\.js$'); - for (var i = 0, script; script = scripts[i]; i++) { - var match = re.exec(script.src); - if (match) { - return match[1]; - } - } - alert('Could not detect Blockly\\'s directory name.'); - } - return ''; -})(); - -window.BLOCKLY_BOOT = function() { - var dir = ''; - if (isNodeJS) { - require('{closure_library}'); - dir = 'blockly'; - } else { - // Execute after Closure has loaded. - if (!window.goog) { - alert('Error: Closure not found. Read this:\\n' + - 'developers.google.com/blockly/guides/modify/web/closure'); - } - if (window.BLOCKLY_DIR.search(/node_modules/)) { - dir = '..'; - } else { - dir = window.BLOCKLY_DIR.match(/[^\\/]+$/)[0]; - } - } -""")) - add_dependency = [] - base_path = calcdeps.FindClosureBasePath(self.search_paths) - for dep in calcdeps.BuildDependenciesFromFiles(self.search_paths): - add_dependency.append(calcdeps.GetDepsLine(dep, base_path)) - add_dependency.sort() # Deterministic build. - add_dependency = '\n'.join(add_dependency) - # Find the Blockly directory name and replace it with a JS variable. - # This allows blockly_uncompressed.js to be compiled on one computer and be - # used on another, even if the directory name differs. - m = re.search('[\\/]([^\\/]+)[\\/]core[\\/]blockly.js', add_dependency) - add_dependency = re.sub('([\\/])' + re.escape(m.group(1)) + - '([\\/]core[\\/])', '\\1" + dir + "\\2', add_dependency) - f.write(add_dependency + '\n') - - provides = [] - for dep in calcdeps.BuildDependenciesFromFiles(self.search_paths): - # starts with '../' or 'node_modules/' - if not dep.filename.startswith(self.closure_env["closure_root"] + os.sep): - provides.extend(dep.provides) - provides.sort() # Deterministic build. - f.write('\n') - f.write('// Load Blockly.\n') - for provide in provides: - f.write("goog.require('%s');\n" % provide) - - f.write(self.format_js(""" -delete this.BLOCKLY_DIR; -delete this.BLOCKLY_BOOT; -}; - -if (isNodeJS) { - window.BLOCKLY_BOOT(); - module.exports = Blockly; -} else { - // Delete any existing Closure (e.g. Soy's nogoog_shim). - document.write(''); - // Load fresh Closure Library. - document.write(''); - document.write(''); -} -""")) - f.close() - print("SUCCESS: " + target_filename) - - def format_js(self, code): - """Format JS in a way that python's format method can work with to not - consider brace-wrapped sections to be format replacements while still - replacing known keys. - """ - - key_whitelist = self.closure_env.keys() - - keys_pipe_separated = reduce(lambda accum, key: accum + "|" + key, key_whitelist) - begin_brace = re.compile(r"\{(?!%s)" % (keys_pipe_separated,)) - - end_brace = re.compile(r"\}") - def end_replacement(match): - try: - maybe_key = match.string[match.string[:match.start()].rindex("{") + 1:match.start()] - except ValueError: - return "}}" - - if maybe_key and maybe_key in key_whitelist: - return "}" - else: - return "}}" - - return begin_brace.sub("{{", end_brace.sub(end_replacement, code)).format(**self.closure_env) - -class Gen_compressed(threading.Thread): - """Generate a JavaScript file that contains all of Blockly's core and all - required parts of Closure, compiled together. - Uses the Closure Compiler's online API. - Runs in a separate thread. - """ - def __init__(self, search_paths_vertical, search_paths_horizontal, closure_env): - threading.Thread.__init__(self) - self.search_paths_vertical = search_paths_vertical - self.search_paths_horizontal = search_paths_horizontal - self.closure_env = closure_env - - def run(self): - self.gen_core(True) - self.gen_core(False) - self.gen_blocks("horizontal") - self.gen_blocks("vertical") - self.gen_blocks("common") - - def gen_core(self, vertical): - if vertical: - target_filename = 'blockly_compressed_vertical.js' - search_paths = self.search_paths_vertical - else: - target_filename = 'blockly_compressed_horizontal.js' - search_paths = self.search_paths_horizontal - # Define the parameters for the POST request. - params = [ - ("compilation_level", "SIMPLE"), - - # remote will filter this out - ("language_in", "ECMASCRIPT_2017"), - ("language_out", "ECMASCRIPT5"), - ("rewrite_polyfills", "false"), - ("define", "goog.DEBUG=false"), - - # local will filter this out - ("use_closure_library", "true"), - ] - - # Read in all the source files. - filenames = calcdeps.CalculateDependencies(search_paths, - [os.path.join("core", "blockly.js")]) - filenames.sort() # Deterministic build. - for filename in filenames: - # Append filenames as false arguments the step before compiling will - # either transform them into arguments for local or remote compilation - params.append(("js_file", filename)) - - self.do_compile(params, target_filename, filenames, "") - - def gen_blocks(self, block_type): - if block_type == "horizontal": - target_filename = "blocks_compressed_horizontal.js" - filenames = glob.glob(os.path.join("blocks_horizontal", "*.js")) - elif block_type == "vertical": - target_filename = "blocks_compressed_vertical.js" - filenames = glob.glob(os.path.join("blocks_vertical", "*.js")) - elif block_type == "common": - target_filename = "blocks_compressed.js" - filenames = glob.glob(os.path.join("blocks_common", "*.js")) - - # glob.glob ordering is platform-dependent and not necessary deterministic - filenames.sort() # Deterministic build. - - # Define the parameters for the POST request. - params = [ - ("compilation_level", "SIMPLE"), - ] - - # Read in all the source files. - # Add Blockly.Blocks to be compatible with the compiler. - params.append(("js_file", os.path.join("build", "gen_blocks.js"))) - # Add Blockly.Colours for use of centralized colour bank - filenames.append(os.path.join("core", "colours.js")) - filenames.append(os.path.join("core", "constants.js")) - - for filename in filenames: - # Append filenames as false arguments the step before compiling will - # either transform them into arguments for local or remote compilation - params.append(("js_file", filename)) - - # Remove Blockly.Blocks to be compatible with Blockly. - remove = "var Blockly={Blocks:{}};" - self.do_compile(params, target_filename, filenames, remove) - - def do_compile(self, params, target_filename, filenames, remove): - if self.closure_env["closure_compiler"] == REMOTE_COMPILER: - do_compile = self.do_compile_remote - else: - do_compile = self.do_compile_local - json_data = do_compile(params, target_filename) - - if self.report_errors(target_filename, filenames, json_data): - self.write_output(target_filename, remove, json_data) - self.report_stats(target_filename, json_data) - - def do_compile_local(self, params, target_filename): - filter_keys = ["use_closure_library"] - - # Drop arg if arg is js_file else add dashes - dash_params = [] - for (arg, value) in params: - dash_params.append((value,) if arg == "js_file" else ("--" + arg, value)) - - # Flatten dash_params into dash_args if their keys are not in filter_keys - dash_args = [] - for pair in dash_params: - if pair[0][2:] not in filter_keys: - dash_args.extend(pair) - - # Build the final args array by prepending google-closure-compiler to - # dash_args and dropping any falsy members - args = [] - for group in [["google-closure-compiler"], dash_args]: - args.extend(filter(lambda item: item, group)) - - proc = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - - # Build the JSON response. - filesizes = [os.path.getsize(value) for (arg, value) in params if arg == "js_file"] - return dict( - compiledCode=stdout, - statistics=dict( - originalSize=reduce(lambda v, size: v + size, filesizes, 0), - compressedSize=len(stdout), - ) - ) - - def do_compile_remote(self, params, target_filename): - filter_keys = [ - "language_in", - "language_out", - "rewrite_polyfills", - "define", - ] - - params.extend([ - ("output_format", "json"), - ("output_info", "compiled_code"), - ("output_info", "warnings"), - ("output_info", "errors"), - ("output_info", "statistics"), - ]) - - # Send the request to Google. - remoteParams = [] - for (arg, value) in params: - if not arg in filter_keys: - if arg == "js_file": - if not value.startswith(self.closure_env["closure_root"] + os.sep): - remoteParams.append(("js_code", read(value))) - # Change the normal compilation_level value SIMPLE to the remove - # service's SIMPLE_OPTIMIZATIONS - elif arg == "compilation_level" and value == "SIMPLE": - remoteParams.append((arg, "SIMPLE_OPTIMIZATIONS")) - else: - remoteParams.append((arg, value)) - - headers = {"Content-type": "application/x-www-form-urlencoded"} - conn = httplib.HTTPSConnection("closure-compiler.appspot.com") - conn.request("POST", "/compile", urllib.urlencode(remoteParams), headers) - response = conn.getresponse() - json_str = response.read() - conn.close() - - # Parse the JSON response. - return json.loads(json_str) - - def report_errors(self, target_filename, filenames, json_data): - def file_lookup(name): - if not name.startswith("Input_"): - return "???" - n = int(name[6:]) - 1 - return filenames[n] - - if json_data.has_key("serverErrors"): - errors = json_data["serverErrors"] - for error in errors: - print("SERVER ERROR: %s" % target_filename) - print(error["error"]) - elif json_data.has_key("errors"): - errors = json_data["errors"] - for error in errors: - print("FATAL ERROR") - print(error["error"]) - if error["file"]: - print("%s at line %d:" % ( - file_lookup(error["file"]), error["lineno"])) - print(error["line"]) - print((" " * error["charno"]) + "^") - sys.exit(1) - else: - if json_data.has_key("warnings"): - warnings = json_data["warnings"] - for warning in warnings: - print("WARNING") - print(warning["warning"]) - if warning["file"]: - print("%s at line %d:" % ( - file_lookup(warning["file"]), warning["lineno"])) - print(warning["line"]) - print((" " * warning["charno"]) + "^") - print() - - return True - - return False - - def write_output(self, target_filename, remove, json_data): - if not json_data.has_key("compiledCode"): - print("FATAL ERROR: Compiler did not return compiledCode.") - sys.exit(1) - - code = HEADER + "\n" + json_data["compiledCode"] - code = code.replace(remove, "") - - # Trim down Google's (and only Google's) Apache licences. - # The Closure Compiler preserves these. - LICENSE = re.compile("""/\\* - - [\w ]+ - - Copyright \\d+ Google Inc. - https://developers.google.com/blockly/ - - 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. -\\*/""") - code = re.sub(LICENSE, "", code) - - stats = json_data["statistics"] - original_b = stats["originalSize"] - compressed_b = stats["compressedSize"] - if original_b > 0 and compressed_b > 0: - f = open(target_filename, "w") - f.write(code) - f.close() - - def report_stats(self, target_filename, json_data): - stats = json_data["statistics"] - original_b = stats["originalSize"] - compressed_b = stats["compressedSize"] - if original_b > 0 and compressed_b > 0: - original_kb = int(original_b / 1024 + 0.5) - compressed_kb = int(compressed_b / 1024 + 0.5) - ratio = int(float(compressed_b) / float(original_b) * 100 + 0.5) - print("SUCCESS: " + target_filename) - print("Size changed from %d KB to %d KB (%d%%)." % ( - original_kb, compressed_kb, ratio)) - else: - print("UNKNOWN ERROR") - - -class Gen_langfiles(threading.Thread): - """Generate JavaScript file for each natural language supported. - - Runs in a separate thread. - """ - - def __init__(self): - threading.Thread.__init__(self) - - def _rebuild(self, srcs, dests): - # Determine whether any of the files in srcs is newer than any in dests. - try: - return (max(os.path.getmtime(src) for src in srcs) > - min(os.path.getmtime(dest) for dest in dests)) - except OSError as e: - # Was a file not found? - if e.errno == errno.ENOENT: - # If it was a source file, we can't proceed. - if e.filename in srcs: - print("Source file missing: " + e.filename) - sys.exit(1) - else: - # If a destination file was missing, rebuild. - return True - else: - print("Error checking file creation times: " + e) - - def run(self): - # The files msg/json/{en,qqq,synonyms}.json depend on msg/messages.js. - if self._rebuild([os.path.join("msg", "messages.js")], - [os.path.join("msg", "json", f) for f in - ["en.json", "qqq.json", "synonyms.json"]]): - try: - subprocess.check_call([ - "python", - os.path.join("i18n", "js_to_json.py"), - "--input_file", "msg/messages.js", - "--output_dir", "msg/json/", - "--quiet"]) - except (subprocess.CalledProcessError, OSError) as e: - # Documentation for subprocess.check_call says that CalledProcessError - # will be raised on failure, but I found that OSError is also possible. - print("Error running i18n/js_to_json.py: ", e) - sys.exit(1) - - # Checking whether it is necessary to rebuild the js files would be a lot of - # work since we would have to compare each .json file with each - # .js file. Rebuilding is easy and cheap, so just go ahead and do it. - try: - # Use create_messages.py to create .js files from .json files. - cmd = [ - "python", - os.path.join("i18n", "create_messages.py"), - "--source_lang_file", os.path.join("msg", "json", "en.json"), - "--source_synonym_file", os.path.join("msg", "json", "synonyms.json"), - "--source_constants_file", os.path.join("msg", "json", "constants.json"), - "--key_file", os.path.join("msg", "json", "keys.json"), - "--output_dir", os.path.join("msg", "js"), - "--quiet"] - json_files = glob.glob(os.path.join("msg", "json", "*.json")) - json_files = [file for file in json_files if not - (file.endswith(("keys.json", "synonyms.json", "qqq.json", "constants.json")))] - cmd.extend(json_files) - subprocess.check_call(cmd) - except (subprocess.CalledProcessError, OSError) as e: - print("Error running i18n/create_messages.py: ", e) - sys.exit(1) - - # Output list of .js files created. - for f in json_files: - # This assumes the path to the current directory does not contain "json". - f = f.replace("json", "js") - if os.path.isfile(f): - print("SUCCESS: " + f) - else: - print("FAILED to create " + f) - -def exclude_vertical(item): - return not item.endswith("block_render_svg_vertical.js") - -def exclude_horizontal(item): - return not item.endswith("block_render_svg_horizontal.js") - -if __name__ == "__main__": - try: - closure_dir = CLOSURE_DIR_NPM - closure_root = CLOSURE_ROOT_NPM - closure_library = CLOSURE_LIBRARY_NPM - closure_compiler = CLOSURE_COMPILER_NPM - - # Load calcdeps from the local library - calcdeps = import_path(os.path.join( - closure_root, closure_library, "closure", "bin", "calcdeps.py")) - - # Sanity check the local compiler - test_args = [closure_compiler, os.path.join("build", "test_input.js")] - test_proc = subprocess.Popen(test_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) - (stdout, _) = test_proc.communicate() - assert stdout == read(os.path.join("build", "test_expect.js")) - - print("Using local compiler: google-closure-compiler ...\n") - except (ImportError, AssertionError): - print("Using remote compiler: closure-compiler.appspot.com ...\n") - - try: - closure_dir = CLOSURE_DIR - closure_root = CLOSURE_ROOT - closure_library = CLOSURE_LIBRARY - closure_compiler = CLOSURE_COMPILER - - calcdeps = import_path(os.path.join( - closure_root, closure_library, "closure", "bin", "calcdeps.py")) - except ImportError: - if os.path.isdir(os.path.join(os.path.pardir, "closure-library-read-only")): - # Dir got renamed when Closure moved from Google Code to GitHub in 2014. - print("Error: Closure directory needs to be renamed from" - "'closure-library-read-only' to 'closure-library'.\n" - "Please rename this directory.") - elif os.path.isdir(os.path.join(os.path.pardir, "google-closure-library")): - print("Error: Closure directory needs to be renamed from" - "'google-closure-library' to 'closure-library'.\n" - "Please rename this directory.") - else: - print("""Error: Closure not found. Read this: - developers.google.com/blockly/guides/modify/web/closure""") - sys.exit(1) - - search_paths = calcdeps.ExpandDirectories( - ["core", os.path.join(closure_root, closure_library)]) - - search_paths_horizontal = filter(exclude_vertical, search_paths) - search_paths_vertical = filter(exclude_horizontal, search_paths) - - closure_env = { - "closure_dir": closure_dir, - "closure_root": closure_root, - "closure_library": closure_library, - "closure_compiler": closure_compiler, - } - - # Run all tasks in parallel threads. - # Uncompressed is limited by processor speed. - # Compressed is limited by network and server speed. - # Vertical: - Gen_uncompressed(search_paths_vertical, True, closure_env).start() - # Horizontal: - Gen_uncompressed(search_paths_horizontal, False, closure_env).start() - - # Compressed forms of vertical and horizontal. - Gen_compressed(search_paths_vertical, search_paths_horizontal, closure_env).start() - - # This is run locally in a separate thread. - # Gen_langfiles().start() diff --git a/packages/scratch-blocks/build/gen_blocks.js b/packages/scratch-blocks/build/gen_blocks.js deleted file mode 100644 index 2ab6e688b..000000000 --- a/packages/scratch-blocks/build/gen_blocks.js +++ /dev/null @@ -1 +0,0 @@ -goog.provide('Blockly.Blocks'); diff --git a/packages/scratch-blocks/build/test_expect.js b/packages/scratch-blocks/build/test_expect.js deleted file mode 100644 index 555c3f7c5..000000000 --- a/packages/scratch-blocks/build/test_expect.js +++ /dev/null @@ -1 +0,0 @@ -var Blockly={Blocks:{}}; diff --git a/packages/scratch-blocks/build/test_input.js b/packages/scratch-blocks/build/test_input.js deleted file mode 100644 index 2ab6e688b..000000000 --- a/packages/scratch-blocks/build/test_input.js +++ /dev/null @@ -1 +0,0 @@ -goog.provide('Blockly.Blocks'); diff --git a/packages/scratch-blocks/cleanup.sh b/packages/scratch-blocks/cleanup.sh deleted file mode 100755 index a73573ae3..000000000 --- a/packages/scratch-blocks/cleanup.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash - -# Script for cleaning up blockly-specific files when merging blockly into scratch-blocks -# Removes files and directories that scratch-blocks doesn't want. -# Rachel Fenichel (fenichel@google.com) - -# Note: 'ours' is scratch-blocks, 'theirs' is blockly. - -# Formatting helpers. -indent() { sed 's/^/ /'; } -indent_more() { sed 's/^/\t/'; } -empty_lines() { printf '\n\n'; } - - -empty_lines -echo Cleaning up a merge from Blockly to Scratch-Blocks... - -# Get rid of Blockly's internationalization/messages. This is not usually worth -# scrolling up to look at. -empty_lines -echo Cleaning up Blockly message files... -# Turn on more powerful globbing -shopt -s extglob - -# Having trouble with directories. Let's just go there. -cd msg/json -git rm -f !(en.json|synonyms.json) | indent_more -cd ../.. - -# Having trouble with directories. Let's just go there. -cd msg/js -git rm -f !(en.js) | indent_more -cd ../.. - -# Turn powerful globbing off again -shopt -u extglob - -# Whole directories that we want to get rid of. -empty_lines -echo Removing blockly-specific directories... -dirslist="accessible demos tests/generators appengine blocks local_build" -for directory in $dirslist -do - echo 'Cleaning up' $directory | indent - git rm -rf $directory | indent_more -done - -# Scratch-blocks does not use generators -empty_lines -echo Removing generators... -generated_langs="dart javascript lua php python" -for lang in $generated_langs -do - echo 'Cleaning up' $lang | indent - # Directories containing block generators. - git rm -rf generators/${lang} | indent_more -done - -# Built stuff that we should get rid of. -empty_lines -echo Removing built files... -built_files="blockly_compressed.js \ -blockly_uncompressed.js \ -blockly_accessible_compressed.js \ -blockly_accessible_uncompressed.js \ -blocks_compressed.js \ -dart_compressed.js \ -php_compressed.js \ -python_compressed.js \ -javascript_compressed.js \ -lua_compressed.js" - -for filename in $built_files -do - git rm $filename | indent_more -done - -empty_lines -echo Miscellaneous cleanup... -# Use ours. -keep_ours=".github/ISSUE_TEMPLATE.md \ -.github/PULL_REQUEST_TEMPLATE.md \ -.gitignore \ -.travis.yml \ -core/block_animations.js \ -msg/messages.js \ -msg/js/en.js \ -msg/json/en.json" - - -for filename in $keep_ours -do - git checkout --ours $filename && git add $filename | indent_more -done - -# Scratch-blocks has separate vertical and horizontal playgrounds and block -# rendering. -git rm -f tests/playground.html core/block_render_svg.js | indent_more - -empty_lines -echo Done with cleanup. diff --git a/packages/scratch-blocks/core/block.js b/packages/scratch-blocks/core/block.js deleted file mode 100644 index 88c11fb9c..000000000 --- a/packages/scratch-blocks/core/block.js +++ /dev/null @@ -1,1811 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview The class representing one block. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Block'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.Colours'); -goog.require('Blockly.Comment'); -goog.require('Blockly.ScratchBlockComment'); -goog.require('Blockly.Connection'); -goog.require('Blockly.Events.BlockChange'); -goog.require('Blockly.Events.BlockCreate'); -goog.require('Blockly.Events.BlockDelete'); -goog.require('Blockly.Events.BlockMove'); -goog.require('Blockly.Extensions'); -goog.require('Blockly.FieldLabelSerializable'); -goog.require('Blockly.FieldVariableGetter'); -goog.require('Blockly.Input'); -goog.require('Blockly.Mutator'); -goog.require('Blockly.Warning'); -goog.require('Blockly.Workspace'); -goog.require('Blockly.Xml'); -goog.require('goog.array'); -goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); -goog.require('goog.string'); - - -/** - * Class for one block. - * Not normally called directly, workspace.newBlock() is preferred. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. If the ID conflicts with an in-use ID, a new one will - * be generated. - * @constructor - */ -Blockly.Block = function(workspace, prototypeName, opt_id) { - var flyoutWorkspace = workspace && workspace.getFlyout && workspace.getFlyout() ? - workspace.getFlyout().getWorkspace() : null; - /** @type {string} */ - this.id = (opt_id && !workspace.getBlockById(opt_id) && - (!flyoutWorkspace || !flyoutWorkspace.getBlockById(opt_id))) ? - opt_id : Blockly.utils.genUid(); - workspace.blockDB_[this.id] = this; - /** @type {Blockly.Connection} */ - this.outputConnection = null; - /** @type {Blockly.Connection} */ - this.nextConnection = null; - /** @type {Blockly.Connection} */ - this.previousConnection = null; - /** @type {!Array.} */ - this.inputList = []; - /** @type {boolean|undefined} */ - this.inputsInline = true; - /** @type {boolean} */ - this.disabled = false; - /** @type {string|!Function} */ - this.tooltip = ''; - /** @type {boolean} */ - this.contextMenu = true; - - /** - * @type {Blockly.Block} - * @protected - */ - this.parentBlock_ = null; - - /** - * @type {!Array.} - * @protected - */ - this.childBlocks_ = []; - - /** - * @type {boolean} - * @private - */ - this.deletable_ = true; - - /** - * @type {boolean} - * @private - */ - this.movable_ = true; - - /** - * @type {boolean} - * @private - */ - this.editable_ = true; - - /** - * @type {boolean} - * @private - */ - this.isShadow_ = false; - - /** - * @type {boolean} - * @protected - */ - this.collapsed_ = false; - - /** - * @type {boolean} - * @private - */ - this.checkboxInFlyout_ = false; - - /** @type {string|Blockly.Comment} */ - this.comment = null; - - /** - * @type {?number} - * @private - */ - this.outputShape_ = null; - - /** - * @type {?string} - * @private - */ - this.category_ = null; - - /** - * The block's position in workspace units. (0, 0) is at the workspace's - * origin; scale does not change this value. - * @type {!goog.math.Coordinate} - * @private - */ - this.xy_ = new goog.math.Coordinate(0, 0); - - /** @type {!Blockly.Workspace} */ - this.workspace = workspace; - /** @type {boolean} */ - this.isInFlyout = workspace.isFlyout; - /** @type {boolean} */ - this.isInMutator = workspace.isMutator; - - /** @type {boolean} */ - this.RTL = workspace.RTL; - - /** @type {boolean} */ - this.isInsertionMarker_ = false; - - // Copy the type-specific functions and data from the prototype. - if (prototypeName) { - /** @type {string} */ - this.type = prototypeName; - var prototype = Blockly.Blocks[prototypeName]; - goog.asserts.assertObject(prototype, - 'Error: Unknown block type "%s".', prototypeName); - goog.mixin(this, prototype); - } - - workspace.addTopBlock(this); - - // Call an initialization function, if it exists. - if (goog.isFunction(this.init)) { - this.init(); - } - // Record initial inline state. - /** @type {boolean|undefined} */ - this.inputsInlineDefault = this.inputsInline; - - // Fire a create event. - if (Blockly.Events.isEnabled()) { - var existingGroup = Blockly.Events.getGroup(); - if (!existingGroup) { - Blockly.Events.setGroup(true); - } - try { - Blockly.Events.fire(new Blockly.Events.BlockCreate(this)); - } finally { - if (!existingGroup) { - Blockly.Events.setGroup(false); - } - } - - } - // Bind an onchange function, if it exists. - if (goog.isFunction(this.onchange)) { - this.setOnChange(this.onchange); - } -}; - -/** - * Optional text data that round-trips beween blocks and XML. - * Has no effect. May be used by 3rd parties for meta information. - * @type {?string} - */ -Blockly.Block.prototype.data = null; - -/** - * Colour of the block in '#RRGGBB' format. - * @type {string} - * @private - */ -Blockly.Block.prototype.colour_ = '#FF0000'; - -/** - * Secondary colour of the block in '#RRGGBB' format. - * @type {string} - * @private - */ -Blockly.Block.prototype.colourSecondary_ = '#FF0000'; - -/** - * Tertiary colour of the block in '#RRGGBB' format. - * @type {string} - * @private - */ -Blockly.Block.prototype.colourTertiary_ = '#FF0000'; - -/** - * Fill colour used to override default shadow colour behaviour. - * @type {string} - * @private - */ -Blockly.Block.prototype.shadowColour_ = null; - -/** - * Dispose of this block. - * @param {boolean} healStack If true, then try to heal any gap by connecting - * the next statement with the previous statement. Otherwise, dispose of - * all children of this block. - */ -Blockly.Block.prototype.dispose = function(healStack) { - if (!this.workspace) { - // Already deleted. - return; - } - // Terminate onchange event calls. - if (this.onchangeWrapper_) { - this.workspace.removeChangeListener(this.onchangeWrapper_); - } - this.unplug(healStack); - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockDelete(this)); - } - Blockly.Events.disable(); - - try { - // This block is now at the top of the workspace. - // Remove this block from the workspace's list of top-most blocks. - if (this.workspace) { - this.workspace.removeTopBlock(this); - // Remove from block database. - delete this.workspace.blockDB_[this.id]; - this.workspace = null; - } - - // Just deleting this block from the DOM would result in a memory leak as - // well as corruption of the connection database. Therefore we must - // methodically step through the blocks and carefully disassemble them. - - if (Blockly.selected == this) { - Blockly.selected = null; - } - - // First, dispose of all my children. - for (var i = this.childBlocks_.length - 1; i >= 0; i--) { - this.childBlocks_[i].dispose(false); - } - // Then dispose of myself. - // Dispose of all inputs and their fields. - for (var i = 0, input; input = this.inputList[i]; i++) { - input.dispose(); - } - this.inputList.length = 0; - // Dispose of any remaining connections (next/previous/output). - var connections = this.getConnections_(true); - for (var i = 0; i < connections.length; i++) { - var connection = connections[i]; - if (connection.isConnected()) { - connection.disconnect(); - } - connections[i].dispose(); - } - } finally { - Blockly.Events.enable(); - } -}; - -/** - * Call initModel on all fields on the block. - * May be called more than once. - * Either initModel or initSvg must be called after creating a block and before - * the first interaction with it. Interactions include UI actions - * (e.g. clicking and dragging) and firing events (e.g. create, delete, and - * change). - * @public - */ -Blockly.Block.prototype.initModel = function() { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.initModel) { - field.initModel(); - } - } - } -}; - -/** - * Unplug this block from its superior block. If this block is a statement, - * optionally reconnect the block underneath with the block on top. - * @param {boolean=} opt_healStack Disconnect child statement and reconnect - * stack. Defaults to false. - */ -Blockly.Block.prototype.unplug = function(opt_healStack) { - if (this.outputConnection) { - if (this.outputConnection.isConnected()) { - // Disconnect from any superior block. - this.outputConnection.disconnect(); - } - } else { - if (this.previousConnection) { - var previousTarget = null; - if (this.previousConnection.isConnected()) { - // Remember the connection that any next statements need to connect to. - previousTarget = this.previousConnection.targetConnection; - // Detach this block from the parent's tree. - this.previousConnection.disconnect(); - } - } - var nextBlock = this.getNextBlock(); - if (opt_healStack && nextBlock) { - // Disconnect the next statement. - var nextTarget = this.nextConnection.targetConnection; - nextTarget.disconnect(); - if (previousTarget && previousTarget.checkType_(nextTarget)) { - // Attach the next statement to the previous statement. - previousTarget.connect(nextTarget); - } - } - } -}; - -/** - * Returns all connections originating from this block. - * @return {!Array.} Array of connections. - * @private - */ -Blockly.Block.prototype.getConnections_ = function() { - var myConnections = []; - if (this.outputConnection) { - myConnections.push(this.outputConnection); - } - if (this.previousConnection) { - myConnections.push(this.previousConnection); - } - if (this.nextConnection) { - myConnections.push(this.nextConnection); - } - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection) { - myConnections.push(input.connection); - } - } - return myConnections; -}; - -/** - * Walks down a stack of blocks and finds the last next connection on the stack. - * @return {Blockly.Connection} The last next connection on the stack, or null. - * @package - */ -Blockly.Block.prototype.lastConnectionInStack = function() { - var nextConnection = this.nextConnection; - while (nextConnection) { - var nextBlock = nextConnection.targetBlock(); - if (!nextBlock) { - // Found a next connection with nothing on the other side. - return nextConnection; - } - nextConnection = nextBlock.nextConnection; - } - // Ran out of next connections. - return null; -}; - -/** - * Bump unconnected blocks out of alignment. Two blocks which aren't actually - * connected should not coincidentally line up on screen. - * @protected - */ -Blockly.Block.prototype.bumpNeighbours_ = function() { - console.warn('Not expected to reach this bumpNeighbours_ function. The ' + - 'BlockSvg function for bumpNeighbours_ was expected to be called instead.'); -}; - -/** - * Return the parent block or null if this block is at the top level. - * @return {Blockly.Block} The block that holds the current block. - */ -Blockly.Block.prototype.getParent = function() { - // Look at the DOM to see if we are nested in another block. - return this.parentBlock_; -}; - -/** - * Return the input that connects to the specified block. - * @param {!Blockly.Block} block A block connected to an input on this block. - * @return {Blockly.Input} The input that connects to the specified block. - */ -Blockly.Block.prototype.getInputWithBlock = function(block) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection && input.connection.targetBlock() == block) { - return input; - } - } - return null; -}; - -/** - * Return the input that contains the specified connection - * @param {!Blockly.Connection} conn A connection on this block. - * @return {Blockly.Input} The input that contains the specified connection. - */ -Blockly.Block.prototype.getInputWithConnection = function(conn) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection == conn) { - return input; - } - } - return null; -}; - -/** - * Return the parent block that surrounds the current block, or null if this - * block has no surrounding block. A parent block might just be the previous - * statement, whereas the surrounding block is an if statement, while loop, etc. - * @return {Blockly.Block} The block that surrounds the current block. - */ -Blockly.Block.prototype.getSurroundParent = function() { - var block = this; - do { - var prevBlock = block; - block = block.getParent(); - if (!block) { - // Ran off the top. - return null; - } - } while (block.getNextBlock() == prevBlock); - // This block is an enclosing parent, not just a statement in a stack. - return block; -}; - -/** - * Return the next statement block directly connected to this block. - * @return {Blockly.Block} The next statement block or null. - */ -Blockly.Block.prototype.getNextBlock = function() { - return this.nextConnection && this.nextConnection.targetBlock(); -}; - -/** - * Return the previous statement block directly connected to this block. - * @return {Blockly.Block} The previous statement block or null. - */ -Blockly.Block.prototype.getPreviousBlock = function() { - return this.previousConnection && this.previousConnection.targetBlock(); -}; - -/** - * Return the connection on the first statement input on this block, or null if - * there are none. - * @return {Blockly.Connection} The first statement connection or null. - */ -Blockly.Block.prototype.getFirstStatementConnection = function() { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection && input.connection.type == Blockly.NEXT_STATEMENT) { - return input.connection; - } - } - return null; -}; - -/** - * Return the top-most block in this block's tree. - * This will return itself if this block is at the top level. - * @return {!Blockly.Block} The root block. - */ -Blockly.Block.prototype.getRootBlock = function() { - var rootBlock; - var block = this; - do { - rootBlock = block; - block = rootBlock.parentBlock_; - } while (block); - return rootBlock; -}; - -/** - * Find all the blocks that are directly nested inside this one. - * Includes value and statement inputs, as well as any following statement. - * Excludes any connection on an output tab or any preceding statement. - * Blocks are optionally sorted by position; top to bottom. - * @param {boolean} ordered Sort the list if true. - * @return {!Array.} Array of blocks. - */ -Blockly.Block.prototype.getChildren = function(ordered) { - if (!ordered) { - return this.childBlocks_; - } - var blocks = []; - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection) { - var child = input.connection.targetBlock(); - if (child) { - blocks.push(child); - } - } - } - var next = this.getNextBlock(); - if (next) { - blocks.push(next); - } - return blocks; -}; - -/** - * Set parent of this block to be a new block or null. - * @param {Blockly.Block} newParent New parent block. - */ -Blockly.Block.prototype.setParent = function(newParent) { - if (newParent == this.parentBlock_) { - return; - } - if (this.parentBlock_) { - // Remove this block from the old parent's child list. - goog.array.remove(this.parentBlock_.childBlocks_, this); - - // Disconnect from superior blocks. - if (this.previousConnection && this.previousConnection.isConnected()) { - throw 'Still connected to previous block.'; - } - if (this.outputConnection && this.outputConnection.isConnected()) { - throw 'Still connected to parent block.'; - } - this.parentBlock_ = null; - // This block hasn't actually moved on-screen, so there's no need to update - // its connection locations. - } else { - // Remove this block from the workspace's list of top-most blocks. - this.workspace.removeTopBlock(this); - } - - this.parentBlock_ = newParent; - if (newParent) { - // Add this block to the new parent's child list. - newParent.childBlocks_.push(this); - } else { - this.workspace.addTopBlock(this); - } -}; - -/** - * Find all the blocks that are directly or indirectly nested inside this one. - * Includes this block in the list. - * Includes value and statement inputs, as well as any following statements. - * Excludes any connection on an output tab or any preceding statements. - * Blocks are optionally sorted by position, top to bottom. - * @param {boolean} ordered Sort the list if true. - * @param {boolean=} opt_ignoreShadows If set, don't include shadow blocks. - * @return {!Array.} Flattened array of blocks. - */ -Blockly.Block.prototype.getDescendants = function(ordered, opt_ignoreShadows) { - var blocks = [this]; - var childBlocks = this.getChildren(ordered); - for (var child, i = 0; child = childBlocks[i]; i++) { - if (!opt_ignoreShadows || !child.isShadow_) { - blocks.push.apply( - blocks, child.getDescendants(ordered, opt_ignoreShadows)); - } - } - return blocks; -}; - -/** - * Get whether this block is deletable or not. - * @return {boolean} True if deletable. - */ -Blockly.Block.prototype.isDeletable = function() { - return this.deletable_ && !this.isShadow_ && - !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this block is deletable or not. - * @param {boolean} deletable True if deletable. - */ -Blockly.Block.prototype.setDeletable = function(deletable) { - this.deletable_ = deletable; -}; - -/** - * Get whether this block is movable or not. - * @return {boolean} True if movable. - */ -Blockly.Block.prototype.isMovable = function() { - return this.movable_ && !this.isShadow_ && - !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this block is movable or not. - * @param {boolean} movable True if movable. - */ -Blockly.Block.prototype.setMovable = function(movable) { - this.movable_ = movable; -}; - -/** - * Get whether this block is a shadow block or not. - * @return {boolean} True if a shadow. - */ -Blockly.Block.prototype.isShadow = function() { - return this.isShadow_; -}; - -/** - * Set whether this block is a shadow block or not. - * @param {boolean} shadow True if a shadow. - */ -Blockly.Block.prototype.setShadow = function(shadow) { - this.isShadow_ = shadow; -}; - -/** - * Get whether this block is an insertion marker block or not. - * @return {boolean} True if an insertion marker. - */ -Blockly.Block.prototype.isInsertionMarker = function() { - return this.isInsertionMarker_; -}; - -/** - * Set whether this block is an insertion marker block or not. - * @param {boolean} insertionMarker True if an insertion marker. - */ -Blockly.Block.prototype.setInsertionMarker = function(insertionMarker) { - if (this.isInsertionMarker_ == insertionMarker) { - return; // No change. - } - this.isInsertionMarker_ = insertionMarker; - // TODO: handle removing insertion marker status. - if (this.isInsertionMarker_) { - this.setColour(Blockly.Colours.insertionMarker); - this.setOpacity(Blockly.Colours.insertionMarkerOpacity); - Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyInsertionMarker'); - } -}; - -/** - * Get whether this block is editable or not. - * @return {boolean} True if editable. - */ -Blockly.Block.prototype.isEditable = function() { - return this.editable_ && !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this block is editable or not. - * @param {boolean} editable True if editable. - */ -Blockly.Block.prototype.setEditable = function(editable) { - this.editable_ = editable; - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - field.updateEditable(); - } - } -}; - -/** - * Set whether the connections are hidden (not tracked in a database) or not. - * Recursively walk down all child blocks (except collapsed blocks). - * @param {boolean} hidden True if connections are hidden. - */ -Blockly.Block.prototype.setConnectionsHidden = function(hidden) { - if (!hidden && this.isCollapsed()) { - if (this.outputConnection) { - this.outputConnection.setHidden(hidden); - } - if (this.previousConnection) { - this.previousConnection.setHidden(hidden); - } - if (this.nextConnection) { - this.nextConnection.setHidden(hidden); - var child = this.nextConnection.targetBlock(); - if (child) { - child.setConnectionsHidden(hidden); - } - } - } else { - var myConnections = this.getConnections_(true); - for (var i = 0, connection; connection = myConnections[i]; i++) { - connection.setHidden(hidden); - if (connection.isSuperior()) { - var child = connection.targetBlock(); - if (child) { - child.setConnectionsHidden(hidden); - } - } - } - } -}; - -/** - * Find the connection on this block that corresponds to the given connection - * on the other block. - * Used to match connections between a block and its insertion marker. - * @param {!Blockly.Block} otherBlock The other block to match against. - * @param {!Blockly.Connection} conn The other connection to match. - * @return {Blockly.Connection} the matching connection on this block, or null. - */ -Blockly.Block.prototype.getMatchingConnection = function(otherBlock, conn) { - var connections = this.getConnections_(true); - var otherConnections = otherBlock.getConnections_(true); - if (connections.length != otherConnections.length) { - throw "Connection lists did not match in length."; - } - for (var i = 0; i < otherConnections.length; i++) { - if (otherConnections[i] == conn) { - return connections[i]; - } - } - return null; -}; - -/** - * Set the URL of this block's help page. - * @param {string|Function} url URL string for block help, or function that - * returns a URL. Null for no help. - */ -Blockly.Block.prototype.setHelpUrl = function(url) { - this.helpUrl = url; -}; - -/** - * Change the tooltip text for a block. - * @param {string|!Function} newTip Text for tooltip or a parent element to - * link to for its tooltip. May be a function that returns a string. - */ -Blockly.Block.prototype.setTooltip = function(newTip) { - this.tooltip = newTip; -}; - -/** - * Get the colour of a block. - * @return {string} #RRGGBB string. - */ -Blockly.Block.prototype.getColour = function() { - return this.colour_; -}; - -/** - * Get the secondary colour of a block. - * @return {string} #RRGGBB string. - */ -Blockly.Block.prototype.getColourSecondary = function() { - return this.colourSecondary_; -}; - -/** - * Get the tertiary colour of a block. - * @return {string} #RRGGBB string. - */ -Blockly.Block.prototype.getColourTertiary = function() { - return this.colourTertiary_; -}; - -/** - * Get the shadow colour of a block. - * @return {string} #RRGGBB string. - */ -Blockly.Block.prototype.getShadowColour = function() { - return this.shadowColour_; -}; - -/** - * Set the shadow colour of a block. - * @param {number|string} colour HSV hue value, or #RRGGBB string. - */ -Blockly.Block.prototype.setShadowColour = function(colour) { - this.shadowColour_ = this.makeColour_(colour); - if (this.rendered) { - this.updateColour(); - } -}; - -/** - * Clear the shadow colour of a block. - */ -Blockly.Block.prototype.clearShadowColour = function() { - this.shadowColour_ = null; - if (this.rendered) { - this.updateColour(); - } -}; - -/** -* Create an #RRGGBB string colour from a colour HSV hue value or #RRGGBB string. -* @param {number|string} colour HSV hue value, or #RRGGBB string. -* @return {string} #RRGGBB string. -* @private -*/ -Blockly.Block.prototype.makeColour_ = function(colour) { - var hue = Number(colour); - if (!isNaN(hue)) { - return Blockly.hueToRgb(hue); - } else if (goog.isString(colour) && colour.match(/^#[0-9a-fA-F]{6}$/)) { - return colour; - } else { - throw 'Invalid colour: ' + colour; - } -}; - -/** - * Change the colour of a block, and optional secondary/teriarty colours. - * @param {number|string} colour HSV hue value, or #RRGGBB string. - * @param {number|string} colourSecondary HSV hue value, or #RRGGBB string. - * @param {number|string} colourTertiary HSV hue value, or #RRGGBB string. - */ -Blockly.Block.prototype.setColour = function(colour, colourSecondary, colourTertiary) { - this.colour_ = this.makeColour_(colour); - if (colourSecondary !== undefined) { - this.colourSecondary_ = this.makeColour_(colourSecondary); - } else { - this.colourSecondary_ = goog.color.rgbArrayToHex( - goog.color.darken(goog.color.hexToRgb(this.colour_), 0.1)); - } - if (colourTertiary !== undefined) { - this.colourTertiary_ = this.makeColour_(colourTertiary); - } else { - this.colourTertiary_ = goog.color.rgbArrayToHex( - goog.color.darken(goog.color.hexToRgb(this.colour_), 0.2)); - } - if (this.rendered) { - this.updateColour(); - } -}; - -/** - * Sets a callback function to use whenever the block's parent workspace - * changes, replacing any prior onchange handler. This is usually only called - * from the constructor, the block type initializer function, or an extension - * initializer function. - * @param {function(Blockly.Events.Abstract)} onchangeFn The callback to call - * when the block's workspace changes. - * @throws {Error} if onchangeFn is not falsey or a function. - */ -Blockly.Block.prototype.setOnChange = function(onchangeFn) { - if (onchangeFn && !goog.isFunction(onchangeFn)) { - throw new Error("onchange must be a function."); - } - if (this.onchangeWrapper_) { - this.workspace.removeChangeListener(this.onchangeWrapper_); - } - this.onchange = onchangeFn; - if (this.onchange) { - this.onchangeWrapper_ = onchangeFn.bind(this); - this.workspace.addChangeListener(this.onchangeWrapper_); - } -}; - -/** - * Returns the named field from a block. - * @param {string} name The name of the field. - * @return {Blockly.Field} Named field, or null if field does not exist. - */ -Blockly.Block.prototype.getField = function(name) { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.name === name) { - return field; - } - } - } - return null; -}; - -/** - * Return all variables referenced by this block. - * @return {!Array.} List of variable names. - * @package - */ -Blockly.Block.prototype.getVars = function() { - var vars = []; - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.referencesVariables()) { - vars.push(field.getValue()); - } - } - } - return vars; -}; - -/** - * Return all variables referenced by this block. - * @return {!Array.} List of variable models. - * @package - */ -Blockly.Block.prototype.getVarModels = function() { - var vars = []; - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.referencesVariables()) { - var model = this.workspace.getVariableById(field.getValue()); - // Check if the variable actually exists (and isn't just a potential - // variable). - if (model) { - vars.push(model); - } - } - } - } - return vars; -}; - -/** - * Notification that a variable is renaming but keeping the same ID. If the - * variable is in use on this block, rerender to show the new name. - * @param {!Blockly.VariableModel} variable The variable being renamed. - * @package - */ -Blockly.Block.prototype.updateVarName = function(variable) { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.referencesVariables() && - variable.getId() == field.getValue()) { - field.setText(variable.name); - } - } - } -}; - -/** - * Notification that a variable is renaming. - * If the ID matches one of this block's variables, rename it. - * @param {string} oldId ID of variable to rename. - * @param {string} newId ID of new variable. May be the same as oldId, but with - * an updated name. - */ -Blockly.Block.prototype.renameVarById = function(oldId, newId) { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field.referencesVariables() && - oldId == field.getValue()) { - field.setValue(newId); - } - } - } -}; - -/** - * Returns the language-neutral value from the field of a block. - * @param {string} name The name of the field. - * @return {?string} Value from the field or null if field does not exist. - */ -Blockly.Block.prototype.getFieldValue = function(name) { - var field = this.getField(name); - if (field) { - return field.getValue(); - } - return null; -}; - -/** - * Change the field value for a block (e.g. 'CHOOSE' or 'REMOVE'). - * @param {string} newValue Value to be the new field. - * @param {string} name The name of the field. - */ -Blockly.Block.prototype.setFieldValue = function(newValue, name) { - var field = this.getField(name); - goog.asserts.assertObject(field, 'Field "%s" not found.', name); - field.setValue(newValue); -}; - -/** - * Set whether this block can chain onto the bottom of another block. - * @param {boolean} newBoolean True if there can be a previous statement. - * @param {(string|Array.|null)=} opt_check Statement type or - * list of statement types. Null/undefined if any type could be connected. - */ -Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) { - if (newBoolean) { - if (opt_check === undefined) { - opt_check = null; - } - if (!this.previousConnection) { - goog.asserts.assert(!this.outputConnection, - 'Remove output connection prior to adding previous connection.'); - this.previousConnection = - this.makeConnection_(Blockly.PREVIOUS_STATEMENT); - } - this.previousConnection.setCheck(opt_check); - } else { - if (this.previousConnection) { - goog.asserts.assert(!this.previousConnection.isConnected(), - 'Must disconnect previous statement before removing connection.'); - this.previousConnection.dispose(); - this.previousConnection = null; - } - } -}; - -/** - * Set whether another block can chain onto the bottom of this block. - * @param {boolean} newBoolean True if there can be a next statement. - * @param {(string|Array.|null)=} opt_check Statement type or - * list of statement types. Null/undefined if any type could be connected. - */ -Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) { - if (newBoolean) { - if (opt_check === undefined) { - opt_check = null; - } - if (!this.nextConnection) { - this.nextConnection = this.makeConnection_(Blockly.NEXT_STATEMENT); - } - this.nextConnection.setCheck(opt_check); - } else { - if (this.nextConnection) { - goog.asserts.assert(!this.nextConnection.isConnected(), - 'Must disconnect next statement before removing connection.'); - this.nextConnection.dispose(); - this.nextConnection = null; - } - } -}; - -/** - * Set whether this block returns a value. - * @param {boolean} newBoolean True if there is an output. - * @param {(string|Array.|null)=} opt_check Returned type or list - * of returned types. Null or undefined if any type could be returned - * (e.g. variable get). - */ -Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) { - if (newBoolean) { - if (opt_check === undefined) { - opt_check = null; - } - if (!this.outputConnection) { - goog.asserts.assert(!this.previousConnection, - 'Remove previous connection prior to adding output connection.'); - this.outputConnection = this.makeConnection_(Blockly.OUTPUT_VALUE); - } - this.outputConnection.setCheck(opt_check); - } else { - if (this.outputConnection) { - goog.asserts.assert(!this.outputConnection.isConnected(), - 'Must disconnect output value before removing connection.'); - this.outputConnection.dispose(); - this.outputConnection = null; - } - } -}; - -/** - * Set whether value inputs are arranged horizontally or vertically. - * @param {boolean} newBoolean True if inputs are horizontal. - */ -Blockly.Block.prototype.setInputsInline = function(newBoolean) { - if (this.inputsInline != newBoolean) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this, 'inline', null, this.inputsInline, newBoolean)); - this.inputsInline = newBoolean; - } -}; - -/** - * Get whether value inputs are arranged horizontally or vertically. - * @return {boolean} True if inputs are horizontal. - */ -Blockly.Block.prototype.getInputsInline = function() { - if (this.inputsInline != undefined) { - // Set explicitly. - return this.inputsInline; - } - // Not defined explicitly. Figure out what would look best. - for (var i = 1; i < this.inputList.length; i++) { - if (this.inputList[i - 1].type == Blockly.DUMMY_INPUT && - this.inputList[i].type == Blockly.DUMMY_INPUT) { - // Two dummy inputs in a row. Don't inline them. - return false; - } - } - for (var i = 1; i < this.inputList.length; i++) { - if (this.inputList[i - 1].type == Blockly.INPUT_VALUE && - this.inputList[i].type == Blockly.DUMMY_INPUT) { - // Dummy input after a value input. Inline them. - return true; - } - } - return false; -}; - -/** - * Set whether the block is disabled or not. - * @param {boolean} disabled True if disabled. - */ -Blockly.Block.prototype.setDisabled = function(disabled) { - if (this.disabled != disabled) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this, 'disabled', null, this.disabled, disabled)); - this.disabled = disabled; - } -}; - -/** - * Get whether the block is disabled or not due to parents. - * The block's own disabled property is not considered. - * @return {boolean} True if disabled. - */ -Blockly.Block.prototype.getInheritedDisabled = function() { - var ancestor = this.getSurroundParent(); - while (ancestor) { - if (ancestor.disabled) { - return true; - } - ancestor = ancestor.getSurroundParent(); - } - // Ran off the top. - return false; -}; - -/** - * Get whether the block is collapsed or not. - * @return {boolean} True if collapsed. - */ -Blockly.Block.prototype.isCollapsed = function() { - return this.collapsed_; -}; - -/** - * Set whether the block is collapsed or not. - * @param {boolean} collapsed True if collapsed. - */ -Blockly.Block.prototype.setCollapsed = function(collapsed) { - if (this.collapsed_ != collapsed) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this, 'collapsed', null, this.collapsed_, collapsed)); - this.collapsed_ = collapsed; - } -}; - -/** - * Create a human-readable text representation of this block and any children. - * @param {number=} opt_maxLength Truncate the string to this length. - * @param {string=} opt_emptyToken The placeholder string used to denote an - * empty field. If not specified, '?' is used. - * @return {string} Text of block. - */ -Blockly.Block.prototype.toString = function(opt_maxLength, opt_emptyToken) { - var text = []; - var emptyFieldPlaceholder = opt_emptyToken || '?'; - if (this.collapsed_) { - text.push(this.getInput('_TEMP_COLLAPSED_INPUT').fieldRow[0].text_); - } else { - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field instanceof Blockly.FieldDropdown && !field.getValue()) { - text.push(emptyFieldPlaceholder); - } else { - text.push(field.getText()); - } - } - if (input.connection) { - var child = input.connection.targetBlock(); - if (child) { - text.push(child.toString(undefined, opt_emptyToken)); - } else { - text.push(emptyFieldPlaceholder); - } - } - } - } - text = goog.string.trim(text.join(' ')) || '???'; - if (opt_maxLength) { - // TODO: Improve truncation so that text from this block is given priority. - // E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not "1+2+3+4+5...". - // E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...". - text = goog.string.truncate(text, opt_maxLength); - } - return text; -}; - -/** - * Shortcut for appending a value input row. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - */ -Blockly.Block.prototype.appendValueInput = function(name) { - return this.appendInput_(Blockly.INPUT_VALUE, name); -}; - -/** - * Shortcut for appending a statement input row. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - */ -Blockly.Block.prototype.appendStatementInput = function(name) { - return this.appendInput_(Blockly.NEXT_STATEMENT, name); -}; - -/** - * Shortcut for appending a dummy input row. - * @param {string=} opt_name Language-neutral identifier which may used to find - * this input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - */ -Blockly.Block.prototype.appendDummyInput = function(opt_name) { - return this.appendInput_(Blockly.DUMMY_INPUT, opt_name || ''); -}; - -/** - * Initialize this block using a cross-platform, internationalization-friendly - * JSON description. - * @param {!Object} json Structured data describing the block. - */ -Blockly.Block.prototype.jsonInit = function(json) { - var warningPrefix = json['type'] ? 'Block "' + json['type'] + '": ' : ''; - - // Validate inputs. - goog.asserts.assert( - json['output'] == undefined || json['previousStatement'] == undefined, - warningPrefix + 'Must not have both an output and a previousStatement.'); - - // Set basic properties of block. - if (json['colour'] !== undefined) { - this.setColourFromJson_(json); - } - - // Interpolate the message blocks. - var i = 0; - while (json['message' + i] !== undefined) { - this.interpolate_(json['message' + i], json['args' + i] || [], - json['lastDummyAlign' + i]); - i++; - } - - if (json['inputsInline'] !== undefined) { - this.setInputsInline(json['inputsInline']); - } - // Set output and previous/next connections. - if (json['output'] !== undefined) { - this.setOutput(true, json['output']); - } - if (json['previousStatement'] !== undefined) { - this.setPreviousStatement(true, json['previousStatement']); - } - if (json['nextStatement'] !== undefined) { - this.setNextStatement(true, json['nextStatement']); - } - if (json['tooltip'] !== undefined) { - var rawValue = json['tooltip']; - var localizedText = Blockly.utils.replaceMessageReferences(rawValue); - this.setTooltip(localizedText); - } - if (json['enableContextMenu'] !== undefined) { - var rawValue = json['enableContextMenu']; - this.contextMenu = !!rawValue; - } - if (json['helpUrl'] !== undefined) { - var rawValue = json['helpUrl']; - var localizedValue = Blockly.utils.replaceMessageReferences(rawValue); - this.setHelpUrl(localizedValue); - } - if (goog.isString(json['extensions'])) { - console.warn('JSON attribute \'extensions\' should be an array of ' + - 'strings. Found raw string in JSON for \'' + json['type'] + '\' block.'); - json['extensions'] = [json['extensions']]; // Correct and continue. - } - - // Add the mutator to the block - if (json['mutator'] !== undefined) { - Blockly.Extensions.apply(json['mutator'], this, true); - } - - if (Array.isArray(json['extensions'])) { - var extensionNames = json['extensions']; - for (var i = 0; i < extensionNames.length; ++i) { - var extensionName = extensionNames[i]; - Blockly.Extensions.apply(extensionName, this, false); - } - } - if (json['outputShape'] !== undefined) { - this.setOutputShape(json['outputShape']); - } - if (json['checkboxInFlyout'] !== undefined) { - this.setCheckboxInFlyout(json['checkboxInFlyout']); - } - if (json['category'] !== undefined) { - this.setCategory(json['category']); - } -}; - -/** - * Add key/values from mixinObj to this block object. By default, this method - * will check that the keys in mixinObj will not overwrite existing values in - * the block, including prototype values. This provides some insurance against - * mixin / extension incompatibilities with future block features. This check - * can be disabled by passing true as the second argument. - * @param {!Object} mixinObj The key/values pairs to add to this block object. - * @param {boolean=} opt_disableCheck Option flag to disable overwrite checks. - */ -Blockly.Block.prototype.mixin = function(mixinObj, opt_disableCheck) { - if (goog.isDef(opt_disableCheck) && !goog.isBoolean(opt_disableCheck)) { - throw new Error("opt_disableCheck must be a boolean if provided"); - } - if (!opt_disableCheck) { - var overwrites = []; - for (var key in mixinObj) { - if (this[key] !== undefined) { - overwrites.push(key); - } - } - if (overwrites.length) { - throw new Error('Mixin will overwrite block members: ' + - JSON.stringify(overwrites)); - } - } - goog.mixin(this, mixinObj); -}; - -/** - * Set the colour of the block from strings or string table references. - * @param {string|?} primary Primary colour, which may be a string that contains - * string table references. - * @param {string|?} secondary Secondary colour, which may be a string that - * contains string table references. - * @param {string|?} tertiary Tertiary colour, which may be a string that - * contains string table references. - * @private - */ -Blockly.Block.prototype.setColourFromRawValues_ = function(primary, secondary, - tertiary) { - primary = goog.isString(primary) ? - Blockly.utils.replaceMessageReferences(primary) : primary; - secondary = goog.isString(secondary) ? - Blockly.utils.replaceMessageReferences(secondary) : secondary; - tertiary = goog.isString(tertiary) ? - Blockly.utils.replaceMessageReferences(tertiary) : tertiary; - - this.setColour(primary, secondary, tertiary); -}; - -/** - * Set the colour of the block from JSON, replacing message references as - * needed. - * @param {!Object} json Structured data describing the block. - * @private - */ -Blockly.Block.prototype.setColourFromJson_ = function(json) { - this.setColourFromRawValues_(json['colour'], json['colourSecondary'], - json['colourTertiary']); -}; - -/** - * Interpolate a message description onto the block. - * @param {string} message Text contains interpolation tokens (%1, %2, ...) - * that match with fields or inputs defined in the args array. - * @param {!Array} args Array of arguments to be interpolated. - * @param {string=} lastDummyAlign If a dummy input is added at the end, - * how should it be aligned? - * @private - */ -Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign) { - var tokens = Blockly.utils.tokenizeInterpolation(message); - // Interpolate the arguments. Build a list of elements. - var indexDup = []; - var indexCount = 0; - var elements = []; - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (typeof token == 'number') { - if (token <= 0 || token > args.length) { - throw new Error('Block "' + this.type + '": ' + - 'Message index %' + token + ' out of range.'); - } - if (indexDup[token]) { - throw new Error('Block "' + this.type + '": ' + - 'Message index %' + token + ' duplicated.'); - } - indexDup[token] = true; - indexCount++; - elements.push(args[token - 1]); - } else { - token = token.trim(); - if (token) { - elements.push(token); - } - } - } - if (indexCount != args.length) { - throw new Error('Block "' + this.type + '": ' + - 'Message does not reference all ' + args.length + ' arg(s).'); - } - // Add last dummy input if needed. - if (elements.length && (typeof elements[elements.length - 1] == 'string' || - goog.string.startsWith( - elements[elements.length - 1]['type'], 'field_'))) { - var dummyInput = {type: 'input_dummy'}; - if (lastDummyAlign) { - dummyInput['align'] = lastDummyAlign; - } - elements.push(dummyInput); - } - // Lookup of alignment constants. - var alignmentLookup = { - 'LEFT': Blockly.ALIGN_LEFT, - 'RIGHT': Blockly.ALIGN_RIGHT, - 'CENTRE': Blockly.ALIGN_CENTRE - }; - // Populate block with inputs and fields. - var fieldStack = []; - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - if (typeof element == 'string') { - fieldStack.push([element, undefined]); - } else { - var field = null; - var input = null; - do { - var altRepeat = false; - if (typeof element == 'string') { - field = new Blockly.FieldLabel(element); - } else { - switch (element['type']) { - case 'input_value': - input = this.appendValueInput(element['name']); - break; - case 'input_statement': - input = this.appendStatementInput(element['name']); - break; - case 'input_dummy': - input = this.appendDummyInput(element['name']); - break; - default: - field = Blockly.Field.fromJson(element); - - // Unknown field. - if (!field) { - if (element['alt']) { - element = element['alt']; - altRepeat = true; - } else { - console.warn('Blockly could not create a field of type ' + - element['type'] + - '. You may need to register your custom field. See ' + - 'github.com/google/blockly/issues/1584'); - } - } - } - } - } while (altRepeat); - if (field) { - fieldStack.push([field, element['name']]); - } else if (input) { - if (element['check']) { - input.setCheck(element['check']); - } - if (element['align']) { - input.setAlign(alignmentLookup[element['align']]); - } - for (var j = 0; j < fieldStack.length; j++) { - input.appendField(fieldStack[j][0], fieldStack[j][1]); - } - fieldStack.length = 0; - } - } - } -}; - -/** - * Add a value input, statement input or local variable to this block. - * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or - * Blockly.DUMMY_INPUT. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - * @protected - */ -Blockly.Block.prototype.appendInput_ = function(type, name) { - var connection = null; - if (type == Blockly.INPUT_VALUE || type == Blockly.NEXT_STATEMENT) { - connection = this.makeConnection_(type); - } - var input = new Blockly.Input(type, name, this, connection); - // Append input to list. - this.inputList.push(input); - return input; -}; - -/** - * Move a named input to a different location on this block. - * @param {string} name The name of the input to move. - * @param {?string} refName Name of input that should be after the moved input, - * or null to be the input at the end. - */ -Blockly.Block.prototype.moveInputBefore = function(name, refName) { - if (name == refName) { - return; - } - // Find both inputs. - var inputIndex = -1; - var refIndex = refName ? -1 : this.inputList.length; - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.name == name) { - inputIndex = i; - if (refIndex != -1) { - break; - } - } else if (refName && input.name == refName) { - refIndex = i; - if (inputIndex != -1) { - break; - } - } - } - goog.asserts.assert(inputIndex != -1, 'Named input "%s" not found.', name); - goog.asserts.assert( - refIndex != -1, 'Reference input "%s" not found.', refName); - this.moveNumberedInputBefore(inputIndex, refIndex); -}; - -/** - * Move a numbered input to a different location on this block. - * @param {number} inputIndex Index of the input to move. - * @param {number} refIndex Index of input that should be after the moved input. - */ -Blockly.Block.prototype.moveNumberedInputBefore = function( - inputIndex, refIndex) { - // Validate arguments. - goog.asserts.assert(inputIndex != refIndex, 'Can\'t move input to itself.'); - goog.asserts.assert(inputIndex < this.inputList.length, - 'Input index ' + inputIndex + ' out of bounds.'); - goog.asserts.assert(refIndex <= this.inputList.length, - 'Reference input ' + refIndex + ' out of bounds.'); - // Remove input. - var input = this.inputList[inputIndex]; - this.inputList.splice(inputIndex, 1); - if (inputIndex < refIndex) { - refIndex--; - } - // Reinsert input. - this.inputList.splice(refIndex, 0, input); -}; - -/** - * Remove an input from this block. - * @param {string} name The name of the input. - * @param {boolean=} opt_quiet True to prevent error if input is not present. - * @throws {goog.asserts.AssertionError} if the input is not present and - * opt_quiet is not true. - */ -Blockly.Block.prototype.removeInput = function(name, opt_quiet) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.name == name) { - if (input.connection && input.connection.isConnected()) { - input.connection.setShadowDom(null); - var block = input.connection.targetBlock(); - if (block.isShadow()) { - // Destroy any attached shadow block. - block.dispose(); - } else { - // Disconnect any attached normal block. - block.unplug(); - } - } - input.dispose(); - this.inputList.splice(i, 1); - return; - } - } - if (!opt_quiet) { - goog.asserts.fail('Input "%s" not found.', name); - } -}; - -/** - * Fetches the named input object. - * @param {string} name The name of the input. - * @return {Blockly.Input} The input object, or null if input does not exist. - */ -Blockly.Block.prototype.getInput = function(name) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.name == name) { - return input; - } - } - // This input does not exist. - return null; -}; - -/** - * Fetches the block attached to the named input. - * @param {string} name The name of the input. - * @return {Blockly.Block} The attached value block, or null if the input is - * either disconnected or if the input does not exist. - */ -Blockly.Block.prototype.getInputTargetBlock = function(name) { - var input = this.getInput(name); - return input && input.connection && input.connection.targetBlock(); -}; - -/** - * Returns the comment on this block (or '' if none). - * @return {string} Block's comment. - */ -Blockly.Block.prototype.getCommentText = function() { - return this.comment || ''; -}; - -/** - * Set this block's comment text. - * @param {?string} text The text, or null to delete. - */ -Blockly.Block.prototype.setCommentText = function(text) { - if (this.comment != text) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this, 'comment', null, this.comment, text || '')); - this.comment = text; - } -}; - -/** - * Set this block's output shape. - * e.g., null, OUTPUT_SHAPE_HEXAGONAL, OUTPUT_SHAPE_ROUND, OUTPUT_SHAPE_SQUARE. - * @param {?number} outputShape Value representing output shape - * (see constants.js). - */ -Blockly.Block.prototype.setOutputShape = function(outputShape) { - this.outputShape_ = outputShape; -}; - -/** - * Get this block's output shape. - * @return {?number} Value representing output shape (see constants.js). - */ -Blockly.Block.prototype.getOutputShape = function() { - return this.outputShape_; -}; - -/** - * Set this block's category (for styling purposes) - * @param {?string} category The block's category (see constants.js). - */ -Blockly.Block.prototype.setCategory = function(category) { - this.category_ = category; -}; - -/** - * Get this block's category (for styling purposes) - * @return {?string} category The block's category (see constants.js). - */ -Blockly.Block.prototype.getCategory = function() { - return this.category_; -}; - -/** - * Set whether this block has a checkbox next to it in the flyout. - * @param {boolean} hasCheckbox True if this block should have a checkbox. - */ -Blockly.Block.prototype.setCheckboxInFlyout = function(hasCheckbox) { - this.checkboxInFlyout_ = hasCheckbox; -}; - -/** - * Get whether this block has a checkbox next to it in the flyout. - * @return {boolean} True if this block should have a checkbox. - */ -Blockly.Block.prototype.hasCheckboxInFlyout = function() { - return this.checkboxInFlyout_; -}; - -/** - * Set this block's warning text. - * @param {?string} text The text, or null to delete. - * @abstract - */ -Blockly.Block.prototype.setWarningText = function(/* text */) { - // NOP. -}; - -/** - * Give this block a mutator dialog. - * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. - * @abstract - */ -Blockly.Block.prototype.setMutator = function(/* mutator */) { - // NOP. -}; - -/** - * Return the coordinates of the top-left corner of this block relative to the - * drawing surface's origin (0,0), in workspace units. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - */ -Blockly.Block.prototype.getRelativeToSurfaceXY = function() { - return this.xy_; -}; - -/** - * Move a block by a relative offset. - * @param {number} dx Horizontal offset, in workspace units. - * @param {number} dy Vertical offset, in workspace units. - */ -Blockly.Block.prototype.moveBy = function(dx, dy) { - goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); - var event = new Blockly.Events.BlockMove(this); - this.xy_.translate(dx, dy); - event.recordNew(); - Blockly.Events.fire(event); -}; - -/** - * Create a connection of the specified type. - * @param {number} type The type of the connection to create. - * @return {!Blockly.Connection} A new connection of the specified type. - * @private - */ -Blockly.Block.prototype.makeConnection_ = function(type) { - return new Blockly.Connection(this, type); -}; - -/** - * Recursively checks whether all statement and value inputs are filled with - * blocks. Also checks all following statement blocks in this stack. - * @param {boolean=} opt_shadowBlocksAreFilled An optional argument controlling - * whether shadow blocks are counted as filled. Defaults to true. - * @return {boolean} True if all inputs are filled, false otherwise. - */ -Blockly.Block.prototype.allInputsFilled = function(opt_shadowBlocksAreFilled) { - // Account for the shadow block filledness toggle. - if (opt_shadowBlocksAreFilled === undefined) { - opt_shadowBlocksAreFilled = true; - } - if (!opt_shadowBlocksAreFilled && this.isShadow()) { - return false; - } - - // Recursively check each input block of the current block. - for (var i = 0, input; input = this.inputList[i]; i++) { - if (!input.connection) { - continue; - } - var target = input.connection.targetBlock(); - if (!target || !target.allInputsFilled(opt_shadowBlocksAreFilled)) { - return false; - } - } - - // Recursively check the next block after the current block. - var next = this.getNextBlock(); - if (next) { - return next.allInputsFilled(opt_shadowBlocksAreFilled); - } - - return true; -}; - -/** - * This method returns a string describing this Block in developer terms (type - * name and ID; English only). - * - * Intended to on be used in console logs and errors. If you need a string that - * uses the user's native language (including block text, field values, and - * child blocks), use [toString()]{@link Blockly.Block#toString}. - * @return {string} The description. - */ -Blockly.Block.prototype.toDevString = function() { - var msg = this.type ? '"' + this.type + '" block' : 'Block'; - if (this.id) { - msg += ' (id="' + this.id + '")'; - } - return msg; -}; diff --git a/packages/scratch-blocks/core/block_animations.js b/packages/scratch-blocks/core/block_animations.js deleted file mode 100644 index 1e708c08f..000000000 --- a/packages/scratch-blocks/core/block_animations.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods animating a block on connection and disconnection. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.BlockAnimations'); - - -/** - * Play some UI effects (sound, animation) when disposing of a block. - * @param {!Blockly.BlockSvg} block The block being disposed of. - * @package - */ -Blockly.BlockAnimations.disposeUiEffect = function(block) { - var workspace = block.workspace; - var svgGroup = block.getSvgRoot(); - workspace.getAudioManager().play('delete'); - - var xy = workspace.getSvgXY(svgGroup); - // Deeply clone the current block. - var clone = svgGroup.cloneNode(true); - clone.translateX_ = xy.x; - clone.translateY_ = xy.y; - clone.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')'); - workspace.getParentSvg().appendChild(clone); - clone.bBox_ = clone.getBBox(); - // Start the animation. - Blockly.BlockAnimations.disposeUiStep_(clone, workspace.RTL, new Date, - workspace.scale); -}; - -/** - * Animate a cloned block and eventually dispose of it. - * This is a class method, not an instance method since the original block has - * been destroyed and is no longer accessible. - * @param {!Element} clone SVG element to animate and dispose of. - * @param {boolean} rtl True if RTL, false if LTR. - * @param {!Date} start Date of animation's start. - * @param {number} workspaceScale Scale of workspace. - * @private - */ -Blockly.BlockAnimations.disposeUiStep_ = function(clone, rtl, start, - workspaceScale) { - var ms = new Date - start; - var percent = ms / 150; - if (percent > 1) { - goog.dom.removeNode(clone); - } else { - var x = clone.translateX_ + - (rtl ? -1 : 1) * clone.bBox_.width * workspaceScale / 2 * percent; - var y = clone.translateY_ + clone.bBox_.height * workspaceScale * percent; - var scale = (1 - percent) * workspaceScale; - clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' + - ' scale(' + scale + ')'); - setTimeout(Blockly.BlockAnimations.disposeUiStep_, 10, clone, rtl, start, - workspaceScale); - } -}; - -/** - * Play some UI effects (sound, ripple) after a connection has been established. - * @param {!Blockly.BlockSvg} block The block being connected. - * @package - */ -Blockly.BlockAnimations.connectionUiEffect = function(block) { - block.workspace.getAudioManager().play('click'); -}; - -/** - * Play some UI effects (sound, animation) when disconnecting a block. - * No-op in scratch-blocks, which has no disconnect animation. - * @param {!Blockly.BlockSvg} _block The block being disconnected. - * @package - */ -Blockly.BlockAnimations.disconnectUiEffect = function( - /* eslint-disable no-unused-vars */ _block - /* eslint-enable no-unused-vars */) { -}; - -/** - * Stop the disconnect UI animation immediately. - * No-op in scratch-blocks, which has no disconnect animation. - * @package - */ -Blockly.BlockAnimations.disconnectUiStop = function() { -}; diff --git a/packages/scratch-blocks/core/block_drag_surface.js b/packages/scratch-blocks/core/block_drag_surface.js deleted file mode 100644 index d5ad04714..000000000 --- a/packages/scratch-blocks/core/block_drag_surface.js +++ /dev/null @@ -1,299 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview A class that manages a surface for dragging blocks. When a - * block drag is started, we move the block (and children) to a separate DOM - * element that we move around using translate3d. At the end of the drag, the - * blocks are put back in into the SVG they came from. This helps performance by - * avoiding repainting the entire SVG on every mouse move while dragging blocks. - * @author picklesrus - */ - -'use strict'; - -goog.provide('Blockly.BlockDragSurfaceSvg'); -goog.require('Blockly.utils'); -goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); - - -/** - * Class for a drag surface for the currently dragged block. This is a separate - * SVG that contains only the currently moving block, or nothing. - * @param {!Element} container Containing element. - * @constructor - */ -Blockly.BlockDragSurfaceSvg = function(container) { - /** - * @type {!Element} - * @private - */ - this.container_ = container; - this.createDom(); -}; - -/** - * The SVG drag surface. Set once by Blockly.BlockDragSurfaceSvg.createDom. - * @type {Element} - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.SVG_ = null; - -/** - * This is where blocks live while they are being dragged if the drag surface - * is enabled. - * @type {Element} - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.dragGroup_ = null; - -/** - * Containing HTML element; parent of the workspace and the drag surface. - * @type {Element} - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.container_ = null; - -/** - * Cached value for the scale of the drag surface. - * Used to set/get the correct translation during and after a drag. - * @type {number} - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.scale_ = 1; - -/** - * Cached value for the translation of the drag surface. - * This translation is in pixel units, because the scale is applied to the - * drag group rather than the top-level SVG. - * @type {goog.math.Coordinate} - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.surfaceXY_ = null; - -/** - * ID for the drag shadow filter, set in createDom. - * Belongs in Scratch Blocks but not Blockly. - * @type {string} - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.dragShadowFilterId_ = ''; - -/** - * Standard deviation for gaussian blur on drag shadow, in px. - * Belongs in Scratch Blocks but not Blockly. - * @type {number} - * @const - */ -Blockly.BlockDragSurfaceSvg.SHADOW_STD_DEVIATION = 6; - -/** - * Create the drag surface and inject it into the container. - */ -Blockly.BlockDragSurfaceSvg.prototype.createDom = function() { - if (this.SVG_) { - return; // Already created. - } - this.SVG_ = Blockly.utils.createSvgElement('svg', - { - 'xmlns': Blockly.SVG_NS, - 'xmlns:html': Blockly.HTML_NS, - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'class': 'blocklyBlockDragSurface' - }, this.container_); - this.dragGroup_ = Blockly.utils.createSvgElement('g', {}, this.SVG_); - // Belongs in Scratch Blocks, but not Blockly. - var defs = Blockly.utils.createSvgElement('defs', {}, this.SVG_); - this.dragShadowFilterId_ = this.createDropShadowDom_(defs); - this.dragGroup_.setAttribute( - 'filter', 'url(#' + this.dragShadowFilterId_ + ')'); -}; - -/** - * Scratch-specific: Create the SVG def for the drop shadow. - * @param {Element} defs Defs element to insert the shadow filter definition - * @return {string} ID for the filter element - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.createDropShadowDom_ = function(defs) { - var rnd = String(Math.random()).substring(2); - // Adjust these width/height, x/y properties to stop the shadow from clipping - var dragShadowFilter = Blockly.utils.createSvgElement('filter', - { - 'id': 'blocklyDragShadowFilter' + rnd, - 'height': '140%', - 'width': '140%', - 'y': '-20%', - 'x': '-20%' - }, - defs); - Blockly.utils.createSvgElement('feGaussianBlur', - { - 'in': 'SourceAlpha', - 'stdDeviation': Blockly.BlockDragSurfaceSvg.SHADOW_STD_DEVIATION - }, - dragShadowFilter); - var componentTransfer = Blockly.utils.createSvgElement( - 'feComponentTransfer', {'result': 'offsetBlur'}, dragShadowFilter); - // Shadow opacity is specified in the adjustable colour library, - // since the darkness of the shadow largely depends on the workspace colour. - Blockly.utils.createSvgElement('feFuncA', - { - 'type': 'linear', - 'slope': Blockly.Colours.dragShadowOpacity - }, - componentTransfer); - Blockly.utils.createSvgElement('feComposite', - { - 'in': 'SourceGraphic', - 'in2': 'offsetBlur', - 'operator': 'over' - }, - dragShadowFilter); - return dragShadowFilter.id; -}; - -/** - * Set the SVG blocks on the drag surface's group and show the surface. - * Only one block group should be on the drag surface at a time. - * @param {!Element} blocks Block or group of blocks to place on the drag - * surface. - */ -Blockly.BlockDragSurfaceSvg.prototype.setBlocksAndShow = function(blocks) { - goog.asserts.assert( - this.dragGroup_.childNodes.length == 0, 'Already dragging a block.'); - // appendChild removes the blocks from the previous parent - this.dragGroup_.appendChild(blocks); - this.SVG_.style.display = 'block'; - this.surfaceXY_ = new goog.math.Coordinate(0, 0); - // This allows blocks to be dragged outside of the blockly svg space. - // This should be reset to hidden at the end of the block drag. - // Note that this behavior is different from blockly where block disappear - // "under" the blockly area. - var injectionDiv = document.getElementsByClassName('injectionDiv')[0]; - injectionDiv.style.overflow = 'visible'; -}; - -/** - * Translate and scale the entire drag surface group to the given position, to - * keep in sync with the workspace. - * @param {number} x X translation in workspace coordinates. - * @param {number} y Y translation in workspace coordinates. - * @param {number} scale Scale of the group. - */ -Blockly.BlockDragSurfaceSvg.prototype.translateAndScaleGroup = function(x, y, scale) { - this.scale_ = scale; - // This is a work-around to prevent a the blocks from rendering - // fuzzy while they are being dragged on the drag surface. - var fixedX = x.toFixed(0); - var fixedY = y.toFixed(0); - this.dragGroup_.setAttribute('transform', - 'translate(' + fixedX + ',' + fixedY + ') scale(' + scale + ')'); -}; - -/** - * Translate the drag surface's SVG based on its internal state. - * @private - */ -Blockly.BlockDragSurfaceSvg.prototype.translateSurfaceInternal_ = function() { - var x = this.surfaceXY_.x; - var y = this.surfaceXY_.y; - // This is a work-around to prevent a the blocks from rendering - // fuzzy while they are being dragged on the drag surface. - x = x.toFixed(0); - y = y.toFixed(0); - this.SVG_.style.display = 'block'; - - Blockly.utils.setCssTransform(this.SVG_, - 'translate3d(' + x + 'px, ' + y + 'px, 0px)'); -}; - -/** - * Translate the entire drag surface during a drag. - * We translate the drag surface instead of the blocks inside the surface - * so that the browser avoids repainting the SVG. - * Because of this, the drag coordinates must be adjusted by scale. - * @param {number} x X translation for the entire surface. - * @param {number} y Y translation for the entire surface. - */ -Blockly.BlockDragSurfaceSvg.prototype.translateSurface = function(x, y) { - this.surfaceXY_ = new goog.math.Coordinate(x * this.scale_, y * this.scale_); - this.translateSurfaceInternal_(); -}; - -/** - * Reports the surface translation in scaled workspace coordinates. - * Use this when finishing a drag to return blocks to the correct position. - * @return {!goog.math.Coordinate} Current translation of the surface. - */ -Blockly.BlockDragSurfaceSvg.prototype.getSurfaceTranslation = function() { - var xy = Blockly.utils.getRelativeXY(this.SVG_); - return new goog.math.Coordinate(xy.x / this.scale_, xy.y / this.scale_); -}; - -/** - * Provide a reference to the drag group (primarily for - * BlockSvg.getRelativeToSurfaceXY). - * @return {Element} Drag surface group element. - */ -Blockly.BlockDragSurfaceSvg.prototype.getGroup = function() { - return this.dragGroup_; -}; - -/** - * Get the current blocks on the drag surface, if any (primarily - * for BlockSvg.getRelativeToSurfaceXY). - * @return {!Element|undefined} Drag surface block DOM element, or undefined - * if no blocks exist. - */ -Blockly.BlockDragSurfaceSvg.prototype.getCurrentBlock = function() { - return this.dragGroup_.firstChild; -}; - -/** - * Clear the group and hide the surface; move the blocks off onto the provided - * element. - * If the block is being deleted it doesn't need to go back to the original - * surface, since it would be removed immediately during dispose. - * @param {Element=} opt_newSurface Surface the dragging blocks should be moved - * to, or null if the blocks should be removed from this surface without - * being moved to a different surface. - */ -Blockly.BlockDragSurfaceSvg.prototype.clearAndHide = function(opt_newSurface) { - if (opt_newSurface) { - // appendChild removes the node from this.dragGroup_ - opt_newSurface.appendChild(this.getCurrentBlock()); - } else { - this.dragGroup_.removeChild(this.getCurrentBlock()); - } - this.SVG_.style.display = 'none'; - goog.asserts.assert( - this.dragGroup_.childNodes.length == 0, 'Drag group was not cleared.'); - this.surfaceXY_ = null; - - // Reset the overflow property back to hidden so that nothing appears outside - // of the blockly area. - // Note that this behavior is different from blockly. See note in - // setBlocksAndShow. - var injectionDiv = document.getElementsByClassName('injectionDiv')[0]; - injectionDiv.style.overflow = 'hidden'; -}; diff --git a/packages/scratch-blocks/core/block_dragger.js b/packages/scratch-blocks/core/block_dragger.js deleted file mode 100644 index e6044e903..000000000 --- a/packages/scratch-blocks/core/block_dragger.js +++ /dev/null @@ -1,418 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for dragging a block visually. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.BlockDragger'); - -goog.require('Blockly.BlockAnimations'); -goog.require('Blockly.Events.BlockMove'); -goog.require('Blockly.Events.DragBlockOutside'); -goog.require('Blockly.Events.EndBlockDrag'); -goog.require('Blockly.InsertionMarkerManager'); - -goog.require('goog.math.Coordinate'); -goog.require('goog.asserts'); - - -/** - * Class for a block dragger. It moves blocks around the workspace when they - * are being dragged by a mouse or touch. - * @param {!Blockly.BlockSvg} block The block to drag. - * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. - * @constructor - */ -Blockly.BlockDragger = function(block, workspace) { - /** - * The top block in the stack that is being dragged. - * @type {!Blockly.BlockSvg} - * @private - */ - this.draggingBlock_ = block; - - /** - * The workspace on which the block is being dragged. - * @type {!Blockly.WorkspaceSvg} - * @private - */ - this.workspace_ = workspace; - - /** - * Object that keeps track of connections on dragged blocks. - * @type {!Blockly.InsertionMarkerManager} - * @private - */ - this.draggedConnectionManager_ = new Blockly.InsertionMarkerManager( - this.draggingBlock_); - - /** - * Which delete area the mouse pointer is over, if any. - * One of {@link Blockly.DELETE_AREA_TRASH}, - * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. - * @type {?number} - * @private - */ - this.deleteArea_ = null; - - /** - * Whether the block would be deleted if dropped immediately. - * @type {boolean} - * @private - */ - this.wouldDeleteBlock_ = false; - - /** - * Whether the currently dragged block is outside of the workspace. Keep - * track so that we can fire events only when this changes. - * @type {boolean} - * @private - */ - this.wasOutside_ = false; - - /** - * The location of the top left corner of the dragging block at the beginning - * of the drag in workspace coordinates. - * @type {!goog.math.Coordinate} - * @private - */ - this.startXY_ = this.draggingBlock_.getRelativeToSurfaceXY(); - - /** - * A list of all of the icons (comment, warning, and mutator) that are - * on this block and its descendants. Moving an icon moves the bubble that - * extends from it if that bubble is open. - * @type {Array.} - * @private - */ - this.dragIconData_ = Blockly.BlockDragger.initIconData_(block); -}; - -/** - * Sever all links from this object. - * @package - */ -Blockly.BlockDragger.prototype.dispose = function() { - this.draggingBlock_ = null; - this.workspace_ = null; - this.startWorkspace_ = null; - this.dragIconData_.length = 0; - - if (this.draggedConnectionManager_) { - this.draggedConnectionManager_.dispose(); - this.draggedConnectionManager_ = null; - } -}; - -/** - * Make a list of all of the icons (comment, warning, and mutator) that are - * on this block and its descendants. Moving an icon moves the bubble that - * extends from it if that bubble is open. - * @param {!Blockly.BlockSvg} block The root block that is being dragged. - * @return {!Array.} The list of all icons and their locations. - * @private - */ -Blockly.BlockDragger.initIconData_ = function(block) { - // Build a list of icons that need to be moved and where they started. - var dragIconData = []; - var descendants = block.getDescendants(false); - for (var i = 0, descendant; descendant = descendants[i]; i++) { - var icons = descendant.getIcons(); - for (var j = 0; j < icons.length; j++) { - var data = { - // goog.math.Coordinate with x and y properties (workspace coordinates). - location: icons[j].getIconLocation(), - // Blockly.Icon - icon: icons[j] - }; - dragIconData.push(data); - } - } - return dragIconData; -}; - -/** - * Start dragging a block. This includes moving it to the drag surface. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at mouse down, in pixel units. - * @package - */ -Blockly.BlockDragger.prototype.startBlockDrag = function(currentDragDeltaXY) { - if (!Blockly.Events.getGroup()) { - Blockly.Events.setGroup(true); - } - - this.workspace_.setResizesEnabled(false); - Blockly.BlockAnimations.disconnectUiStop(); - - if (this.draggingBlock_.getParent()) { - this.draggingBlock_.unplug(); - var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); - var newLoc = goog.math.Coordinate.sum(this.startXY_, delta); - - this.draggingBlock_.translate(newLoc.x, newLoc.y); - Blockly.BlockAnimations.disconnectUiEffect(this.draggingBlock_); - } - this.draggingBlock_.setDragging(true); - // For future consideration: we may be able to put moveToDragSurface inside - // the block dragger, which would also let the block not track the block drag - // surface. - this.draggingBlock_.moveToDragSurface_(); - - var toolbox = this.workspace_.getToolbox(); - if (toolbox) { - var style = this.draggingBlock_.isDeletable() ? 'blocklyToolboxDelete' : - 'blocklyToolboxGrab'; - toolbox.addStyle(style); - } -}; - -/** - * Execute a step of block dragging, based on the given event. Update the - * display accordingly. - * @param {!Event} e The most recent move event. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @package - * @return {boolean} True if the event should be propagated, false if not. - */ -Blockly.BlockDragger.prototype.dragBlock = function(e, currentDragDeltaXY) { - var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); - var newLoc = goog.math.Coordinate.sum(this.startXY_, delta); - - this.draggingBlock_.moveDuringDrag(newLoc); - this.dragIcons_(delta); - - this.deleteArea_ = this.workspace_.isDeleteArea(e); - var isOutside = !this.workspace_.isInsideBlocksArea(e); - this.draggedConnectionManager_.update(delta, this.deleteArea_, isOutside); - if (isOutside !== this.wasOutside_) { - this.fireDragOutsideEvent_(isOutside); - this.wasOutside_ = isOutside; - } - - this.updateCursorDuringBlockDrag_(isOutside); - return isOutside; -}; - -/** - * Finish a block drag and put the block back on the workspace. - * @param {!Event} e The mouseup/touchend event. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @package - */ -Blockly.BlockDragger.prototype.endBlockDrag = function(e, currentDragDeltaXY) { - // Make sure internal state is fresh. - this.dragBlock(e, currentDragDeltaXY); - this.dragIconData_ = []; - var isOutside = this.wasOutside_; - this.fireEndDragEvent_(isOutside); - this.draggingBlock_.setMouseThroughStyle(false); - - Blockly.BlockAnimations.disconnectUiStop(); - - var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); - var newLoc = goog.math.Coordinate.sum(this.startXY_, delta); - this.draggingBlock_.moveOffDragSurface_(newLoc); - - // Scratch-specific: note possible illegal definition deletion for rollback below. - var isDeletingProcDef = this.wouldDeleteBlock_ && - (this.draggingBlock_.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE); - - var deleted = this.maybeDeleteBlock_(); - if (!deleted) { - // These are expensive and don't need to be done if we're deleting. - this.draggingBlock_.moveConnections_(delta.x, delta.y); - this.draggingBlock_.setDragging(false); - this.draggedConnectionManager_.applyConnections(); - this.draggingBlock_.render(); - this.fireMoveEvent_(); - this.draggingBlock_.scheduleSnapAndBump(); - } - this.workspace_.setResizesEnabled(true); - - var toolbox = this.workspace_.getToolbox(); - if (toolbox) { - var style = this.draggingBlock_.isDeletable() ? 'blocklyToolboxDelete' : - 'blocklyToolboxGrab'; - toolbox.removeStyle(style); - } - Blockly.Events.setGroup(false); - - if (isOutside) { - var ws = this.workspace_; - // Reset a drag to outside of scratch-blocks - setTimeout(function() { - ws.undo(); - }); - } - - // Scratch-specific: roll back deletes that create call blocks with defines. - // Have to wait for connections to be re-established, so put in setTimeout. - // Only do this if we deleted a proc def. - if (isDeletingProcDef) { - var ws = this.workspace_; - setTimeout(function() { - var allBlocks = ws.getAllBlocks(); - for (var i = 0; i < allBlocks.length; i++) { - var block = allBlocks[i]; - if (block.type == Blockly.PROCEDURES_CALL_BLOCK_TYPE) { - var procCode = block.getProcCode(); - // Check for call blocks with no associated define block. - if (!Blockly.Procedures.getDefineBlock(procCode, ws)) { - // TODO:(#1151) - alert('To delete a block definition, first remove all uses of the block'); - ws.undo(); - return; // There can only be one define deletion at a time. - } - } - } - // The proc deletion was valid, update the toolbox. - ws.refreshToolboxSelection_(); - }); - } -}; - -/** - * Fire an event when the dragged blocks move outside or back into the blocks workspace - * @param {?boolean} isOutside True if the drag is going outside the visible area. - * @private - */ -Blockly.BlockDragger.prototype.fireDragOutsideEvent_ = function(isOutside) { - var event = new Blockly.Events.DragBlockOutside(this.draggingBlock_); - event.isOutside = isOutside; - Blockly.Events.fire(event); -}; - -/** - * Fire an end drag event at the end of a block drag. - * @param {?boolean} isOutside True if the drag is going outside the visible area. - * @private - */ -Blockly.BlockDragger.prototype.fireEndDragEvent_ = function(isOutside) { - var event = new Blockly.Events.EndBlockDrag(this.draggingBlock_, isOutside); - Blockly.Events.fire(event); -}; - -/** - * Fire a move event at the end of a block drag. - * @private - */ -Blockly.BlockDragger.prototype.fireMoveEvent_ = function() { - var event = new Blockly.Events.BlockMove(this.draggingBlock_); - event.oldCoordinate = this.startXY_; - event.recordNew(); - Blockly.Events.fire(event); -}; - -/** - * Shut the trash can and, if necessary, delete the dragging block. - * Should be called at the end of a block drag. - * @return {boolean} whether the block was deleted. - * @private - */ -Blockly.BlockDragger.prototype.maybeDeleteBlock_ = function() { - var trashcan = this.workspace_.trashcan; - - if (this.wouldDeleteBlock_) { - if (trashcan) { - goog.Timer.callOnce(trashcan.close, 100, trashcan); - } - // Fire a move event, so we know where to go back to for an undo. - this.fireMoveEvent_(); - this.draggingBlock_.dispose(false, true); - } else if (trashcan) { - // Make sure the trash can is closed. - trashcan.close(); - } - return this.wouldDeleteBlock_; -}; - -/** - * Update the cursor (and possibly the trash can lid) to reflect whether the - * dragging block would be deleted if released immediately. - * @param {boolean} isOutside True if the cursor is outside of the blocks workspace - * @private - */ -Blockly.BlockDragger.prototype.updateCursorDuringBlockDrag_ = function(isOutside) { - this.wouldDeleteBlock_ = this.draggedConnectionManager_.wouldDeleteBlock(); - var trashcan = this.workspace_.trashcan; - if (this.wouldDeleteBlock_) { - this.draggingBlock_.setDeleteStyle(true); - if (this.deleteArea_ == Blockly.DELETE_AREA_TRASH && trashcan) { - trashcan.setOpen_(true); - } - } else { - this.draggingBlock_.setDeleteStyle(false); - if (trashcan) { - trashcan.setOpen_(false); - } - } - - if (isOutside) { - // Let mouse events through to GUI - this.draggingBlock_.setMouseThroughStyle(true); - } else { - this.draggingBlock_.setMouseThroughStyle(false); - } -}; - -/** - * Convert a coordinate object from pixels to workspace units, including a - * correction for mutator workspaces. - * This function does not consider differing origins. It simply scales the - * input's x and y values. - * @param {!goog.math.Coordinate} pixelCoord A coordinate with x and y values - * in css pixel units. - * @return {!goog.math.Coordinate} The input coordinate divided by the workspace - * scale. - * @private - */ -Blockly.BlockDragger.prototype.pixelsToWorkspaceUnits_ = function(pixelCoord) { - var result = new goog.math.Coordinate(pixelCoord.x / this.workspace_.scale, - pixelCoord.y / this.workspace_.scale); - if (this.workspace_.isMutator) { - // If we're in a mutator, its scale is always 1, purely because of some - // oddities in our rendering optimizations. The actual scale is the same as - // the scale on the parent workspace. - // Fix that for dragging. - var mainScale = this.workspace_.options.parentWorkspace.scale; - result = result.scale(1 / mainScale); - } - return result; -}; - -/** - * Move all of the icons connected to this drag. - * @param {!goog.math.Coordinate} dxy How far to move the icons from their - * original positions, in workspace units. - * @private - */ -Blockly.BlockDragger.prototype.dragIcons_ = function(dxy) { - // Moving icons moves their associated bubbles. - for (var i = 0; i < this.dragIconData_.length; i++) { - var data = this.dragIconData_[i]; - data.icon.setIconLocation(goog.math.Coordinate.sum(data.location, dxy)); - } -}; diff --git a/packages/scratch-blocks/core/block_events.js b/packages/scratch-blocks/core/block_events.js deleted file mode 100644 index 681b8903e..000000000 --- a/packages/scratch-blocks/core/block_events.js +++ /dev/null @@ -1,531 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Classes for all types of block events. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Events.BlockBase'); -goog.provide('Blockly.Events.BlockChange'); -goog.provide('Blockly.Events.BlockCreate'); -goog.provide('Blockly.Events.BlockDelete'); -goog.provide('Blockly.Events.BlockMove'); -goog.provide('Blockly.Events.Change'); // Deprecated. -goog.provide('Blockly.Events.Create'); // Deprecated. -goog.provide('Blockly.Events.Delete'); // Deprecated. -goog.provide('Blockly.Events.Move'); // Deprecated. - -goog.require('Blockly.Events'); -goog.require('Blockly.Events.Abstract'); - -goog.require('goog.array'); -goog.require('goog.math.Coordinate'); - - -/** - * Abstract class for a block event. - * @param {Blockly.Block} block The block this event corresponds to. - * @extends {Blockly.Events.Abstract} - * @constructor - */ -Blockly.Events.BlockBase = function(block) { - Blockly.Events.BlockBase.superClass_.constructor.call(this); - - /** - * The block id for the block this event pertains to - * @type {string} - */ - this.blockId = block.id; - this.workspaceId = block.workspace.id; -}; -goog.inherits(Blockly.Events.BlockBase, Blockly.Events.Abstract); - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.BlockBase.prototype.toJson = function() { - var json = Blockly.Events.BlockBase.superClass_.toJson.call(this); - json['blockId'] = this.blockId; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.BlockBase.prototype.fromJson = function(json) { - Blockly.Events.BlockBase.superClass_.toJson.call(this); - this.blockId = json['blockId']; -}; - -/** - * Class for a block change event. - * @param {Blockly.Block} block The changed block. Null for a blank event. - * @param {string} element One of 'field', 'comment', 'disabled', etc. - * @param {?string} name Name of input or field affected, or null. - * @param {*} oldValue Previous value of element. - * @param {*} newValue New value of element. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.Change = function(block, element, name, oldValue, newValue) { - if (!block) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.Change.superClass_.constructor.call(this, block); - this.element = element; - this.name = name; - this.oldValue = oldValue; - this.newValue = newValue; -}; -goog.inherits(Blockly.Events.Change, Blockly.Events.BlockBase); - -/** - * Class for a block change event. - * @param {Blockly.Block} block The changed block. Null for a blank event. - * @param {string} element One of 'field', 'comment', 'disabled', etc. - * @param {?string} name Name of input or field affected, or null. - * @param {*} oldValue Previous value of element. - * @param {*} newValue New value of element. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.BlockChange = Blockly.Events.Change; - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.Change.prototype.type = Blockly.Events.CHANGE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.Change.prototype.toJson = function() { - var json = Blockly.Events.Change.superClass_.toJson.call(this); - json['element'] = this.element; - if (this.name) { - json['name'] = this.name; - } - json['newValue'] = this.newValue; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.Change.prototype.fromJson = function(json) { - Blockly.Events.Change.superClass_.fromJson.call(this, json); - this.element = json['element']; - this.name = json['name']; - this.newValue = json['newValue']; -}; - -/** - * Does this event record any change of state? - * @return {boolean} False if something changed. - */ -Blockly.Events.Change.prototype.isNull = function() { - return this.oldValue == this.newValue; -}; - -/** - * Run a change event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.Change.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - var block = workspace.getBlockById(this.blockId); - if (!block) { - console.warn("Can't change non-existent block: " + this.blockId); - return; - } - if (block.mutator) { - // Close the mutator (if open) since we don't want to update it. - block.mutator.setVisible(false); - } - var value = forward ? this.newValue : this.oldValue; - switch (this.element) { - case 'field': - var field = block.getField(this.name); - if (field) { - // Run the validator for any side-effects it may have. - // The validator's opinion on validity is ignored. - field.callValidator(value); - field.setValue(value); - } else { - console.warn("Can't set non-existent field: " + this.name); - } - break; - case 'comment': - block.setCommentText(value || null); - break; - case 'collapsed': - block.setCollapsed(value); - break; - case 'disabled': - block.setDisabled(value); - break; - case 'inline': - block.setInputsInline(value); - break; - case 'mutation': - var oldMutation = ''; - if (block.mutationToDom) { - var oldMutationDom = block.mutationToDom(); - oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); - } - if (block.domToMutation) { - value = value || ''; - var dom = Blockly.Xml.textToDom('' + value + ''); - block.domToMutation(dom.firstChild); - } - Blockly.Events.fire(new Blockly.Events.Change( - block, 'mutation', null, oldMutation, value)); - break; - default: - console.warn('Unknown change type: ' + this.element); - } -}; - -/** - * Class for a block creation event. - * @param {Blockly.Block} block The created block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.Create = function(block) { - if (!block) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.Create.superClass_.constructor.call(this, block); - - if (block.workspace.rendered) { - this.xml = Blockly.Xml.blockToDomWithXY(block); - } else { - this.xml = Blockly.Xml.blockToDom(block); - } - this.ids = Blockly.Events.getDescendantIds_(block); -}; -goog.inherits(Blockly.Events.Create, Blockly.Events.BlockBase); - -/** - * Class for a block creation event. - * @param {Blockly.Block} block The created block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.BlockCreate = Blockly.Events.Create; - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.Create.prototype.type = Blockly.Events.CREATE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.Create.prototype.toJson = function() { - var json = Blockly.Events.Create.superClass_.toJson.call(this); - json['xml'] = Blockly.Xml.domToText(this.xml); - json['ids'] = this.ids; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.Create.prototype.fromJson = function(json) { - Blockly.Events.Create.superClass_.fromJson.call(this, json); - this.xml = Blockly.Xml.textToDom('' + json['xml'] + '').firstChild; - this.ids = json['ids']; -}; - -/** - * Run a creation event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.Create.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - if (forward) { - var xml = goog.dom.createDom('xml'); - xml.appendChild(this.xml); - Blockly.Xml.domToWorkspace(xml, workspace); - } else { - for (var i = 0, id; id = this.ids[i]; i++) { - var block = workspace.getBlockById(id); - if (block) { - block.dispose(false, false); - } else if (id == this.blockId) { - // Only complain about root-level block. - console.warn("Can't uncreate non-existent block: " + id); - } - } - } -}; - -/** - * Class for a block deletion event. - * @param {Blockly.Block} block The deleted block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.Delete = function(block) { - if (!block) { - return; // Blank event to be populated by fromJson. - } - if (block.getParent()) { - throw 'Connected blocks cannot be deleted.'; - } - Blockly.Events.Delete.superClass_.constructor.call(this, block); - - if (block.workspace.rendered) { - this.oldXml = Blockly.Xml.blockToDomWithXY(block); - } else { - this.oldXml = Blockly.Xml.blockToDom(block); - } - this.ids = Blockly.Events.getDescendantIds_(block); -}; -goog.inherits(Blockly.Events.Delete, Blockly.Events.BlockBase); - -/** - * Class for a block deletion event. - * @param {Blockly.Block} block The deleted block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.BlockDelete = Blockly.Events.Delete; - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.Delete.prototype.type = Blockly.Events.DELETE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.Delete.prototype.toJson = function() { - var json = Blockly.Events.Delete.superClass_.toJson.call(this); - json['ids'] = this.ids; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.Delete.prototype.fromJson = function(json) { - Blockly.Events.Delete.superClass_.fromJson.call(this, json); - this.ids = json['ids']; -}; - -/** - * Run a deletion event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.Delete.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - if (forward) { - for (var i = 0, id; id = this.ids[i]; i++) { - var block = workspace.getBlockById(id); - if (block) { - block.dispose(false, false); - } else if (id == this.blockId) { - // Only complain about root-level block. - console.warn("Can't delete non-existent block: " + id); - } - } - } else { - var xml = goog.dom.createDom('xml'); - xml.appendChild(this.oldXml); - Blockly.Xml.domToWorkspace(xml, workspace); - } -}; - -/** - * Class for a block move event. Created before the move. - * @param {Blockly.Block} block The moved block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.Move = function(block) { - if (!block) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.Move.superClass_.constructor.call(this, block); - var location = this.currentLocation_(); - this.oldParentId = location.parentId; - this.oldInputName = location.inputName; - this.oldCoordinate = location.coordinate; -}; -goog.inherits(Blockly.Events.Move, Blockly.Events.BlockBase); - -/** - * Class for a block move event. Created before the move. - * @param {Blockly.Block} block The moved block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.BlockMove = Blockly.Events.Move; - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.Move.prototype.type = Blockly.Events.MOVE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.Move.prototype.toJson = function() { - var json = Blockly.Events.Move.superClass_.toJson.call(this); - if (this.newParentId) { - json['newParentId'] = this.newParentId; - } - if (this.newInputName) { - json['newInputName'] = this.newInputName; - } - if (this.newCoordinate) { - json['newCoordinate'] = Math.round(this.newCoordinate.x) + ',' + - Math.round(this.newCoordinate.y); - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.Move.prototype.fromJson = function(json) { - Blockly.Events.Move.superClass_.fromJson.call(this, json); - this.newParentId = json['newParentId']; - this.newInputName = json['newInputName']; - if (json['newCoordinate']) { - var xy = json['newCoordinate'].split(','); - this.newCoordinate = - new goog.math.Coordinate(parseFloat(xy[0]), parseFloat(xy[1])); - } -}; - -/** - * Record the block's new location. Called after the move. - */ -Blockly.Events.Move.prototype.recordNew = function() { - var location = this.currentLocation_(); - this.newParentId = location.parentId; - this.newInputName = location.inputName; - this.newCoordinate = location.coordinate; -}; - -/** - * Returns the parentId and input if the block is connected, - * or the XY location if disconnected. - * @return {!Object} Collection of location info. - * @private - */ -Blockly.Events.Move.prototype.currentLocation_ = function() { - var workspace = Blockly.Workspace.getById(this.workspaceId); - var block = workspace.getBlockById(this.blockId); - var location = {}; - var parent = block.getParent(); - if (parent) { - location.parentId = parent.id; - var input = parent.getInputWithBlock(block); - if (input) { - location.inputName = input.name; - } - } else { - var blockXY = block.getRelativeToSurfaceXY(); - // The X position in the block move event should be the language agnostic - // position of the block. I.e. it should not be different in LTR vs. RTL. - var rtlAwareX = workspace.RTL ? workspace.getWidth() - blockXY.x : blockXY.x; - location.coordinate = new goog.math.Coordinate(rtlAwareX, blockXY.y); - } - return location; -}; - -/** - * Does this event record any change of state? - * @return {boolean} False if something changed. - */ -Blockly.Events.Move.prototype.isNull = function() { - return this.oldParentId == this.newParentId && - this.oldInputName == this.newInputName && - goog.math.Coordinate.equals(this.oldCoordinate, this.newCoordinate); -}; - -/** - * Run a move event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.Move.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - var block = workspace.getBlockById(this.blockId); - if (!block) { - console.warn("Can't move non-existent block: " + this.blockId); - return; - } - var parentId = forward ? this.newParentId : this.oldParentId; - var inputName = forward ? this.newInputName : this.oldInputName; - var coordinate = forward ? this.newCoordinate : this.oldCoordinate; - var parentBlock = null; - if (parentId) { - parentBlock = workspace.getBlockById(parentId); - if (!parentBlock) { - console.warn("Can't connect to non-existent block: " + parentId); - return; - } - } - if (block.getParent()) { - block.unplug(); - } - if (coordinate) { - var xy = block.getRelativeToSurfaceXY(); - var rtlAwareX = workspace.RTL ? workspace.getWidth() - coordinate.x : coordinate.x; - block.moveBy(rtlAwareX - xy.x, coordinate.y - xy.y); - } else { - var blockConnection = block.outputConnection || block.previousConnection; - var parentConnection; - if (inputName) { - var input = parentBlock.getInput(inputName); - if (input) { - parentConnection = input.connection; - } - } else if (blockConnection.type == Blockly.PREVIOUS_STATEMENT) { - parentConnection = parentBlock.nextConnection; - } - if (parentConnection) { - blockConnection.connect(parentConnection); - } else { - console.warn("Can't connect to non-existent input: " + inputName); - } - } -}; diff --git a/packages/scratch-blocks/core/block_render_svg_horizontal.js b/packages/scratch-blocks/core/block_render_svg_horizontal.js deleted file mode 100644 index c1c4ecce3..000000000 --- a/packages/scratch-blocks/core/block_render_svg_horizontal.js +++ /dev/null @@ -1,890 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for graphically rendering a block as SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.BlockSvg.render'); - -goog.require('Blockly.BlockSvg'); - - -// UI constants for rendering blocks. -/** -* Grid unit to pixels conversion -* @const -*/ -Blockly.BlockSvg.GRID_UNIT = 4; - -/** - * Horizontal space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_X = 3 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Vertical space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_Y = 3 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Vertical space above blocks with statements. - * @const - */ -Blockly.BlockSvg.STATEMENT_BLOCK_SPACE = 3 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Height of user inputs - * @const - */ -Blockly.BlockSvg.FIELD_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Width of user inputs - * @const - */ -Blockly.BlockSvg.FIELD_WIDTH = 12 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Editable field padding (left/right of the text). - * @const - */ -Blockly.BlockSvg.EDITABLE_FIELD_PADDING = 0; - -/** - * Minimum width of user inputs during editing - * @const - */ -Blockly.BlockSvg.FIELD_WIDTH_MIN_EDIT = 13 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Maximum width of user inputs during editing - * @const - */ -Blockly.BlockSvg.FIELD_WIDTH_MAX_EDIT = 24 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Maximum height of user inputs during editing - * @const - */ -Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Top padding of user inputs - * @const - */ -Blockly.BlockSvg.FIELD_TOP_PADDING = 0.25 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Corner radius of number inputs - * @const - */ -Blockly.BlockSvg.NUMBER_FIELD_CORNER_RADIUS = 4 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Corner radius of text inputs - * @const - */ -Blockly.BlockSvg.TEXT_FIELD_CORNER_RADIUS = 1 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Default radius for a field, in px. - * @const - */ -Blockly.BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of a block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_X = 1 / 2 * 16 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum height of a block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_Y = 16 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Width of horizontal puzzle tab. - * @const - */ -Blockly.BlockSvg.TAB_WIDTH = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Rounded corner radius. - * @const - */ -Blockly.BlockSvg.CORNER_RADIUS = 1 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Rounded corner radius. - * @const - */ -Blockly.BlockSvg.HAT_CORNER_RADIUS = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Full height of connector notch including rounded corner. - * @const - */ -Blockly.BlockSvg.NOTCH_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT + 2; - -/** - * Width of connector notch - * @const - */ -Blockly.BlockSvg.NOTCH_WIDTH = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * SVG path for drawing next/previous notch from top to bottom. - * Drawn in pixel units since Bezier control points are off the grid. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_DOWN = - 'c 0,2 1,3 2,4 ' + - 'l 4,4 ' + - 'c 1,1 2,2 2,4 ' + - 'v 12 ' + - 'c 0,2 -1,3 -2,4 ' + - 'l -4,4 ' + - 'c -1,1 -2,2 -2,4'; - -/** - * SVG path for drawing next/previous notch from bottom to top. - * Drawn in pixel units since Bezier control points are off the grid. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_UP = - 'c 0,-2 1,-3 2,-4 ' + - 'l 4,-4 ' + - 'c 1,-1 2,-2 2,-4 ' + - 'v -12 ' + - 'c 0,-2 -1,-3 -2,-4 ' + - 'l -4,-4 ' + - 'c -1,-1 -2,-2 -2,-4'; - -/** -* Width of rendered image field in px -* @const -*/ -Blockly.BlockSvg.IMAGE_FIELD_WIDTH = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** -* Height of rendered image field in px -* @const -*/ -Blockly.BlockSvg.IMAGE_FIELD_HEIGHT = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** -* y-offset of the top of the field shadow block from the bottom of the block. -* @const -*/ -Blockly.BlockSvg.FIELD_Y_OFFSET = -2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * SVG start point for drawing the top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START = - 'm ' + Blockly.BlockSvg.CORNER_RADIUS + ',0'; - -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER = - 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - '0,' + Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG start point for drawing the top-left corner. - * @const - */ -Blockly.BlockSvg.HAT_TOP_LEFT_CORNER_START = - 'm ' + Blockly.BlockSvg.HAT_CORNER_RADIUS + ',0'; -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.HAT_TOP_LEFT_CORNER = - 'A ' + Blockly.BlockSvg.HAT_CORNER_RADIUS + ',' + - Blockly.BlockSvg.HAT_CORNER_RADIUS + ' 0 0,0 ' + - '0,' + Blockly.BlockSvg.HAT_CORNER_RADIUS; - -/** - * @type {Object} An object containing computed measurements of this block. - * @private - */ -Blockly.BlockSvg.renderingMetrics_ = null; - -/** - * Max text display length for a field (per-horizontal/vertical) - * @const - */ -Blockly.BlockSvg.MAX_DISPLAY_LENGTH = 4; - -/** - * Point size of text field before animation. Must match size in CSS. - * See implementation in field_textinput. - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_FONTSIZE_INITIAL = 12; - -/** - * Point size of text field after animation. - * See implementation in field_textinput. - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_FONTSIZE_FINAL = 14; - -/** - * Whether text fields are allowed to expand past their truncated block size. - * @const{boolean} - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_EXPAND_PAST_TRUNCATION = true; - -/** - * Whether text fields should animate their positioning. - * @const{boolean} - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_ANIMATE_POSITIONING = true; - -/** - * @param {!Object} first An object containing computed measurements of a - * block. - * @param {!Object} second Another object containing computed measurements of a - * block. - * @return {boolean} Whether the two sets of metrics are equivalent. - * @private - */ -Blockly.BlockSvg.metricsAreEquivalent_ = function(first, second) { - if (first.statement != second.statement) { - return false; - } - if (first.imageField != second.imageField) { - return false; - } - - if ((first.height != second.height) || - (first.width != second.width) || - (first.bayHeight != second.bayHeight) || - (first.bayWidth != second.bayWidth) || - (first.fieldRadius != second.fieldRadius) || - (first.startHat != second.startHat)) { - return false; - } - return true; -}; - -/** - * Play some UI effects (sound) after a connection has been established. - */ -Blockly.BlockSvg.prototype.connectionUiEffect = function() { - this.workspace.getAudioManager().play('click'); -}; - -/** - * Change the colour of a block. - */ -Blockly.BlockSvg.prototype.updateColour = function() { - var fillColour = (this.isGlowing_) ? this.getColourSecondary() : this.getColour(); - var strokeColour = this.getColourTertiary(); - - // Render block stroke - this.svgPath_.setAttribute('stroke', strokeColour); - - // Render block fill - var fillColour = (this.isGlowingBlock_) ? this.getColourSecondary() : this.getColour(); - this.svgPath_.setAttribute('fill', fillColour); - - // Render opacity - this.svgPath_.setAttribute('fill-opacity', this.getOpacity()); - - // Bump every dropdown to change its colour. - for (var x = 0, input; input = this.inputList[x]; x++) { - for (var y = 0, field; field = input.fieldRow[y]; y++) { - field.setText(null); - } - } -}; - -/** - * Visual effect to show that if the dragging block is dropped, this block will - * be replaced. If a shadow block it will disappear. Otherwise it will bump. - * @param {boolean} add True if highlighting should be added. - */ -Blockly.BlockSvg.prototype.highlightForReplacement = function(add) { - if (add) { - var replacementGlowFilterId = this.workspace.options.replacementGlowFilterId - || 'blocklyReplacementGlowFilter'; - this.svgPath_.setAttribute('filter', 'url(#' + replacementGlowFilterId + ')'); - Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyReplaceable'); - } else { - this.svgPath_.removeAttribute('filter'); - Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyReplaceable'); - } -}; - -/** - * Returns a bounding box describing the dimensions of this block - * and any blocks stacked below it. - * @param {boolean=} opt_ignoreFields True if we should ignore fields in the - * size calculation, and just give the size of the base block(s). - * @return {!{height: number, width: number}} Object with height and width properties. - */ -Blockly.BlockSvg.prototype.getHeightWidth = function(opt_ignoreFields) { - var height = this.height; - var width = this.width; - // Add the size of the field shadow block. - if (!opt_ignoreFields && this.getFieldShadowBlock_()) { - height += Blockly.BlockSvg.FIELD_Y_OFFSET; - height += Blockly.BlockSvg.FIELD_HEIGHT; - } - // Recursively add size of subsequent blocks. - var nextBlock = this.getNextBlock(); - if (nextBlock) { - var nextHeightWidth = nextBlock.getHeightWidth(opt_ignoreFields); - width += nextHeightWidth.width; - width -= Blockly.BlockSvg.NOTCH_WIDTH; // Exclude width of connected notch. - height = Math.max(height, nextHeightWidth.height); - } - return {height: height, width: width}; -}; - -/** - * Render the block. - * Lays out and reflows a block based on its contents and settings. - * @param {boolean=} opt_bubble If false, just render this block. - * If true, also render block's parent, grandparent, etc. Defaults to true. - */ -Blockly.BlockSvg.prototype.render = function(opt_bubble) { - Blockly.Field.startCache(); - this.rendered = true; - - var oldMetrics = this.renderingMetrics_; - var metrics = this.renderCompute_(); - - // Don't redraw if we don't need to. - if (oldMetrics && - Blockly.BlockSvg.metricsAreEquivalent_(oldMetrics, metrics)) { - // Skipping the redraw is fine, but we may still have to tighten up our - // connections with child blocks. - if (metrics.statement && metrics.statement.connection && - metrics.statement.targetConnection) { - metrics.statement.connection.tighten_(); - } - if (this.nextConnection && this.nextConnection.targetConnection) { - this.nextConnection.tighten_(); - } - } else { - this.height = metrics.height; - this.width = metrics.width; - this.renderDraw_(metrics); - this.renderClassify_(metrics); - this.renderingMetrics_ = metrics; - } - - if (opt_bubble !== false) { - // Render all blocks above this one (propagate a reflow). - var parentBlock = this.getParent(); - if (parentBlock) { - parentBlock.render(true); - } else { - // Top-most block. Fire an event to allow scrollbars to resize. - Blockly.resizeSvgContents(this.workspace); - } - } - Blockly.Field.stopCache(); -}; - -/** - * Computes the height and widths for each row and field. - * @return {!Array.>} 2D array of objects, each containing - * position information. - * @private - */ -Blockly.BlockSvg.prototype.renderCompute_ = function() { - var metrics = { - statement: null, - imageField: null, - iconMenu: null, - width: 0, - height: 0, - bayHeight: 0, - bayWidth: 0, - bayNotchAtRight: true, - fieldRadius: 0, - startHat: false, - endCap: false - }; - - // Does block have a statement? - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.type == Blockly.NEXT_STATEMENT) { - metrics.statement = input; - // Compute minimum input size. - metrics.bayHeight = Blockly.BlockSvg.MIN_BLOCK_Y; - metrics.bayWidth = Blockly.BlockSvg.MIN_BLOCK_X; - // Expand input size if there is a connection. - if (input.connection && input.connection.targetConnection) { - var linkedBlock = input.connection.targetBlock(); - var bBox = linkedBlock.getHeightWidth(true); - metrics.bayHeight = Math.max(metrics.bayHeight, bBox.height); - metrics.bayWidth = Math.max(metrics.bayWidth, bBox.width); - } - var linkedBlock = input.connection.targetBlock(); - if (linkedBlock && !linkedBlock.lastConnectionInStack()) { - metrics.bayNotchAtRight = false; - } else { - metrics.bayWidth -= Blockly.BlockSvg.NOTCH_WIDTH; - } - } - - // Find image field, input fields - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field instanceof Blockly.FieldImage) { - metrics.imageField = field; - } - if (field instanceof Blockly.FieldIconMenu) { - metrics.iconMenu = field; - } - if (field instanceof Blockly.FieldTextInput) { - metrics.fieldRadius = field.getBorderRadius(); - } else { - metrics.fieldRadius = Blockly.BlockSvg.FIELD_DEFAULT_CORNER_RADIUS; - } - } - } - - // Determine whether a block is a start hat or end cap by checking connections. - if (this.nextConnection && !this.previousConnection) { - metrics.startHat = true; - } - - // End caps have no bay, a previous, no output, and no next. - if (!this.nextConnection && this.previousConnection && - !this.outputConnection && !metrics.statement) { - metrics.endCap = true; - } - - // If this block is an icon menu shadow, attempt to set the parent's - // ImageField src to the one that represents the current value of the field. - if (metrics.iconMenu) { - var currentSrc = metrics.iconMenu.getSrcForValue(metrics.iconMenu.getValue()); - if (currentSrc) { - metrics.iconMenu.setParentFieldImage(currentSrc); - } - } - - // Always render image field at 40x40 px - // Normal block sizing - metrics.width = Blockly.BlockSvg.SEP_SPACE_X * 2 + Blockly.BlockSvg.IMAGE_FIELD_WIDTH; - metrics.height = Blockly.BlockSvg.SEP_SPACE_Y * 2 + Blockly.BlockSvg.IMAGE_FIELD_HEIGHT; - - if (this.outputConnection) { - // Field shadow block - metrics.height = Blockly.BlockSvg.FIELD_HEIGHT; - metrics.width = Blockly.BlockSvg.FIELD_WIDTH; - } - if (metrics.statement) { - // Block with statement (e.g., repeat, forever) - metrics.width += metrics.bayWidth + 4 * Blockly.BlockSvg.CORNER_RADIUS + 2 * Blockly.BlockSvg.GRID_UNIT; - metrics.height = metrics.bayHeight + Blockly.BlockSvg.STATEMENT_BLOCK_SPACE; - } - if (metrics.startHat) { - // Start hats are 1 unit wider to account for optical effect of curve. - metrics.width += 1 * Blockly.BlockSvg.GRID_UNIT; - } - if (metrics.endCap) { - // End caps are 1 unit wider to account for optical effect of no notch. - metrics.width += 1 * Blockly.BlockSvg.GRID_UNIT; - } - return metrics; -}; - - -/** - * Draw the path of the block. - * Move the fields to the correct locations. - * @param {!Object} metrics An object containing computed measurements of the - * block. - * @private - */ -Blockly.BlockSvg.prototype.renderDraw_ = function(metrics) { - // Fetch the block's coordinates on the surface for use in anchoring - // the connections. - var connectionsXY = this.getRelativeToSurfaceXY(); - // Assemble the block's path. - var steps = []; - - this.renderDrawLeft_(steps, connectionsXY, metrics); - this.renderDrawBottom_(steps, connectionsXY, metrics); - this.renderDrawRight_(steps, connectionsXY, metrics); - this.renderDrawTop_(steps, connectionsXY, metrics); - - var pathString = steps.join(' '); - this.svgPath_.setAttribute('d', pathString); - - if (this.RTL) { - // Mirror the block's path. - // This is awesome. - this.svgPath_.setAttribute('transform', 'scale(-1 1)'); - } - - // Horizontal blocks have a single Image Field that is specially positioned - if (metrics.imageField) { - var imageField = metrics.imageField.getSvgRoot(); - var imageFieldSize = metrics.imageField.getSize(); - // Image field's position is calculated relative to the "end" edge of the - // block. - var imageFieldX = metrics.width - imageFieldSize.width - - Blockly.BlockSvg.SEP_SPACE_X / 1.5; - var imageFieldY = metrics.height - imageFieldSize.height - - Blockly.BlockSvg.SEP_SPACE_Y; - if (metrics.endCap) { - // End-cap image is offset by a grid unit to account for optical effect of no notch. - imageFieldX -= Blockly.BlockSvg.GRID_UNIT; - } - var imageFieldScale = "scale(1 1)"; - if (this.RTL) { - // Do we want to mirror the Image Field left-to-right? - if (metrics.imageField.getFlipRTL()) { - imageFieldScale = "scale(-1 1)"; - imageFieldX = -metrics.width + imageFieldSize.width + - Blockly.BlockSvg.SEP_SPACE_X / 1.5; - } else { - // If not, don't offset by imageFieldSize.width - imageFieldX = -metrics.width + Blockly.BlockSvg.SEP_SPACE_X / 1.5; - } - } - if (imageField) { - // Fields are invisible on insertion marker. - if (this.isInsertionMarker()) { - imageField.setAttribute('display', 'none'); - } - imageField.setAttribute('transform', - 'translate(' + imageFieldX + ',' + imageFieldY + ') ' + - imageFieldScale); - } - } - - // Position value input - if (this.getFieldShadowBlock_()) { - var input = this.getFieldShadowBlock_().getSvgRoot(); - var valueX = (Blockly.BlockSvg.NOTCH_WIDTH + - (metrics.bayWidth ? 2 * Blockly.BlockSvg.GRID_UNIT + - Blockly.BlockSvg.NOTCH_WIDTH * 2 : 0) + metrics.bayWidth); - if (metrics.startHat) { - // Start hats add some left margin to field for visual balance - valueX += Blockly.BlockSvg.GRID_UNIT * 2; - } - if (this.RTL) { - valueX = -valueX; - } - var valueY = (metrics.height + Blockly.BlockSvg.FIELD_Y_OFFSET); - var transformation = 'translate(' + valueX + ',' + valueY + ')'; - input.setAttribute('transform', transformation); - } -}; - -/** - * Give the block an attribute 'data-shapes' that lists its shape[s], and an - * attribute 'data-category' with its category. - * @param {!Object} metrics An object containing computed measurements of the - * block. - * @private - */ -Blockly.BlockSvg.prototype.renderClassify_ = function(metrics) { - var shapes = []; - - if (this.isShadow_) { - shapes.push('argument'); - } else { - if(metrics.statement) { - shapes.push('c-block'); - } - if (metrics.startHat) { - shapes.push('hat'); // c-block+hats are possible (e.x. reprter procedures) - } else if (!metrics.statement) { - shapes.push('stack'); //only call it "stack" if it's not a c-block - } - if (!this.nextConnection) { - shapes.push('end'); - } - } - - this.svgGroup_.setAttribute('data-shapes', shapes.join(' ')); - - if (this.getCategory()) { - this.svgGroup_.setAttribute('data-category', this.getCategory()); - } -}; - -/** - * Render the left edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Object} connectionsXY Location of block. - * @param {!Object} metrics An object containing computed measurements of the - * block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawLeft_ = function(steps, connectionsXY, metrics) { - // Top edge. - if (metrics.startHat) { - // Hat block - // Position the cursor at the top-left starting point. - steps.push(Blockly.BlockSvg.HAT_TOP_LEFT_CORNER_START); - // Top-left rounded corner. - steps.push(Blockly.BlockSvg.HAT_TOP_LEFT_CORNER); - } else if (this.previousConnection) { - // Regular block - // Position the cursor at the top-left starting point. - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); - // Top-left rounded corner. - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); - var cursorY = metrics.height - Blockly.BlockSvg.CORNER_RADIUS - - Blockly.BlockSvg.SEP_SPACE_Y - Blockly.BlockSvg.NOTCH_HEIGHT; - steps.push('V', cursorY); - steps.push(Blockly.BlockSvg.NOTCH_PATH_DOWN); - // Create previous block connection. - var connectionX = connectionsXY.x; - var connectionY = connectionsXY.y + metrics.height - - Blockly.BlockSvg.CORNER_RADIUS * 2; - this.previousConnection.moveTo(connectionX, connectionY); - // This connection will be tightened when the parent renders. - steps.push('V', metrics.height - Blockly.BlockSvg.CORNER_RADIUS); - } else { - // Input - // Position the cursor at the top-left starting point. - steps.push('m', metrics.fieldRadius + ',0'); - // Top-left rounded corner. - steps.push( - 'A', metrics.fieldRadius + ',' + metrics.fieldRadius, - '0', '0,0', '0,' + metrics.fieldRadius); - steps.push( - 'V', metrics.height - metrics.fieldRadius); - } -}; - -/** - * Render the bottom edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Object} connectionsXY Location of block. - * @param {!Object} metrics An object containing computed measurements of the - * block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawBottom_ = function(steps, - connectionsXY, metrics) { - - if (metrics.startHat) { - steps.push('a', Blockly.BlockSvg.HAT_CORNER_RADIUS + ',' + - Blockly.BlockSvg.HAT_CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.HAT_CORNER_RADIUS + ',' + - Blockly.BlockSvg.HAT_CORNER_RADIUS); - } else if (this.previousConnection) { - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS); - } else { - // Input - steps.push( - 'a', metrics.fieldRadius + ',' + metrics.fieldRadius, - '0', '0,0', metrics.fieldRadius + ',' + metrics.fieldRadius); - } - - // Has statement - if (metrics.statement) { - steps.push('h', 4 * Blockly.BlockSvg.GRID_UNIT); - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS); - steps.push('v', -2.5 * Blockly.BlockSvg.GRID_UNIT); - steps.push(Blockly.BlockSvg.NOTCH_PATH_UP); - // @todo Why 3? - steps.push('v', -metrics.bayHeight + (Blockly.BlockSvg.CORNER_RADIUS * 3) + - Blockly.BlockSvg.NOTCH_HEIGHT + 2 * Blockly.BlockSvg.GRID_UNIT); - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS); - steps.push('h', metrics.bayWidth - (Blockly.BlockSvg.CORNER_RADIUS * 2)); - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS); - if (metrics.bayNotchAtRight) { - steps.push('v', metrics.bayHeight - (Blockly.BlockSvg.CORNER_RADIUS * 3) - - Blockly.BlockSvg.NOTCH_HEIGHT - 2 * Blockly.BlockSvg.GRID_UNIT); - steps.push(Blockly.BlockSvg.NOTCH_PATH_DOWN); - } - steps.push('V', metrics.bayHeight + 2 * Blockly.BlockSvg.GRID_UNIT); - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS); - - // Create statement connection. - var connectionX = connectionsXY.x + Blockly.BlockSvg.CORNER_RADIUS * 2 + - 4 * Blockly.BlockSvg.GRID_UNIT; - if (this.RTL) { - connectionX = connectionsXY.x - Blockly.BlockSvg.CORNER_RADIUS * 2 - - 4 * Blockly.BlockSvg.GRID_UNIT; - } - var connectionY = connectionsXY.y + metrics.height - - Blockly.BlockSvg.CORNER_RADIUS * 2; - metrics.statement.connection.moveTo(connectionX, connectionY); - if (metrics.statement.connection.targetConnection) { - metrics.statement.connection.tighten_(); - } - } - - if (!this.isShadow()) { - steps.push('H', metrics.width - Blockly.BlockSvg.CORNER_RADIUS); - } else { - // input - steps.push('H', metrics.width - metrics.fieldRadius); - } -}; - -/** - * Render the right edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Object} connectionsXY Location of block. - * @param {!Object} metrics An object containing computed measurements of the - * block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, connectionsXY, metrics) { - if (!this.isShadow()) { - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS); - steps.push('v', -2.5 * Blockly.BlockSvg.GRID_UNIT); - } else { - // Input - steps.push( - 'a', metrics.fieldRadius + ',' + metrics.fieldRadius, - '0', '0,0', metrics.fieldRadius + ',' + -1 * metrics.fieldRadius); - steps.push('v', -1 * (metrics.height - metrics.fieldRadius * 2)); - } - - if (this.nextConnection) { - steps.push(Blockly.BlockSvg.NOTCH_PATH_UP); - - // Include width of notch in block width. - this.width += Blockly.BlockSvg.NOTCH_WIDTH; - - // Create next block connection. - var connectionX; - if (this.RTL) { - connectionX = connectionsXY.x - metrics.width; - } else { - connectionX = connectionsXY.x + metrics.width; - } - var connectionY = connectionsXY.y + metrics.height - - Blockly.BlockSvg.CORNER_RADIUS * 2; - this.nextConnection.moveTo(connectionX, connectionY); - if (this.nextConnection.targetConnection) { - this.nextConnection.tighten_(); - } - steps.push('V', Blockly.BlockSvg.CORNER_RADIUS); - } else if (!this.isShadow()) { - steps.push('V', Blockly.BlockSvg.CORNER_RADIUS); - } -}; - -/** - * Render the top edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Object} connectionsXY Location of block. - * @param {!Object} metrics An object containing computed measurements of the - * block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawTop_ = function(steps, connectionsXY, metrics) { - if (!this.isShadow()) { - steps.push('a', Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS); - } else { - steps.push( - 'a', metrics.fieldRadius + ',' + metrics.fieldRadius, - '0', '0,0', '-' + metrics.fieldRadius + ',-' + metrics.fieldRadius); - } - steps.push('z'); -}; - -/** - * Get the field shadow block, if this block has one. - *

This is horizontal Scratch-specific, as "fields" are implemented as inputs - * with shadow blocks, and there is only one per block. - * @return {Blockly.BlockSvg} The field shadow block, or null if not found. - * @private - */ -Blockly.BlockSvg.prototype.getFieldShadowBlock_ = function() { - for (var i = 0, child; child = this.childBlocks_[i]; i++) { - if (child.isShadow()) { - return child; - } - } - - return null; -}; - -/** - * Position an new block correctly, so that it doesn't move the existing block - * when connected to it. - * @param {!Blockly.Block} newBlock The block to position - either the first - * block in a dragged stack or an insertion marker. - * @param {!Blockly.Connection} newConnection The connection on the new block's - * stack - either a connection on newBlock, or the last NEXT_STATEMENT - * connection on the stack if the stack's being dropped before another - * block. - * @param {!Blockly.Connection} existingConnection The connection on the - * existing block, which newBlock should line up with. - */ -Blockly.BlockSvg.prototype.positionNewBlock = function(newBlock, newConnection, existingConnection) { - // We only need to position the new block if it's before the existing one, - // otherwise its position is set by the previous block. - if (newConnection.type == Blockly.NEXT_STATEMENT) { - var dx = existingConnection.x_ - newConnection.x_; - var dy = existingConnection.y_ - newConnection.y_; - - // When putting a c-block around another c-block, the outer block must - // positioned above the inner block, as its connection point will stretch - // downwards when connected. - if (newConnection == newBlock.getFirstStatementConnection()) { - dy -= existingConnection.sourceBlock_.getHeightWidth(true).height - - Blockly.BlockSvg.MIN_BLOCK_Y; - } - - newBlock.moveBy(dx, dy); - } -}; diff --git a/packages/scratch-blocks/core/block_render_svg_vertical.js b/packages/scratch-blocks/core/block_render_svg_vertical.js deleted file mode 100644 index ca5ea470f..000000000 --- a/packages/scratch-blocks/core/block_render_svg_vertical.js +++ /dev/null @@ -1,1732 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for graphically rendering a block as SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.BlockSvg.render'); - -goog.require('Blockly.BlockSvg'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.utils'); - - -// UI constants for rendering blocks. -/** -* Grid unit to pixels conversion -* @const -*/ -Blockly.BlockSvg.GRID_UNIT = 4; - -/** - * Horizontal space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_X = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Vertical space between elements. - * @const - */ -Blockly.BlockSvg.SEP_SPACE_Y = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of a block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_X = 16 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of a block with output (reporters). - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_X_OUTPUT = 12 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of a shadow block with output (single fields). - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_X_SHADOW_OUTPUT = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum height of a block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_Y = 12 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Height of extra row after a statement input. - * @const - */ -Blockly.BlockSvg.EXTRA_STATEMENT_ROW_Y = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of a C- or E-shaped block. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_X_WITH_STATEMENT = 40 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum height of a shadow block with output and a single field. - * This is used for shadow blocks that only contain a field - which are smaller than even reporters. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_Y_SINGLE_FIELD_OUTPUT = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum height of a non-shadow block with output, i.e. a reporter. - * @const - */ -Blockly.BlockSvg.MIN_BLOCK_Y_REPORTER = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum space for a statement input height. - * @const - */ -Blockly.BlockSvg.MIN_STATEMENT_INPUT_HEIGHT = 6 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Width of vertical notch. - * @const - */ -Blockly.BlockSvg.NOTCH_WIDTH = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Height of vertical notch. - * @const - */ -Blockly.BlockSvg.NOTCH_HEIGHT = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Rounded corner radius. - * @const - */ -Blockly.BlockSvg.CORNER_RADIUS = 1 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of statement input edge on the left, in px. - * @const - */ -Blockly.BlockSvg.STATEMENT_INPUT_EDGE_WIDTH = 4 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Inner space between edge of statement input and notch. - * @const - */ -Blockly.BlockSvg.STATEMENT_INPUT_INNER_SPACE = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Height of the top hat. - * @const - */ -Blockly.BlockSvg.START_HAT_HEIGHT = 16; - -/** - * Height of the vertical separator line for icons that appear at the left edge - * of a block, such as extension icons. - * @const - */ -Blockly.BlockSvg.ICON_SEPARATOR_HEIGHT = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Path of the top hat's curve. - * @const - */ -Blockly.BlockSvg.START_HAT_PATH = 'c 25,-22 71,-22 96,0'; - -/** - * SVG path for drawing next/previous notch from left to right. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_LEFT = ( - 'c 2,0 3,1 4,2 ' + - 'l 4,4 ' + - 'c 1,1 2,2 4,2 ' + - 'h 12 ' + - 'c 2,0 3,-1 4,-2 ' + - 'l 4,-4 ' + - 'c 1,-1 2,-2 4,-2' -); - -/** - * SVG path for drawing next/previous notch from right to left. - * @const - */ -Blockly.BlockSvg.NOTCH_PATH_RIGHT = ( - 'c -2,0 -3,1 -4,2 ' + - 'l -4,4 ' + - 'c -1,1 -2,2 -4,2 ' + - 'h -12 ' + - 'c -2,0 -3,-1 -4,-2 ' + - 'l -4,-4 ' + - 'c -1,-1 -2,-2 -4,-2' -); - -/** - * Amount of padding before the notch. - * @const - */ -Blockly.BlockSvg.NOTCH_START_PADDING = 3 * Blockly.BlockSvg.GRID_UNIT; - -/** - * SVG start point for drawing the top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_START = - 'm 0,' + Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER = - 'A ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',0'; - -/** - * SVG path for drawing the rounded top-right corner. - * @const - */ -Blockly.BlockSvg.TOP_RIGHT_CORNER = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG path for drawing the rounded bottom-right corner. - * @const - */ -Blockly.BlockSvg.BOTTOM_RIGHT_CORNER = - ' a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG path for drawing the rounded bottom-left corner. - * @const - */ -Blockly.BlockSvg.BOTTOM_LEFT_CORNER = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,1 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',-' + - Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG path for drawing the top-left corner of a statement input. - * @const - */ -Blockly.BlockSvg.INNER_TOP_LEFT_CORNER = - ' a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 -' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG path for drawing the bottom-left corner of a statement input. - * Includes the rounded inside corner. - * @const - */ -Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER = - 'a ' + Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS + ' 0 0,0 ' + - Blockly.BlockSvg.CORNER_RADIUS + ',' + - Blockly.BlockSvg.CORNER_RADIUS; - -/** - * SVG path for an empty hexagonal input shape. - * @const - */ -Blockly.BlockSvg.INPUT_SHAPE_HEXAGONAL = - 'M ' + 4 * Blockly.BlockSvg.GRID_UNIT + ',0 ' + - ' h ' + 4 * Blockly.BlockSvg.GRID_UNIT + - ' l ' + 4 * Blockly.BlockSvg.GRID_UNIT + ',' + 4 * Blockly.BlockSvg.GRID_UNIT + - ' l ' + -4 * Blockly.BlockSvg.GRID_UNIT + ',' + 4 * Blockly.BlockSvg.GRID_UNIT + - ' h ' + -4 * Blockly.BlockSvg.GRID_UNIT + - ' l ' + -4 * Blockly.BlockSvg.GRID_UNIT + ',' + -4 * Blockly.BlockSvg.GRID_UNIT + - ' l ' + 4 * Blockly.BlockSvg.GRID_UNIT + ',' + -4 * Blockly.BlockSvg.GRID_UNIT + - ' z'; - -/** - * Width of empty boolean input shape. - * @const - */ -Blockly.BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH = 12 * Blockly.BlockSvg.GRID_UNIT; - -/** - * SVG path for an empty square input shape. - * @const - */ -Blockly.BlockSvg.INPUT_SHAPE_SQUARE = - Blockly.BlockSvg.TOP_LEFT_CORNER_START + - Blockly.BlockSvg.TOP_LEFT_CORNER + - ' h ' + (12 * Blockly.BlockSvg.GRID_UNIT - 2 * Blockly.BlockSvg.CORNER_RADIUS) + - Blockly.BlockSvg.TOP_RIGHT_CORNER + - ' v ' + (8 * Blockly.BlockSvg.GRID_UNIT - 2 * Blockly.BlockSvg.CORNER_RADIUS) + - Blockly.BlockSvg.BOTTOM_RIGHT_CORNER + - ' h ' + (-12 * Blockly.BlockSvg.GRID_UNIT + 2 * Blockly.BlockSvg.CORNER_RADIUS) + - Blockly.BlockSvg.BOTTOM_LEFT_CORNER + - ' z'; - -/** - * Width of empty square input shape. - * @const - */ -Blockly.BlockSvg.INPUT_SHAPE_SQUARE_WIDTH = 10 * Blockly.BlockSvg.GRID_UNIT; - -/** - * SVG path for an empty round input shape. - * @const - */ - -Blockly.BlockSvg.INPUT_SHAPE_ROUND = - 'M ' + (4 * Blockly.BlockSvg.GRID_UNIT) + ',0' + - ' h ' + (4 * Blockly.BlockSvg.GRID_UNIT) + - ' a ' + (4 * Blockly.BlockSvg.GRID_UNIT) + ' ' + - (4 * Blockly.BlockSvg.GRID_UNIT) + ' 0 0 1 0 ' + (8 * Blockly.BlockSvg.GRID_UNIT) + - ' h ' + (-4 * Blockly.BlockSvg.GRID_UNIT) + - ' a ' + (4 * Blockly.BlockSvg.GRID_UNIT) + ' ' + - (4 * Blockly.BlockSvg.GRID_UNIT) + ' 0 0 1 0 -' + (8 * Blockly.BlockSvg.GRID_UNIT) + - ' z'; - -/** - * Width of empty round input shape. - * @const - */ -Blockly.BlockSvg.INPUT_SHAPE_ROUND_WIDTH = 12 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Height of empty input shape. - * @const - */ -Blockly.BlockSvg.INPUT_SHAPE_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Height of user inputs - * @const - */ -Blockly.BlockSvg.FIELD_HEIGHT = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Width of user inputs - * @const - */ -Blockly.BlockSvg.FIELD_WIDTH = 6 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Editable field padding (left/right of the text). - * @const - */ -Blockly.BlockSvg.EDITABLE_FIELD_PADDING = 6; - -/** - * Square box field padding (left/right of the text). - * @const - */ -Blockly.BlockSvg.BOX_FIELD_PADDING = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Drop-down arrow padding. - * @const - */ -Blockly.BlockSvg.DROPDOWN_ARROW_PADDING = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Minimum width of user inputs during editing - * @const - */ -Blockly.BlockSvg.FIELD_WIDTH_MIN_EDIT = 8 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Maximum width of user inputs during editing - * @const - */ -Blockly.BlockSvg.FIELD_WIDTH_MAX_EDIT = Infinity; - -/** - * Maximum height of user inputs during editing - * @const - */ -Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT = Blockly.BlockSvg.FIELD_HEIGHT; - -/** - * Top padding of user inputs - * @const - */ -Blockly.BlockSvg.FIELD_TOP_PADDING = 0.5 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Corner radius of number inputs - * @const - */ -Blockly.BlockSvg.NUMBER_FIELD_CORNER_RADIUS = 4 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Corner radius of text inputs - * @const - */ -Blockly.BlockSvg.TEXT_FIELD_CORNER_RADIUS = 1 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Default radius for a field, in px. - * @const - */ -Blockly.BlockSvg.FIELD_DEFAULT_CORNER_RADIUS = 4 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Max text display length for a field (per-horizontal/vertical) - * @const - */ -Blockly.BlockSvg.MAX_DISPLAY_LENGTH = Infinity; - -/** - * Minimum X of inputs and fields for blocks with a previous connection. - * Ensures that inputs will not overlap with the top notch of blocks. - * @const - */ -Blockly.BlockSvg.INPUT_AND_FIELD_MIN_X = 12 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Vertical padding around inline elements. - * @const - */ -Blockly.BlockSvg.INLINE_PADDING_Y = 1 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Point size of text field before animation. Must match size in CSS. - * See implementation in field_textinput. - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_FONTSIZE_INITIAL = 12; - -/** - * Point size of text field after animation. - * See implementation in field_textinput. - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_FONTSIZE_FINAL = 12; - -/** - * Whether text fields are allowed to expand past their truncated block size. - * @const{boolean} - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_EXPAND_PAST_TRUNCATION = false; - -/** - * Whether text fields should animate their positioning. - * @const{boolean} - */ -Blockly.BlockSvg.FIELD_TEXTINPUT_ANIMATE_POSITIONING = false; - -/** - * Map of output/input shapes and the amount they should cause a block to be padded. - * Outer key is the outer shape, inner key is the inner shape. - * When a block with the outer shape contains an input block with the inner shape - * on its left or right edge, that side is extended by the padding specified. - * See also: `Blockly.BlockSvg.computeOutputPadding_`. - */ -Blockly.BlockSvg.SHAPE_IN_SHAPE_PADDING = { - 1: { // Outer shape: hexagon. - 0: 5 * Blockly.BlockSvg.GRID_UNIT, // Field in hexagon. - 1: 2 * Blockly.BlockSvg.GRID_UNIT, // Hexagon in hexagon. - 2: 5 * Blockly.BlockSvg.GRID_UNIT, // Round in hexagon. - 3: 5 * Blockly.BlockSvg.GRID_UNIT // Square in hexagon. - }, - 2: { // Outer shape: round. - 0: 3 * Blockly.BlockSvg.GRID_UNIT, // Field in round. - 1: 3 * Blockly.BlockSvg.GRID_UNIT, // Hexagon in round. - 2: 1 * Blockly.BlockSvg.GRID_UNIT, // Round in round. - 3: 2 * Blockly.BlockSvg.GRID_UNIT // Square in round. - }, - 3: { // Outer shape: square. - 0: 2 * Blockly.BlockSvg.GRID_UNIT, // Field in square. - 1: 2 * Blockly.BlockSvg.GRID_UNIT, // Hexagon in square. - 2: 2 * Blockly.BlockSvg.GRID_UNIT, // Round in square. - 3: 2 * Blockly.BlockSvg.GRID_UNIT // Square in square. - } -}; - -/** - * Corner radius of the hat on the define block. - * @const - */ -Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS = 5 * Blockly.BlockSvg.GRID_UNIT; - -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_LEFT_CORNER_DEFINE_HAT = - 'a ' + Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS + ',' + - Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS + ',-' + - Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS; - -/** - * SVG path for drawing the rounded top-left corner. - * @const - */ -Blockly.BlockSvg.TOP_RIGHT_CORNER_DEFINE_HAT = - 'a ' + Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS + ',' + - Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS + ' 0 0,1 ' + - Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS + ',' + - Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS; - -/** - * Padding on the right side of the internal block on the define block. - * @const - */ -Blockly.BlockSvg.DEFINE_BLOCK_PADDING_RIGHT = 2 * Blockly.BlockSvg.GRID_UNIT; - -/** - * Change the colour of a block. - */ -Blockly.BlockSvg.prototype.updateColour = function() { - var strokeColour = this.getColourTertiary(); - var renderShadowed = this.isShadow() && - !Blockly.scratchBlocksUtils.isShadowArgumentReporter(this); - - if (renderShadowed && this.parentBlock_) { - // Pull shadow block stroke colour from parent block's tertiary if possible. - strokeColour = this.parentBlock_.getColourTertiary(); - // Special case: if we contain a colour field, set to a special stroke colour. - if (this.inputList[0] && - this.inputList[0].fieldRow[0] && - (this.inputList[0].fieldRow[0] instanceof Blockly.FieldColour || - this.inputList[0].fieldRow[0] instanceof Blockly.FieldColourSlider)) { - strokeColour = Blockly.Colours.colourPickerStroke; - } - } - - // Render block stroke - this.svgPath_.setAttribute('stroke', strokeColour); - - // Render block fill - if (this.isGlowingBlock_ || renderShadowed) { - // Use the block's shadow colour if possible. - if (this.getShadowColour()) { - var fillColour = this.getShadowColour(); - } else { - var fillColour = this.getColourSecondary(); - } - } else { - var fillColour = this.getColour(); - } - this.svgPath_.setAttribute('fill', fillColour); - - // Render opacity - this.svgPath_.setAttribute('fill-opacity', this.getOpacity()); - - // Update colours of input shapes. - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.outlinePath) { - input.outlinePath.setAttribute('fill', this.getColourTertiary()); - } - } - - // Render icon(s) if applicable - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].updateColour(); - } - - // Bump every dropdown to change its colour. - for (var x = 0, input; input = this.inputList[x]; x++) { - for (var y = 0, field; field = input.fieldRow[y]; y++) { - field.setText(null); - } - } -}; - -/** - * Visual effect to show that if the dragging block is dropped, this block will - * be replaced. If a shadow block it will disappear. Otherwise it will bump. - * @param {boolean} add True if highlighting should be added. - */ -Blockly.BlockSvg.prototype.highlightForReplacement = function(add) { - if (add) { - var replacementGlowFilterId = this.workspace.options.replacementGlowFilterId - || 'blocklyReplacementGlowFilter'; - this.svgPath_.setAttribute('filter', 'url(#' + replacementGlowFilterId + ')'); - Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyReplaceable'); - } else { - this.svgPath_.removeAttribute('filter'); - Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyReplaceable'); - } -}; - -/** - * Visual effect to show that if the dragging block is dropped it will connect - * to this input. - * @param {Blockly.Connection} conn The connection on the input to highlight. - * @param {boolean} add True if highlighting should be added. - */ -Blockly.BlockSvg.prototype.highlightShapeForInput = function(conn, add) { - var input = this.getInputWithConnection(conn); - if (!input) { - throw 'No input found for the connection'; - } - if (!input.outlinePath) { - return; - } - if (add) { - var replacementGlowFilterId = this.workspace.options.replacementGlowFilterId - || 'blocklyReplacementGlowFilter'; - input.outlinePath.setAttribute('filter', - 'url(#' + replacementGlowFilterId + ')'); - Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyReplaceable'); - } else { - input.outlinePath.removeAttribute('filter'); - Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyReplaceable'); - } -}; - -/** - * Returns a bounding box describing the dimensions of this block - * and any blocks stacked below it. - * @return {!{height: number, width: number}} Object with height and width properties. - */ -Blockly.BlockSvg.prototype.getHeightWidth = function() { - var height = this.height; - var width = this.width; - // Recursively add size of subsequent blocks. - var nextBlock = this.getNextBlock(); - if (nextBlock) { - var nextHeightWidth = nextBlock.getHeightWidth(); - height += nextHeightWidth.height; - height -= Blockly.BlockSvg.NOTCH_HEIGHT; // Exclude height of connected notch. - width = Math.max(width, nextHeightWidth.width); - } - return {height: height, width: width}; -}; - -/** - * Render the block. - * Lays out and reflows a block based on its contents and settings. - * @param {boolean=} opt_bubble If false, just render this block. - * If true, also render block's parent, grandparent, etc. Defaults to true. - */ -Blockly.BlockSvg.prototype.render = function(opt_bubble) { - Blockly.Field.startCache(); - this.rendered = true; - - var cursorX = Blockly.BlockSvg.SEP_SPACE_X; - if (this.RTL) { - cursorX = -cursorX; - } - // Move the icons into position. - var icons = this.getIcons(); - var scratchCommentIcon = null; - for (var i = 0; i < icons.length; i++) { - if (icons[i] instanceof Blockly.ScratchBlockComment) { - // Don't render scratch block comment icon until - // after the inputs - scratchCommentIcon = icons[i]; - } else { - cursorX = icons[i].renderIcon(cursorX); - } - } - cursorX += this.RTL ? - Blockly.BlockSvg.SEP_SPACE_X : -Blockly.BlockSvg.SEP_SPACE_X; - // If there are no icons, cursorX will be 0, otherwise it will be the - // width that the first label needs to move over by. - - // If this is an extension reporter block, add a horizontal offset. - if (this.isScratchExtension && this.outputConnection) { - cursorX += this.RTL ? - -Blockly.BlockSvg.GRID_UNIT : Blockly.BlockSvg.GRID_UNIT; - } - - var inputRows = this.renderCompute_(cursorX); - this.renderDraw_(cursorX, inputRows); - this.renderMoveConnections_(); - - this.renderClassify_(); - - // Position the Scratch Block Comment Icon at the end of the block - if (scratchCommentIcon) { - var iconX = this.RTL ? -inputRows.rightEdge : inputRows.rightEdge; - var inputMarginY = inputRows[0].height / 2; - scratchCommentIcon.renderIcon(iconX, inputMarginY); - } - - if (opt_bubble !== false) { - // Render all blocks above this one (propagate a reflow). - var parentBlock = this.getParent(); - if (parentBlock) { - parentBlock.render(true); - } else { - // Top-most block. Fire an event to allow scrollbars to resize. - Blockly.resizeSvgContents(this.workspace); - } - } - Blockly.Field.stopCache(); -}; - -/** - * Render a list of fields starting at the specified location. - * @param {!Array.} fieldList List of fields. - * @param {number} cursorX X-coordinate to start the fields. - * @param {number} cursorY Y-coordinate around which fields are centered. - * @return {number} X-coordinate of the end of the field row (plus a gap). - * @private - */ -Blockly.BlockSvg.prototype.renderFields_ = function(fieldList, cursorX, - cursorY) { - if (this.RTL) { - cursorX = -cursorX; - } - for (var t = 0, field; field = fieldList[t]; t++) { - var root = field.getSvgRoot(); - if (!root) { - continue; - } - // In blocks with a notch, fields should be bumped to a min X, - // to avoid overlapping with the notch. Label and image fields are - // excluded. - if (this.previousConnection && !(field instanceof Blockly.FieldLabel) && - !(field instanceof Blockly.FieldImage)) { - cursorX = this.RTL ? - Math.min(cursorX, -Blockly.BlockSvg.INPUT_AND_FIELD_MIN_X) : - Math.max(cursorX, Blockly.BlockSvg.INPUT_AND_FIELD_MIN_X); - } - // Offset the field upward by half its height. - // This vertically centers the fields around cursorY. - var yOffset = -field.getSize().height / 2; - - // If this is an extension block, and this field is the first field, and - // it is an image field, and this block has a previous connection, bump - // the image down by one grid unit to align it vertically. - if (this.isScratchExtension && (field === this.inputList[0].fieldRow[0]) - && (field instanceof Blockly.FieldImage) && this.previousConnection) { - yOffset += Blockly.BlockSvg.GRID_UNIT; - } - - // If this is an extension hat block, adjust the height of the vertical - // separator without adjusting the field height. The effect is to move - // the bottom end of the line up one grid unit. - if (this.isScratchExtension && - !this.previousConnection && this.nextConnection && - field instanceof Blockly.FieldVerticalSeparator) { - field.setLineHeight(Blockly.BlockSvg.ICON_SEPARATOR_HEIGHT - - Blockly.BlockSvg.GRID_UNIT); - } - - var translateX, translateY; - var scale = ''; - if (this.RTL) { - cursorX -= field.renderSep + field.renderWidth; - translateX = cursorX; - translateY = cursorY + yOffset; - if (field.renderWidth) { - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - } - } else { - translateX = cursorX + field.renderSep; - translateY = cursorY + yOffset; - if (field.renderWidth) { - cursorX += field.renderSep + field.renderWidth + - Blockly.BlockSvg.SEP_SPACE_X; - } - } - if (this.RTL && - field instanceof Blockly.FieldImage && - field.getFlipRTL()) { - scale = 'scale(-1 1)'; - translateX += field.renderWidth; - } - root.setAttribute('transform', - 'translate(' + translateX + ', ' + translateY + ') ' + scale); - - // Fields are invisible on insertion marker. - if (this.isInsertionMarker()) { - root.setAttribute('display', 'none'); - } - } - return this.RTL ? -cursorX : cursorX; -}; - -/** - * Computes the height and widths for each row and field. - * @param {number} iconWidth Offset of first row due to icons. - * @return {!Array.>} 2D array of objects, each containing - * position information. - * @private - */ -Blockly.BlockSvg.prototype.renderCompute_ = function(iconWidth) { - var inputList = this.inputList; - var inputRows = []; - // Block will be drawn from 0 (left edge) to rightEdge, in px. - inputRows.rightEdge = 0; - // Drawn from 0 to bottomEdge vertically. - inputRows.bottomEdge = 0; - var fieldValueWidth = 0; // Width of longest external value field. - var fieldStatementWidth = 0; // Width of longest statement field. - var hasValue = false; - var hasStatement = false; - var hasDummy = false; - var lastType = undefined; - - // Previously created row, for special-casing row heights on C- and E- shaped blocks. - var previousRow; - for (var i = 0, input; input = inputList[i]; i++) { - if (!input.isVisible()) { - continue; - } - var isSecondInputOnProcedure = this.type == 'procedures_definition' && - lastType && lastType == Blockly.NEXT_STATEMENT; - var row; - // Don't create a new row for the second dummy input on a procedure block. - // See github.com/LLK/scratch-blocks/issues/1658 - // In all other cases, statement and value inputs catch all preceding dummy - // inputs, and cause a line break before following inputs. - if (!isSecondInputOnProcedure && - (!lastType || lastType == Blockly.NEXT_STATEMENT || - input.type == Blockly.NEXT_STATEMENT)) { - lastType = input.type; - row = this.createRowForInput_(input); - inputRows.push(row); - } else { - row = inputRows[inputRows.length - 1]; - } - row.push(input); - - // Compute minimum dimensions for this input. - input.renderHeight = this.computeInputHeight_(input, row, previousRow); - input.renderWidth = this.computeInputWidth_(input); - - // If the input is a statement input, determine if a notch - // should be drawn at the inner bottom of the C. - row.statementNotchAtBottom = true; - if (input.connection && input.connection.type === Blockly.NEXT_STATEMENT) { - var linkedBlock = input.connection.targetBlock(); - if (linkedBlock && !linkedBlock.lastConnectionInStack()) { - row.statementNotchAtBottom = false; - } - } - - // Expand input size. - if (input.connection) { - var linkedBlock = input.connection.targetBlock(); - var paddedHeight = 0; - var paddedWidth = 0; - if (linkedBlock) { - // A block is connected to the input - use its size. - var bBox = linkedBlock.getHeightWidth(); - paddedHeight = bBox.height; - paddedWidth = bBox.width; - } else { - // No block connected - use the size of the rendered empty input shape. - paddedHeight = Blockly.BlockSvg.INPUT_SHAPE_HEIGHT; - } - if (input.connection.type === Blockly.INPUT_VALUE) { - paddedHeight += 2 * Blockly.BlockSvg.INLINE_PADDING_Y; - } - if (input.connection.type === Blockly.NEXT_STATEMENT) { - // Subtract height of notch, only if the last block in the stack has a next connection. - if (row.statementNotchAtBottom) { - paddedHeight -= Blockly.BlockSvg.NOTCH_HEIGHT; - } - } - input.renderHeight = Math.max(input.renderHeight, paddedHeight); - input.renderWidth = Math.max(input.renderWidth, paddedWidth); - } - row.height = Math.max(row.height, input.renderHeight); - input.fieldWidth = 0; - if (inputRows.length == 1) { - // The first row gets shifted to accommodate any icons. - input.fieldWidth += this.RTL ? -iconWidth : iconWidth; - } - var previousFieldEditable = false; - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (j != 0) { - input.fieldWidth += Blockly.BlockSvg.SEP_SPACE_X; - } - // Get the dimensions of the field. - var fieldSize = field.getSize(); - field.renderWidth = fieldSize.width; - field.renderSep = (previousFieldEditable && field.EDITABLE) ? - Blockly.BlockSvg.SEP_SPACE_X : 0; - // See github.com/LLK/scratch-blocks/issues/1658 - if (!isSecondInputOnProcedure) { - input.fieldWidth += field.renderWidth + field.renderSep; - } - row.height = Math.max(row.height, fieldSize.height); - previousFieldEditable = field.EDITABLE; - } - - if (row.type != Blockly.BlockSvg.INLINE) { - if (row.type == Blockly.NEXT_STATEMENT) { - hasStatement = true; - fieldStatementWidth = Math.max(fieldStatementWidth, input.fieldWidth); - } else { - if (row.type == Blockly.INPUT_VALUE) { - hasValue = true; - } else if (row.type == Blockly.DUMMY_INPUT) { - hasDummy = true; - } - fieldValueWidth = Math.max(fieldValueWidth, input.fieldWidth); - } - } - previousRow = row; - } - // Compute padding for output blocks. - // Data is attached to the row. - this.computeOutputPadding_(inputRows); - // Compute the statement edge. - // This is the width of a block where statements are nested. - inputRows.statementEdge = Blockly.BlockSvg.STATEMENT_INPUT_EDGE_WIDTH + - fieldStatementWidth; - - // Compute the preferred right edge. - inputRows.rightEdge = this.computeRightEdge_(inputRows.rightEdge, - hasStatement); - - // Bottom edge is sum of row heights - for (var i = 0; i < inputRows.length; i++) { - inputRows.bottomEdge += inputRows[i].height; - } - - inputRows.hasValue = hasValue; - inputRows.hasStatement = hasStatement; - inputRows.hasDummy = hasDummy; - return inputRows; -}; - -/** - * Compute the minimum width of this input based on the connection type and - * outputs. - * @param {!Blockly.Input} input The input to measure. - * @return {number} the computed width of this input. - * @private - */ -Blockly.BlockSvg.prototype.computeInputWidth_ = function(input) { - // Empty input shape widths. - if (input.type == Blockly.INPUT_VALUE && - (!input.connection || !input.connection.isConnected())) { - switch (input.connection.getOutputShape()) { - case Blockly.OUTPUT_SHAPE_SQUARE: - return Blockly.BlockSvg.INPUT_SHAPE_SQUARE_WIDTH; - case Blockly.OUTPUT_SHAPE_ROUND: - return Blockly.BlockSvg.INPUT_SHAPE_ROUND_WIDTH; - case Blockly.OUTPUT_SHAPE_HEXAGONAL: - return Blockly.BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH; - default: - return 0; - } - } else { - return 0; - } -}; - -/** - * Compute the minimum height of this input. - * @param {!Blockly.Input} input The input to measure. - * @param {!Object} row The row of the block that is currently being measured. - * @param {!Object} previousRow The previous row of the block, which was just - * measured. - * @return {number} the computed height of this input. - * @private - */ -Blockly.BlockSvg.prototype.computeInputHeight_ = function(input, row, - previousRow) { - if (this.inputList.length === 1 && this.outputConnection && - (this.isShadow() && - !Blockly.scratchBlocksUtils.isShadowArgumentReporter(this))) { - // "Lone" field blocks are smaller. - return Blockly.BlockSvg.MIN_BLOCK_Y_SINGLE_FIELD_OUTPUT; - } else if (this.outputConnection) { - // If this is an extension reporter block, make it taller. - if (this.isScratchExtension) { - return Blockly.BlockSvg.MIN_BLOCK_Y_REPORTER + 2 * Blockly.BlockSvg.GRID_UNIT; - } - // All other reporters. - return Blockly.BlockSvg.MIN_BLOCK_Y_REPORTER; - } else if (row.type == Blockly.NEXT_STATEMENT) { - // Statement input. - return Blockly.BlockSvg.MIN_STATEMENT_INPUT_HEIGHT; - } else if (previousRow && previousRow.type == Blockly.NEXT_STATEMENT) { - // Extra row for below statement input. - return Blockly.BlockSvg.EXTRA_STATEMENT_ROW_Y; - } else { - // If this is an extension block, and it has a previous connection, - // make it taller. - if (this.isScratchExtension && this.previousConnection) { - return Blockly.BlockSvg.MIN_BLOCK_Y + 2 * Blockly.BlockSvg.GRID_UNIT; - } - // All other blocks. - return Blockly.BlockSvg.MIN_BLOCK_Y; - } -}; - -/** - * Create a row for an input and associated fields. - * @param {!Blockly.Input} input The input that the row is based on. - * @return {!Object} The new row, with the correct type and default sizing info. - */ -Blockly.BlockSvg.prototype.createRowForInput_ = function(input) { - // Create new row. - var row = []; - if (input.type != Blockly.NEXT_STATEMENT) { - row.type = Blockly.BlockSvg.INLINE; - } else { - row.type = input.type; - } - row.height = 0; - // Default padding for a block: same as separators between fields/inputs. - row.paddingStart = Blockly.BlockSvg.SEP_SPACE_X; - row.paddingEnd = Blockly.BlockSvg.SEP_SPACE_X; - return row; -}; - -/** - * Compute the preferred right edge of the block. - * @param {number} curEdge The previously calculated right edge. - * @param {boolean} hasStatement Whether this block has a statement input. - * @return {number} The preferred right edge of the block. - */ -Blockly.BlockSvg.prototype.computeRightEdge_ = function(curEdge, hasStatement) { - var edge = curEdge; - if (this.previousConnection || this.nextConnection) { - // Blocks with notches - edge = Math.max(edge, Blockly.BlockSvg.MIN_BLOCK_X); - } else if (this.outputConnection) { - if (this.isShadow() && - !Blockly.scratchBlocksUtils.isShadowArgumentReporter(this)) { - // Single-fields - edge = Math.max(edge, Blockly.BlockSvg.MIN_BLOCK_X_SHADOW_OUTPUT); - } else { - // Reporters - edge = Math.max(edge, Blockly.BlockSvg.MIN_BLOCK_X_OUTPUT); - } - } - if (hasStatement) { - // Statement blocks (C- or E- shaped) have a longer minimum width. - edge = Math.max(edge, Blockly.BlockSvg.MIN_BLOCK_X_WITH_STATEMENT); - } - - // Ensure insertion markers are at least insertionMarkerMinWidth_ wide. - if (this.insertionMarkerMinWidth_ > 0) { - edge = Math.max(edge, this.insertionMarkerMinWidth_); - } - return edge; -}; - -/** - * For a block with output, - * determine start and end padding, based on connected inputs. - * Padding will depend on the shape of the output, the shape of the input, - * and possibly the size of the input. - * @param {!Array.>} inputRows Partially calculated rows. - */ -Blockly.BlockSvg.prototype.computeOutputPadding_ = function(inputRows) { - // Only apply to blocks with outputs and not single fields (shadows). - if (!this.getOutputShape() || !this.outputConnection || - (this.isShadow() && - !Blockly.scratchBlocksUtils.isShadowArgumentReporter(this))) { - return; - } - // Blocks with outputs must have single row to be padded. - if (inputRows.length > 1) { - return; - } - var row = inputRows[0]; - var shape = this.getOutputShape(); - // Reset any padding: it's about to be set. - row.paddingStart = 0; - row.paddingEnd = 0; - // Start row padding: based on first input or first field. - var firstInput = row[0]; - var firstField = firstInput.fieldRow[0]; - var otherShape; - // In checking the left/start side, a field takes precedence over any input. - // That's because a field will be rendered before any value input. - if (firstField) { - otherShape = 0; // Field comes first in the row. - } else { - // Value input comes first in the row. - var inputConnection = firstInput.connection; - if (!inputConnection.targetConnection) { - // Not connected: use the drawn shape. - otherShape = inputConnection.getOutputShape(); - } else { - // Connected: use the connected block's output shape. - otherShape = inputConnection.targetConnection.getSourceBlock().getOutputShape(); - } - // Special case for hexagonal output: if the connection is larger height - // than a standard reporter, add some start padding. - // https://github.com/LLK/scratch-blocks/issues/376 - if (shape == Blockly.OUTPUT_SHAPE_HEXAGONAL && - otherShape != Blockly.OUTPUT_SHAPE_HEXAGONAL) { - var deltaHeight = firstInput.renderHeight - Blockly.BlockSvg.MIN_BLOCK_Y_REPORTER; - // One grid unit per level of nesting. - row.paddingStart += deltaHeight / 2; - } - } - row.paddingStart += Blockly.BlockSvg.SHAPE_IN_SHAPE_PADDING[shape][otherShape]; - // End row padding: based on last input or last field. - var lastInput = row[row.length - 1]; - // In checking the right/end side, any value input takes precedence over any field. - // That's because fields are rendered before inputs...the last item - // in the row will be an input, if one exists. - if (lastInput.connection) { - // Value input last in the row. - var inputConnection = lastInput.connection; - if (!inputConnection.targetConnection) { - // Not connected: use the drawn shape. - otherShape = inputConnection.getOutputShape(); - } else { - // Connected: use the connected block's output shape. - otherShape = inputConnection.targetConnection.getSourceBlock().getOutputShape(); - } - // Special case for hexagonal output: if the connection is larger height - // than a standard reporter, add some end padding. - // https://github.com/LLK/scratch-blocks/issues/376 - if (shape == Blockly.OUTPUT_SHAPE_HEXAGONAL && - otherShape != Blockly.OUTPUT_SHAPE_HEXAGONAL) { - var deltaHeight = lastInput.renderHeight - Blockly.BlockSvg.MIN_BLOCK_Y_REPORTER; - // One grid unit per level of nesting. - row.paddingEnd += deltaHeight / 2; - } - } else { - // No input in this row - mark as field. - otherShape = 0; - } - row.paddingEnd += Blockly.BlockSvg.SHAPE_IN_SHAPE_PADDING[shape][otherShape]; -}; - -/** - * Draw the path of the block. - * Move the fields to the correct locations. - * @param {number} iconWidth Offset of first row due to icons. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @private - */ -Blockly.BlockSvg.prototype.renderDraw_ = function(iconWidth, inputRows) { - this.startHat_ = false; - // Should the top left corners be rounded or square? - // Currently, it is squared only if it's a hat. - this.squareTopLeftCorner_ = false; - if (!this.outputConnection && !this.previousConnection) { - // No output or previous connection. - this.squareTopLeftCorner_ = true; - this.startHat_ = true; - inputRows.rightEdge = Math.max(inputRows.rightEdge, 100); - } - - // Amount of space to skip drawing the top and bottom, - // to make room for the left and right to draw shapes (curves or angles). - this.edgeShapeWidth_ = 0; - this.edgeShape_ = null; - if (this.outputConnection) { - // Width of the curve/pointy-curve - var shape = this.getOutputShape(); - if (shape === Blockly.OUTPUT_SHAPE_HEXAGONAL || shape === Blockly.OUTPUT_SHAPE_ROUND) { - this.edgeShapeWidth_ = inputRows.bottomEdge / 2; - this.edgeShape_ = shape; - this.squareTopLeftCorner_ = true; - } - } - - // Assemble the block's path. - var steps = []; - - this.renderDrawTop_(steps, inputRows.rightEdge); - var cursorY = this.renderDrawRight_(steps, inputRows, iconWidth); - this.renderDrawBottom_(steps, cursorY); - this.renderDrawLeft_(steps); - - var pathString = steps.join(' '); - this.svgPath_.setAttribute('d', pathString); - - if (this.RTL) { - // Mirror the block's path. - // This is awesome. - this.svgPath_.setAttribute('transform', 'scale(-1 1)'); - } -}; - -/** - * Give the block an attribute 'data-shapes' that lists its shape[s], and an - * attribute 'data-category' with its category. - * @private - */ -Blockly.BlockSvg.prototype.renderClassify_ = function() { - var shapes = []; - - if (this.outputConnection) { - if (this.isShadow_) { - shapes.push('argument'); - } else { - shapes.push('reporter'); - } - if (this.edgeShape_ === Blockly.OUTPUT_SHAPE_HEXAGONAL) { - shapes.push('boolean'); - } else if (this.edgeShape_ === Blockly.OUTPUT_SHAPE_ROUND) { - shapes.push('round'); - } - } else { - // count the number of statement inputs - var inputList = this.inputList; - var statementCount = 0; - for (var i = 0, input; input = inputList[i]; i++) { - if (input.connection && input.connection.type === Blockly.NEXT_STATEMENT) { - statementCount++; - } - } - - if (statementCount) { - shapes.push('c-block'); - shapes.push('c-' + statementCount); - } - if (this.startHat_) { - shapes.push('hat'); // c-block+hats are possible (e.x. reprter procedures) - } else if (!statementCount) { - shapes.push('stack'); //only call it "stack" if it's not a c-block - } - if (!this.nextConnection) { - shapes.push('end'); - } - } - - this.svgGroup_.setAttribute('data-shapes', shapes.join(' ')); - - if (this.getCategory()) { - this.svgGroup_.setAttribute('data-category', this.getCategory()); - } -}; - -/** - * Render the top edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {number} rightEdge Minimum width of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawTop_ = function(steps, rightEdge) { - if (this.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE) { - steps.push('m 0, 0'); - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_DEFINE_HAT); - } else { - // Position the cursor at the top-left starting point. - if (this.squareTopLeftCorner_) { - steps.push('m 0,0'); - if (this.startHat_) { - steps.push(Blockly.BlockSvg.START_HAT_PATH); - } - // Skip space for the output shape - if (this.edgeShapeWidth_) { - steps.push('m ' + this.edgeShapeWidth_ + ',0'); - } - } else { - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER_START); - // Top-left rounded corner. - steps.push(Blockly.BlockSvg.TOP_LEFT_CORNER); - } - - // Top edge. - if (this.previousConnection) { - // Space before the notch - steps.push('H', Blockly.BlockSvg.NOTCH_START_PADDING); - steps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT); - // Create previous block connection. - var connectionX = (this.RTL ? - -Blockly.BlockSvg.NOTCH_WIDTH : Blockly.BlockSvg.NOTCH_WIDTH); - this.previousConnection.setOffsetInBlock(connectionX, 0); - } - } - this.width = rightEdge; -}; - -/** - * Render the right edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @param {number} iconWidth Offset of first row due to icons. - * @return {number} Height of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawRight_ = function(steps, - inputRows, iconWidth) { - var cursorX = 0; - var cursorY = 0; - var connectionX, connectionY; - for (var y = 0, row; row = inputRows[y]; y++) { - cursorX = row.paddingStart; - if (y == 0) { - cursorX += this.RTL ? -iconWidth : iconWidth; - } - - if (row.type == Blockly.BlockSvg.INLINE) { - // Inline inputs. - for (var x = 0, input; input = row[x]; x++) { - // Align fields vertically within the row. - // Moves the field to half of the row's height. - // In renderFields_, the field is further centered - // by its own rendered height. - var fieldY = cursorY + row.height / 2; - - var fieldX = Blockly.BlockSvg.getAlignedCursor_(cursorX, input, - inputRows.rightEdge); - - cursorX = this.renderFields_(input.fieldRow, fieldX, fieldY); - if (input.type == Blockly.INPUT_VALUE) { - // Create inline input connection. - // In blocks with a notch, inputs should be bumped to a min X, - // to avoid overlapping with the notch. - if (this.previousConnection) { - cursorX = Math.max(cursorX, Blockly.BlockSvg.INPUT_AND_FIELD_MIN_X); - } - connectionX = this.RTL ? -cursorX : cursorX; - // Attempt to center the connection vertically. - var connectionYOffset = row.height / 2; - connectionY = cursorY + connectionYOffset; - input.connection.setOffsetInBlock(connectionX, connectionY); - this.renderInputShape_(input, cursorX, cursorY + connectionYOffset); - cursorX += input.renderWidth + Blockly.BlockSvg.SEP_SPACE_X; - } - } - // Remove final separator and replace it with right-padding. - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - cursorX += row.paddingEnd; - // Update right edge for all inputs, such that all rows - // stretch to be at least the size of all previous rows. - inputRows.rightEdge = Math.max(cursorX, inputRows.rightEdge); - // Move to the right edge - cursorX = Math.max(cursorX, inputRows.rightEdge); - this.width = Math.max(this.width, cursorX); - if (!this.edgeShape_) { - // Include corner radius in drawing the horizontal line. - steps.push('H', cursorX - Blockly.BlockSvg.CORNER_RADIUS - this.edgeShapeWidth_); - steps.push(Blockly.BlockSvg.TOP_RIGHT_CORNER); - } else { - // Don't include corner radius - no corner (edge shape drawn). - steps.push('H', cursorX - this.edgeShapeWidth_); - } - // Subtract CORNER_RADIUS * 2 to account for the top right corner - // and also the bottom right corner. Only move vertically the non-corner length. - if (!this.edgeShape_) { - steps.push('v', row.height - Blockly.BlockSvg.CORNER_RADIUS * 2); - } - } else if (row.type == Blockly.NEXT_STATEMENT) { - // Nested statement. - var input = row[0]; - var fieldX = cursorX; - // Align fields vertically within the row. - // In renderFields_, the field is further centered by its own height. - var fieldY = cursorY; - fieldY += Blockly.BlockSvg.MIN_STATEMENT_INPUT_HEIGHT; - this.renderFields_(input.fieldRow, fieldX, fieldY); - // Move to the start of the notch. - cursorX = inputRows.statementEdge + Blockly.BlockSvg.NOTCH_WIDTH; - - if (this.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE) { - this.renderDefineBlock_(steps, inputRows, input, row, cursorY); - } else { - Blockly.BlockSvg.drawStatementInputFromTopRight_(steps, cursorX, - inputRows.rightEdge, row); - } - - // Create statement connection. - connectionX = this.RTL ? -cursorX : cursorX; - input.connection.setOffsetInBlock(connectionX, cursorY); - if (input.connection.isConnected()) { - this.width = Math.max(this.width, inputRows.statementEdge + - input.connection.targetBlock().getHeightWidth().width); - } - if (this.type != Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE && - (y == inputRows.length - 1 || - inputRows[y + 1].type == Blockly.NEXT_STATEMENT)) { - // If the final input is a statement stack, add a small row underneath. - // Consecutive statement stacks are also separated by a small divider. - steps.push(Blockly.BlockSvg.TOP_RIGHT_CORNER); - steps.push('v', Blockly.BlockSvg.EXTRA_STATEMENT_ROW_Y - 2 * Blockly.BlockSvg.CORNER_RADIUS); - cursorY += Blockly.BlockSvg.EXTRA_STATEMENT_ROW_Y; - } - } - cursorY += row.height; - } - this.drawEdgeShapeRight_(steps); - if (!inputRows.length) { - cursorY = Blockly.BlockSvg.MIN_BLOCK_Y; - steps.push('V', cursorY); - } - return cursorY; -}; - -/** - * Render the input shapes. - * If there's a connected block, hide the input shape. - * Otherwise, draw and set the position of the input shape. - * @param {!Blockly.Input} input Input to be rendered. - * @param {Number} x X offset of input. - * @param {Number} y Y offset of input. - */ -Blockly.BlockSvg.prototype.renderInputShape_ = function(input, x, y) { - var inputShape = input.outlinePath; - if (!inputShape) { - // No input shape for this input - e.g., the block is an insertion marker. - return; - } - // Input shapes are only visibly rendered on non-connected slots. - if (input.connection.targetConnection) { - inputShape.setAttribute('style', 'visibility: hidden'); - } else { - var inputShapeX = 0, inputShapeY = 0; - var inputShapeInfo = - Blockly.BlockSvg.getInputShapeInfo_(input.connection.getOutputShape()); - if (this.RTL) { - inputShapeX = -x - inputShapeInfo.width; - } else { - inputShapeX = x; - } - inputShapeY = y - (Blockly.BlockSvg.INPUT_SHAPE_HEIGHT / 2); - inputShape.setAttribute('d', inputShapeInfo.path); - inputShape.setAttribute('transform', - 'translate(' + inputShapeX + ',' + inputShapeY + ')'); - inputShape.setAttribute('data-argument-type', inputShapeInfo.argType); - inputShape.setAttribute('style', 'visibility: visible'); - } -}; - -/** - * Render the bottom edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {number} cursorY Height of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawBottom_ = function(steps, cursorY) { - this.height = cursorY; - if (!this.edgeShape_) { - steps.push(Blockly.BlockSvg.BOTTOM_RIGHT_CORNER); - } - if (this.nextConnection) { - // Move to the right-side of the notch. - var notchStart = ( - Blockly.BlockSvg.NOTCH_WIDTH + - Blockly.BlockSvg.NOTCH_START_PADDING + - Blockly.BlockSvg.CORNER_RADIUS - ); - steps.push('H', notchStart, ' '); - steps.push(Blockly.BlockSvg.NOTCH_PATH_RIGHT); - // Create next block connection. - var connectionX = this.RTL ? -Blockly.BlockSvg.NOTCH_WIDTH : - Blockly.BlockSvg.NOTCH_WIDTH; - this.nextConnection.setOffsetInBlock(connectionX, cursorY); - // Include height of notch in block height. - this.height += Blockly.BlockSvg.NOTCH_HEIGHT; - } - // Bottom horizontal line - if (!this.edgeShape_) { - steps.push('H', Blockly.BlockSvg.CORNER_RADIUS); - // Bottom left corner - steps.push(Blockly.BlockSvg.BOTTOM_LEFT_CORNER); - } else { - steps.push('H', this.edgeShapeWidth_); - } -}; - -/** - * Render the left edge of the block. - * @param {!Array.} steps Path of block outline. - * @param {number} cursorY Height of block. - * @private - */ -Blockly.BlockSvg.prototype.renderDrawLeft_ = function(steps) { - if (this.outputConnection) { - // Scratch-style reporters have output connection y at half block height. - this.outputConnection.setOffsetInBlock(0, this.height / 2); - } - if (this.edgeShape_) { - // Draw the left-side edge shape. - if (this.edgeShape_ === Blockly.OUTPUT_SHAPE_ROUND) { - // Draw a rounded arc. - steps.push('a ' + this.edgeShapeWidth_ + ' ' + this.edgeShapeWidth_ + ' 0 0 1 0 -' + this.edgeShapeWidth_ * 2); - } else if (this.edgeShape_ === Blockly.OUTPUT_SHAPE_HEXAGONAL) { - // Draw a half-hexagon. - steps.push('l ' + -this.edgeShapeWidth_ + ' ' + -this.edgeShapeWidth_ + - ' l ' + this.edgeShapeWidth_ + ' ' + -this.edgeShapeWidth_); - } - } - steps.push('z'); -}; - -/** - * Draw the edge shape (rounded or hexagonal) on the right side of a block with - * an output. - * @param {!Array.} steps Path of block outline. - * @private - */ -Blockly.BlockSvg.prototype.drawEdgeShapeRight_ = function(steps) { - if (this.edgeShape_) { - // Draw the right-side edge shape. - if (this.edgeShape_ === Blockly.OUTPUT_SHAPE_ROUND) { - // Draw a rounded arc. - steps.push('a ' + this.edgeShapeWidth_ + ' ' + this.edgeShapeWidth_ + - ' 0 0 1 0 ' + this.edgeShapeWidth_ * 2); - } else if (this.edgeShape_ === Blockly.OUTPUT_SHAPE_HEXAGONAL) { - // Draw an half-hexagon. - steps.push('l ' + this.edgeShapeWidth_ + ' ' + this.edgeShapeWidth_ + - ' l ' + -this.edgeShapeWidth_ + ' ' + this.edgeShapeWidth_); - } - } -}; - -/** - * Position an new block correctly, so that it doesn't move the existing block - * when connected to it. - * @param {!Blockly.Block} newBlock The block to position - either the first - * block in a dragged stack or an insertion marker. - * @param {!Blockly.Connection} newConnection The connection on the new block's - * stack - either a connection on newBlock, or the last NEXT_STATEMENT - * connection on the stack if the stack's being dropped before another - * block. - * @param {!Blockly.Connection} existingConnection The connection on the - * existing block, which newBlock should line up with. - */ -Blockly.BlockSvg.prototype.positionNewBlock = function(newBlock, newConnection, - existingConnection) { - // We only need to position the new block if it's before the existing one, - // otherwise its position is set by the previous block. - if (newConnection.type == Blockly.NEXT_STATEMENT) { - var dx = existingConnection.x_ - newConnection.x_; - var dy = existingConnection.y_ - newConnection.y_; - - newBlock.moveBy(dx, dy); - } -}; - -/** - * Draw the outline of a statement input, starting at the top right corner. - * @param {!Array.} steps Path of block outline. - * @param {number} cursorX The x position of the start of the notch at the top - * of the input. - * @param {number} rightEdge The far right edge of the block, which determines - * how wide the statement input is. - * @param {!Array.} row An object containing information about the - * current row, including its height and whether it should have a notch at - * the bottom. - * @private - */ -Blockly.BlockSvg.drawStatementInputFromTopRight_ = function(steps, cursorX, - rightEdge, row) { - Blockly.BlockSvg.drawStatementInputTop_(steps, cursorX); - steps.push('v', row.height - 2 * Blockly.BlockSvg.CORNER_RADIUS); - Blockly.BlockSvg.drawStatementInputBottom_(steps, rightEdge, row); -}; - -/** - * Draw the top of the outline of a statement input, starting at the top right - * corner. - * @param {!Array.} steps Path of block outline. - * @param {number} cursorX The x position of the start of the notch at the top - * of the input. - * @private - */ -Blockly.BlockSvg.drawStatementInputTop_ = function(steps, cursorX) { - steps.push(Blockly.BlockSvg.BOTTOM_RIGHT_CORNER); - steps.push('H', cursorX + Blockly.BlockSvg.STATEMENT_INPUT_INNER_SPACE + - 2 * Blockly.BlockSvg.CORNER_RADIUS); - steps.push(Blockly.BlockSvg.NOTCH_PATH_RIGHT); - steps.push('h', '-' + Blockly.BlockSvg.STATEMENT_INPUT_INNER_SPACE); - steps.push(Blockly.BlockSvg.INNER_TOP_LEFT_CORNER); -}; - -/** - * Draw the bottom of the outline of a statement input, starting at the inner - * left corner. - * @param {!Array.} steps Path of block outline. - * @param {number} rightEdge The far right edge of the block, which determines - * how wide the statement input is. - * @param {!Array.} row An object containing information about the - * current row, including its height and whether it should have a notch at - * the bottom. - * @private - */ -Blockly.BlockSvg.drawStatementInputBottom_ = function(steps, rightEdge, row) { - steps.push(Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER); - if (row.statementNotchAtBottom) { - steps.push('h ', Blockly.BlockSvg.STATEMENT_INPUT_INNER_SPACE); - steps.push(Blockly.BlockSvg.NOTCH_PATH_LEFT); - } - steps.push('H', rightEdge - Blockly.BlockSvg.CORNER_RADIUS); -}; - -/** - * Render part of the hat and the right side of the define block to fully wrap - * the connected statement block. - * Scratch-specific. - * @param {!Array.} steps Path of block outline. - * @param {!Array.>} inputRows 2D array of objects, each - * containing position information. - * @param {!Blockly.Input} input The input that is currently being rendered. - * @param {!Array.} row An object containing information about the - * current row, including its height and whether it should have a notch at - * the bottom. - * @param {number} cursorY The y position of the start of this row. Used to - * position the following dummy input's fields. - * @private - */ -Blockly.BlockSvg.prototype.renderDefineBlock_ = function(steps, inputRows, - input, row, cursorY) { - // Following text shows up as a dummy input after the statement input, which - // we are forcing to stay inline with the statement input instead of letting - // it drop to a new line. - var hasFollowingText = row.length == 2; - - // Figure out where the right side of the block is. - var rightSide = inputRows.rightEdge; - if (input.connection && input.connection.targetBlock()) { - rightSide = inputRows.statementEdge + - input.connection.targetBlock().getHeightWidth().width + - Blockly.BlockSvg.DEFINE_BLOCK_PADDING_RIGHT; - } else { - // Handles the case where block is being rendered as an insertion marker - rightSide = Math.max(Blockly.BlockSvg.MIN_BLOCK_X_WITH_STATEMENT, rightSide) - + Blockly.BlockSvg.DEFINE_BLOCK_PADDING_RIGHT; - } - rightSide -= Blockly.BlockSvg.DEFINE_HAT_CORNER_RADIUS; - - if (hasFollowingText) { - var followingTextInput = row[1]; - var fieldStart = rightSide + 3 * Blockly.BlockSvg.SEP_SPACE_X; - rightSide += followingTextInput.fieldRow[0].getSize().width; - rightSide += 2 * Blockly.BlockSvg.SEP_SPACE_X; - - // Align fields vertically within the row. - // In renderFields_, the field is further centered by its own height. - // The dummy input's fields did not get laid out normally because we're - // forcing them to stay inline with a statement input. - var fieldY = cursorY; - fieldY += Blockly.BlockSvg.MIN_STATEMENT_INPUT_HEIGHT; - this.renderFields_(followingTextInput.fieldRow, fieldStart, fieldY); - } - // Draw the top and the right corner of the hat. - steps.push('H', rightSide); - steps.push(Blockly.BlockSvg.TOP_RIGHT_CORNER_DEFINE_HAT); - row.height += 3 * Blockly.BlockSvg.GRID_UNIT; - // Draw the right side of the block around the statement input. - steps.push('v', row.height); - // row.height will be used to update the cursor in the calling function. - row.height += Blockly.BlockSvg.GRID_UNIT; - -}; - -/** - * Get some information about the input shape to draw, based on the type of the - * connection. - * @param {number} shape An enum representing the shape of the connection we're - * drawing around. - * @return {!Object} An object containing an SVG path, a string representation - * of the argument type, and a width. - * @private - */ -Blockly.BlockSvg.getInputShapeInfo_ = function(shape) { - var inputShapePath = null; - var inputShapeArgType = null; - var inputShapeWidth = 0; - - switch (shape) { - case Blockly.OUTPUT_SHAPE_HEXAGONAL: - inputShapePath = Blockly.BlockSvg.INPUT_SHAPE_HEXAGONAL; - inputShapeWidth = Blockly.BlockSvg.INPUT_SHAPE_HEXAGONAL_WIDTH; - inputShapeArgType = 'boolean'; - break; - case Blockly.OUTPUT_SHAPE_ROUND: - inputShapePath = Blockly.BlockSvg.INPUT_SHAPE_ROUND; - inputShapeWidth = Blockly.BlockSvg.INPUT_SHAPE_ROUND_WIDTH; - inputShapeArgType = 'round'; - break; - case Blockly.OUTPUT_SHAPE_SQUARE: - default: // If the input connection is not connected, draw a hole shape. - inputShapePath = Blockly.BlockSvg.INPUT_SHAPE_SQUARE; - inputShapeWidth = Blockly.BlockSvg.INPUT_SHAPE_SQUARE_WIDTH; - inputShapeArgType = 'square'; - break; - } - return { - path: inputShapePath, - argType: inputShapeArgType, - width: inputShapeWidth - }; -}; - -/** - * Get the correct cursor position for the given input, based on alignment, - * the total size of the block, and the size of the input. - * @param {number} cursorX The minimum x value of the cursor. - * @param {!Blockly.Input} input The input to align the fields for. - * @param {number} rightEdge The maximum width of the block. Right-aligned - * fields are positioned based on this number. - * @return {number} The new cursor position. - * @private - */ -Blockly.BlockSvg.getAlignedCursor_ = function(cursorX, input, rightEdge) { - // Align inline field rows (left/right/centre). - if (input.align === Blockly.ALIGN_RIGHT) { - cursorX += rightEdge - input.fieldWidth - - (2 * Blockly.BlockSvg.SEP_SPACE_X); - } else if (input.align === Blockly.ALIGN_CENTRE) { - cursorX = Math.max(cursorX, rightEdge / 2 - input.fieldWidth / 2); - } - return cursorX; -}; - -/** - * Update all of the connections on this block with the new locaitons calculated - * in renderCompute, and move all of the connected blocks based on the new - * connection locations. - * @private - */ -Blockly.BlockSvg.prototype.renderMoveConnections_ = function() { - var blockTL = this.getRelativeToSurfaceXY(); - // Don't tighten previous or output connections because they are inferior. - if (this.previousConnection) { - this.previousConnection.moveToOffset(blockTL); - } - if (this.outputConnection) { - this.outputConnection.moveToOffset(blockTL); - } - - for (var i = 0; i < this.inputList.length; i++) { - var conn = this.inputList[i].connection; - if (conn) { - conn.moveToOffset(blockTL); - if (conn.isConnected()) { - conn.tighten_(); - } - } - } - - if (this.nextConnection) { - this.nextConnection.moveToOffset(blockTL); - if (this.nextConnection.isConnected()) { - this.nextConnection.tighten_(); - } - } -}; diff --git a/packages/scratch-blocks/core/block_svg.js b/packages/scratch-blocks/core/block_svg.js deleted file mode 100644 index 73c0133c0..000000000 --- a/packages/scratch-blocks/core/block_svg.js +++ /dev/null @@ -1,1314 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for graphically rendering a block as SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.BlockSvg'); - -goog.require('Blockly.Block'); -goog.require('Blockly.BlockAnimations'); -goog.require('Blockly.ContextMenu'); -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.Events.BlockMove'); -goog.require('Blockly.Grid'); -goog.require('Blockly.RenderedConnection'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.Tooltip'); -goog.require('Blockly.Touch'); -goog.require('Blockly.utils'); - -goog.require('goog.Timer'); -goog.require('goog.asserts'); -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); - - -/** - * Class for a block's SVG representation. - * Not normally called directly, workspace.newBlock() is preferred. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. If the ID conflicts with an in-use ID, a new one will - * be generated. - * @extends {Blockly.Block} - * @constructor - */ -Blockly.BlockSvg = function(workspace, prototypeName, opt_id) { - // Create core elements for the block. - /** - * @type {SVGElement} - * @private - */ - this.svgGroup_ = Blockly.utils.createSvgElement('g', {}, null); - /** @type {SVGElement} */ - this.svgPath_ = Blockly.utils.createSvgElement('path', - {'class': 'blocklyPath blocklyBlockBackground'}, - this.svgGroup_); - this.svgPath_.tooltip = this; - - /** @type {boolean} */ - this.rendered = false; - - /** - * Whether to move the block to the drag surface when it is dragged. - * True if it should move, false if it should be translated directly. - * @type {boolean} - * @private - */ - this.useDragSurface_ = Blockly.utils.is3dSupported() && !!workspace.blockDragSurface_; - - Blockly.Tooltip.bindMouseEvents(this.svgPath_); - Blockly.BlockSvg.superClass_.constructor.call(this, - workspace, prototypeName, opt_id); - - // Expose this block's ID on its top-level SVG group. - if (this.svgGroup_.dataset) { - this.svgGroup_.dataset.id = this.id; - } -}; -goog.inherits(Blockly.BlockSvg, Blockly.Block); - -/** - * Height of this block, not including any statement blocks above or below. - * Height is in workspace units. - */ -Blockly.BlockSvg.prototype.height = 0; - -/** - * Width of this block, including any connected value blocks. - * Width is in workspace units. - */ -Blockly.BlockSvg.prototype.width = 0; - -/** - * Minimum width of block if insertion marker; comes from inserting block. - * @type {number} - */ -Blockly.BlockSvg.prototype.insertionMarkerMinWidth_ = 0; - -/** - * Opacity of this block between 0 and 1. - * @type {number} - * @private - */ -Blockly.BlockSvg.prototype.opacity_ = 1; - -/** - * Original location of block being dragged. - * @type {goog.math.Coordinate} - * @private - */ -Blockly.BlockSvg.prototype.dragStartXY_ = null; - -/** - * Whether the block glows as if running. - * @type {boolean} - * @private - */ -Blockly.BlockSvg.prototype.isGlowingBlock_ = false; - -/** - * Whether the block's whole stack glows as if running. - * @type {boolean} - * @private - */ -Blockly.BlockSvg.prototype.isGlowingStack_ = false; - -/** - * Constant for identifying rows that are to be rendered inline. - * Don't collide with Blockly.INPUT_VALUE and friends. - * @const - */ -Blockly.BlockSvg.INLINE = -1; - -/** - * Create and initialize the SVG representation of the block. - * May be called more than once. - */ -Blockly.BlockSvg.prototype.initSvg = function() { - goog.asserts.assert(this.workspace.rendered, 'Workspace is headless.'); - if (!this.isInsertionMarker()) { // Insertion markers not allowed to have inputs or icons - // Input shapes are empty holes drawn when a value input is not connected. - for (var i = 0, input; input = this.inputList[i]; i++) { - input.init(); - input.initOutlinePath(this.svgGroup_); - } - var icons = this.getIcons(); - for (i = 0; i < icons.length; i++) { - icons[i].createIcon(); - } - } - this.updateColour(); - this.updateMovable(); - if (!this.workspace.options.readOnly && !this.eventsInit_) { - Blockly.bindEventWithChecks_( - this.getSvgRoot(), 'mousedown', this, this.onMouseDown_); - } - this.eventsInit_ = true; - - if (!this.getSvgRoot().parentNode) { - this.workspace.getCanvas().appendChild(this.getSvgRoot()); - } -}; - -/** - * Select this block. Highlight it visually. - */ -Blockly.BlockSvg.prototype.select = function() { - if (this.isShadow() && this.getParent()) { - // Shadow blocks should not be selected. - this.getParent().select(); - return; - } - if (Blockly.selected == this) { - return; - } - var oldId = null; - if (Blockly.selected) { - oldId = Blockly.selected.id; - // Unselect any previously selected block. - Blockly.Events.disable(); - try { - Blockly.selected.unselect(); - } finally { - Blockly.Events.enable(); - } - } - var event = new Blockly.Events.Ui(null, 'selected', oldId, this.id); - event.workspaceId = this.workspace.id; - Blockly.Events.fire(event); - Blockly.selected = this; - this.addSelect(); -}; - -/** - * Unselect this block. Remove its highlighting. - */ -Blockly.BlockSvg.prototype.unselect = function() { - if (Blockly.selected != this) { - return; - } - var event = new Blockly.Events.Ui(null, 'selected', this.id, null); - event.workspaceId = this.workspace.id; - Blockly.Events.fire(event); - Blockly.selected = null; - this.removeSelect(); -}; - -/** - * Glow only this particular block, to highlight it visually as if it's running. - * @param {boolean} isGlowingBlock Whether the block should glow. - */ -Blockly.BlockSvg.prototype.setGlowBlock = function(isGlowingBlock) { - this.isGlowingBlock_ = isGlowingBlock; - this.updateColour(); -}; - -/** - * Glow the stack starting with this block, to highlight it visually as if it's running. - * @param {boolean} isGlowingStack Whether the stack starting with this block should glow. - */ -Blockly.BlockSvg.prototype.setGlowStack = function(isGlowingStack) { - this.isGlowingStack_ = isGlowingStack; - // Update the applied SVG filter if the property has changed - var svg = this.getSvgRoot(); - if (this.isGlowingStack_ && !svg.hasAttribute('filter')) { - var stackGlowFilterId = this.workspace.options.stackGlowFilterId || 'blocklyStackGlowFilter'; - svg.setAttribute('filter', 'url(#' + stackGlowFilterId + ')'); - } else if (!this.isGlowingStack_ && svg.hasAttribute('filter')) { - svg.removeAttribute('filter'); - } -}; - -/** - * Block's mutator icon (if any). - * @type {Blockly.Mutator} - */ -Blockly.BlockSvg.prototype.mutator = null; - -/** - * Block's comment icon (if any). - * @type {Blockly.Comment} - */ -Blockly.BlockSvg.prototype.comment = null; - -/** - * Block's warning icon (if any). - * @type {Blockly.Warning} - */ -Blockly.BlockSvg.prototype.warning = null; - -/** - * Returns a list of mutator, comment, and warning icons. - * @return {!Array} List of icons. - */ -Blockly.BlockSvg.prototype.getIcons = function() { - var icons = []; - if (this.mutator) { - icons.push(this.mutator); - } - if (this.comment) { - icons.push(this.comment); - } - if (this.warning) { - icons.push(this.warning); - } - return icons; -}; - -/** - * Set parent of this block to be a new block or null. - * @param {Blockly.BlockSvg} newParent New parent block. - */ -Blockly.BlockSvg.prototype.setParent = function(newParent) { - var oldParent = this.parentBlock_; - if (newParent == oldParent) { - return; - } - Blockly.Field.startCache(); - Blockly.BlockSvg.superClass_.setParent.call(this, newParent); - Blockly.Field.stopCache(); - - var svgRoot = this.getSvgRoot(); - - // Bail early if workspace is clearing, or we aren't rendered. - // We won't need to reattach ourselves anywhere. - if (this.workspace.isClearing || !svgRoot) { - return; - } - - var oldXY = this.getRelativeToSurfaceXY(); - if (newParent) { - newParent.getSvgRoot().appendChild(svgRoot); - var newXY = this.getRelativeToSurfaceXY(); - // Move the connections to match the child's new position. - this.moveConnections_(newXY.x - oldXY.x, newXY.y - oldXY.y); - // If we are a shadow block, inherit tertiary colour. - if (this.isShadow()) { - this.setColour(this.getColour(), this.getColourSecondary(), - newParent.getColourTertiary()); - } - } - // If we are losing a parent, we want to move our DOM element to the - // root of the workspace. - else if (oldParent) { - this.workspace.getCanvas().appendChild(svgRoot); - this.translate(oldXY.x, oldXY.y); - } - -}; - -/** - * Return the coordinates of the top-left corner of this block relative to the - * drawing surface's origin (0,0), in workspace units. - * If the block is on the workspace, (0, 0) is the origin of the workspace - * coordinate system. - * This does not change with workspace scale. - * @return {!goog.math.Coordinate} Object with .x and .y properties in - * workspace coordinates. - */ -Blockly.BlockSvg.prototype.getRelativeToSurfaceXY = function() { - // The drawing surface is relative to either the workspace canvas - // or to the drag surface group. - var x = 0; - var y = 0; - - var dragSurfaceGroup = this.useDragSurface_ ? - this.workspace.blockDragSurface_.getGroup() : null; - - var element = this.getSvgRoot(); - if (element) { - do { - // Loop through this block and every parent. - var xy = Blockly.utils.getRelativeXY(element); - x += xy.x; - y += xy.y; - // If this element is the current element on the drag surface, include - // the translation of the drag surface itself. - if (this.useDragSurface_ && - this.workspace.blockDragSurface_.getCurrentBlock() == element) { - var surfaceTranslation = this.workspace.blockDragSurface_.getSurfaceTranslation(); - x += surfaceTranslation.x; - y += surfaceTranslation.y; - } - element = element.parentNode; - } while (element && element != this.workspace.getCanvas() && - element != dragSurfaceGroup); - } - return new goog.math.Coordinate(x, y); -}; - -/** - * Move a block by a relative offset. - * @param {number} dx Horizontal offset in workspace units. - * @param {number} dy Vertical offset in workspace units. - */ -Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { - goog.asserts.assert(!this.parentBlock_, 'Block has parent.'); - var eventsEnabled = Blockly.Events.isEnabled(); - if (eventsEnabled) { - var event = new Blockly.Events.BlockMove(this); - } - var xy = this.getRelativeToSurfaceXY(); - this.translate(xy.x + dx, xy.y + dy); - this.moveConnections_(dx, dy); - if (eventsEnabled) { - event.recordNew(); - Blockly.Events.fire(event); - } - this.workspace.resizeContents(); -}; - -/** - * Transforms a block by setting the translation on the transform attribute - * of the block's SVG. - * @param {number} x The x coordinate of the translation in workspace units. - * @param {number} y The y coordinate of the translation in workspace units. - */ -Blockly.BlockSvg.prototype.translate = function(x, y) { - this.getSvgRoot().setAttribute('transform', - 'translate(' + x + ',' + y + ')'); -}; - -/** - * Move this block to its workspace's drag surface, accounting for positioning. - * Generally should be called at the same time as setDragging_(true). - * Does nothing if useDragSurface_ is false. - * @private - */ -Blockly.BlockSvg.prototype.moveToDragSurface_ = function() { - if (!this.useDragSurface_) { - return; - } - // The translation for drag surface blocks, - // is equal to the current relative-to-surface position, - // to keep the position in sync as it move on/off the surface. - // This is in workspace coordinates. - var xy = this.getRelativeToSurfaceXY(); - this.clearTransformAttributes_(); - this.workspace.blockDragSurface_.translateSurface(xy.x, xy.y); - // Execute the move on the top-level SVG component - this.workspace.blockDragSurface_.setBlocksAndShow(this.getSvgRoot()); -}; - -/** - * Move this block back to the workspace block canvas. - * Generally should be called at the same time as setDragging_(false). - * Does nothing if useDragSurface_ is false. - * @param {!goog.math.Coordinate} newXY The position the block should take on - * on the workspace canvas, in workspace coordinates. - * @private - */ -Blockly.BlockSvg.prototype.moveOffDragSurface_ = function(newXY) { - if (!this.useDragSurface_) { - return; - } - // Translate to current position, turning off 3d. - this.translate(newXY.x, newXY.y); - this.workspace.blockDragSurface_.clearAndHide(this.workspace.getCanvas()); -}; - -/** - * Move this block during a drag, taking into account whether we are using a - * drag surface to translate blocks. - * This block must be a top-level block. - * @param {!goog.math.Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ -Blockly.BlockSvg.prototype.moveDuringDrag = function(newLoc) { - if (this.useDragSurface_) { - this.workspace.blockDragSurface_.translateSurface(newLoc.x, newLoc.y); - } else { - this.svgGroup_.translate_ = 'translate(' + newLoc.x + ',' + newLoc.y + ')'; - this.svgGroup_.setAttribute('transform', - this.svgGroup_.translate_ + this.svgGroup_.skew_); - } -}; - -/** - * Clear the block of transform="..." attributes. - * Used when the block is switching from 3d to 2d transform or vice versa. - * @private - */ -Blockly.BlockSvg.prototype.clearTransformAttributes_ = function() { - Blockly.utils.removeAttribute(this.getSvgRoot(), 'transform'); -}; - -/** - * Snap this block to the nearest grid point. - */ -Blockly.BlockSvg.prototype.snapToGrid = function() { - if (!this.workspace) { - return; // Deleted block. - } - if (this.workspace.isDragging()) { - return; // Don't bump blocks during a drag. - } - if (this.getParent()) { - return; // Only snap top-level blocks. - } - if (this.isInFlyout) { - return; // Don't move blocks around in a flyout. - } - var grid = this.workspace.getGrid(); - if (!grid || !grid.shouldSnap()) { - return; // Config says no snapping. - } - var spacing = grid.getSpacing(); - var half = spacing / 2; - var xy = this.getRelativeToSurfaceXY(); - var dx = Math.round((xy.x - half) / spacing) * spacing + half - xy.x; - var dy = Math.round((xy.y - half) / spacing) * spacing + half - xy.y; - dx = Math.round(dx); - dy = Math.round(dy); - if (dx != 0 || dy != 0) { - this.moveBy(dx, dy); - } -}; - -/** - * Returns the coordinates of a bounding box describing the dimensions of this - * block and any blocks stacked below it. - * Coordinate system: workspace coordinates. - * @return {!{topLeft: goog.math.Coordinate, bottomRight: goog.math.Coordinate}} - * Object with top left and bottom right coordinates of the bounding box. - */ -Blockly.BlockSvg.prototype.getBoundingRectangle = function() { - var blockXY = this.getRelativeToSurfaceXY(this); - var blockBounds = this.getHeightWidth(); - var topLeft; - var bottomRight; - if (this.RTL) { - topLeft = new goog.math.Coordinate(blockXY.x - blockBounds.width, - blockXY.y); - bottomRight = new goog.math.Coordinate(blockXY.x, - blockXY.y + blockBounds.height); - } else { - topLeft = new goog.math.Coordinate(blockXY.x, blockXY.y); - bottomRight = new goog.math.Coordinate(blockXY.x + blockBounds.width, - blockXY.y + blockBounds.height); - } - - return {topLeft: topLeft, bottomRight: bottomRight}; -}; - -/** - * Set block opacity for SVG rendering. - * @param {number} opacity Intended opacity, betweeen 0 and 1 - */ -Blockly.BlockSvg.prototype.setOpacity = function(opacity) { - this.opacity_ = opacity; - if (this.rendered) { - this.updateColour(); - } -}; - -/** - * Get block opacity for SVG rendering. - * @return {number} Intended opacity, betweeen 0 and 1 - */ -Blockly.BlockSvg.prototype.getOpacity = function() { - return this.opacity_; -}; - -/** - * Set whether the block is collapsed or not. - * @param {boolean} collapsed True if collapsed. - */ -Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { - if (this.collapsed_ == collapsed) { - return; - } - var renderList = []; - // Show/hide the inputs. - for (var i = 0, input; input = this.inputList[i]; i++) { - renderList.push.apply(renderList, input.setVisible(!collapsed)); - } - - var COLLAPSED_INPUT_NAME = '_TEMP_COLLAPSED_INPUT'; - if (collapsed) { - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].setVisible(false); - } - var text = this.toString(Blockly.COLLAPSE_CHARS); - this.appendDummyInput(COLLAPSED_INPUT_NAME).appendField(text).init(); - } else { - this.removeInput(COLLAPSED_INPUT_NAME); - // Clear any warnings inherited from enclosed blocks. - this.setWarningText(null); - } - Blockly.BlockSvg.superClass_.setCollapsed.call(this, collapsed); - - if (!renderList.length) { - // No child blocks, just render this block. - renderList[0] = this; - } - if (this.rendered) { - for (var i = 0, block; block = renderList[i]; i++) { - block.render(); - } - // Don't bump neighbours. - // Although bumping neighbours would make sense, users often collapse - // all their functions and store them next to each other. Expanding and - // bumping causes all their definitions to go out of alignment. - } -}; - -/** - * Open the next (or previous) FieldTextInput. - * @param {Blockly.Field|Blockly.Block} start Current location. - * @param {boolean} forward If true go forward, otherwise backward. - */ -Blockly.BlockSvg.prototype.tab = function(start, forward) { - var list = this.createTabList_(); - var i = list.indexOf(start); - if (i == -1) { - // No start location, start at the beginning or end. - i = forward ? -1 : list.length; - } - var target = list[forward ? i + 1 : i - 1]; - if (!target) { - // Ran off of list. - // If there is an output, tab up to that block. - var outputBlock = this.outputConnection && this.outputConnection.targetBlock(); - if (outputBlock) { - outputBlock.tab(this, forward); - } else { // Otherwise, go to next / previous block, depending on value of `forward` - var block = forward ? this.getNextBlock() : this.getPreviousBlock(); - if (block) { - block.tab(this, forward); - } - } - } else if (target instanceof Blockly.Field) { - target.showEditor_(); - } else { - target.tab(null, forward); - } -}; - -/** - * Create an ordered list of all text fields and connected inputs. - * @return {!Array.} The ordered list. - * @private - */ -Blockly.BlockSvg.prototype.createTabList_ = function() { - // This function need not be efficient since it runs once on a keypress. - var list = []; - for (var i = 0, input; input = this.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field instanceof Blockly.FieldTextInput) { - // TODO(# 1276): Also support dropdown fields. - list.push(field); - } - } - if (input.connection) { - var block = input.connection.targetBlock(); - if (block) { - list.push(block); - } - } - } - return list; -}; - -/** - * Handle a mouse-down on an SVG block. - * @param {!Event} e Mouse down event or touch start event. - * @private - */ -Blockly.BlockSvg.prototype.onMouseDown_ = function(e) { - var gesture = this.workspace && this.workspace.getGesture(e); - if (gesture) { - gesture.handleBlockStart(e, this); - } -}; - -/** - * Load the block's help page in a new window. - * @private - */ -Blockly.BlockSvg.prototype.showHelp_ = function() { - var url = goog.isFunction(this.helpUrl) ? this.helpUrl() : this.helpUrl; - if (url) { - // @todo rewrite - alert(url); - } -}; - - -/** - * Show the context menu for this block. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.BlockSvg.prototype.showContextMenu_ = function(e) { - if (this.workspace.options.readOnly || !this.contextMenu) { - return; - } - // Save the current block in a variable for use in closures. - var block = this; - var menuOptions = []; - if (this.isDeletable() && this.isMovable() && !block.isInFlyout) { - menuOptions.push( - Blockly.ContextMenu.blockDuplicateOption(block, e)); - if (this.isEditable() && this.workspace.options.comments) { - menuOptions.push(Blockly.ContextMenu.blockCommentOption(block)); - } - menuOptions.push(Blockly.ContextMenu.blockDeleteOption(block)); - } else if (this.parentBlock_ && this.isShadow_) { - this.parentBlock_.showContextMenu_(e); - return; - } - - // Allow the block to add or modify menuOptions. - if (this.customContextMenu) { - this.customContextMenu(menuOptions); - } - Blockly.ContextMenu.show(e, menuOptions, this.RTL); - Blockly.ContextMenu.currentBlock = this; -}; - -/** - * Move the connections for this block and all blocks attached under it. - * Also update any attached bubbles. - * @param {number} dx Horizontal offset from current location, in workspace - * units. - * @param {number} dy Vertical offset from current location, in workspace - * units. - * @private - */ -Blockly.BlockSvg.prototype.moveConnections_ = function(dx, dy) { - if (!this.rendered) { - // Rendering is required to lay out the blocks. - // This is probably an invisible block attached to a collapsed block. - return; - } - var myConnections = this.getConnections_(false); - for (var i = 0; i < myConnections.length; i++) { - myConnections[i].moveBy(dx, dy); - } - var icons = this.getIcons(); - for (i = 0; i < icons.length; i++) { - icons[i].computeIconLocation(); - } - - // Recurse through all blocks attached under this one. - for (i = 0; i < this.childBlocks_.length; i++) { - this.childBlocks_[i].moveConnections_(dx, dy); - } -}; - -/** - * Recursively adds or removes the dragging class to this node and its children. - * @param {boolean} adding True if adding, false if removing. - * @package - */ -Blockly.BlockSvg.prototype.setDragging = function(adding) { - if (adding) { - var group = this.getSvgRoot(); - group.translate_ = ''; - group.skew_ = ''; - Blockly.draggingConnections_ = - Blockly.draggingConnections_.concat(this.getConnections_(true)); - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging'); - } else { - Blockly.draggingConnections_ = []; - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging'); - } - // Recurse through all blocks attached under this one. - for (var i = 0; i < this.childBlocks_.length; i++) { - this.childBlocks_[i].setDragging(adding); - } -}; - -/** - * Add or remove the UI indicating if this block is movable or not. - */ -Blockly.BlockSvg.prototype.updateMovable = function() { - if (this.isMovable()) { - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggable'); - } else { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggable'); - } -}; - -/** - * Set whether this block is movable or not. - * @param {boolean} movable True if movable. - */ -Blockly.BlockSvg.prototype.setMovable = function(movable) { - Blockly.BlockSvg.superClass_.setMovable.call(this, movable); - this.updateMovable(); -}; - -/** - * Set whether this block is editable or not. - * @param {boolean} editable True if editable. - */ -Blockly.BlockSvg.prototype.setEditable = function(editable) { - Blockly.BlockSvg.superClass_.setEditable.call(this, editable); - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].updateEditable(); - } -}; - -/** - * Set whether this block is a shadow block or not. - * @param {boolean} shadow True if a shadow. - */ -Blockly.BlockSvg.prototype.setShadow = function(shadow) { - Blockly.BlockSvg.superClass_.setShadow.call(this, shadow); - this.updateColour(); -}; - -/** - * Set whether this block is an insertion marker block or not. - * @param {boolean} insertionMarker True if an insertion marker. - * @param {Number=} opt_minWidth Optional minimum width of the marker. - */ -Blockly.BlockSvg.prototype.setInsertionMarker = function(insertionMarker, opt_minWidth) { - Blockly.BlockSvg.superClass_.setInsertionMarker.call(this, insertionMarker); - this.insertionMarkerMinWidth_ = opt_minWidth; - this.updateColour(); -}; - -/** - * Return the root node of the SVG or null if none exists. - * @return {Element} The root SVG node (probably a group). - */ -Blockly.BlockSvg.prototype.getSvgRoot = function() { - return this.svgGroup_; -}; - -/** - * Dispose of this block. - * @param {boolean} healStack If true, then try to heal any gap by connecting - * the next statement with the previous statement. Otherwise, dispose of - * all children of this block. - * @param {boolean} animate If true, show a disposal animation and sound. - */ -Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { - if (!this.workspace) { - // The block has already been deleted. - return; - } - Blockly.Tooltip.hide(); - Blockly.Field.startCache(); - // Save the block's workspace temporarily so we can resize the - // contents once the block is disposed. - var blockWorkspace = this.workspace; - // If this block is being dragged, unlink the mouse events. - if (Blockly.selected == this) { - this.unselect(); - this.workspace.cancelCurrentGesture(); - } - // If this block has a context menu open, close it. - if (Blockly.ContextMenu.currentBlock == this) { - Blockly.ContextMenu.hide(); - } - - if (animate && this.rendered) { - this.unplug(healStack); - Blockly.BlockAnimations.disposeUiEffect(this); - } - // Stop rerendering. - this.rendered = false; - - Blockly.Events.disable(); - try { - var icons = this.getIcons(); - for (var i = 0; i < icons.length; i++) { - icons[i].dispose(); - } - } finally { - Blockly.Events.enable(); - } - Blockly.BlockSvg.superClass_.dispose.call(this, healStack); - - goog.dom.removeNode(this.svgGroup_); - blockWorkspace.resizeContents(); - // Sever JavaScript to DOM connections. - this.svgGroup_ = null; - this.svgPath_ = null; - Blockly.Field.stopCache(); -}; - -/** - * Enable or disable a block. - */ -Blockly.BlockSvg.prototype.updateDisabled = function() { - // not supported -}; - -/** - * Returns the comment on this block (or '' if none). - * @return {string} Block's comment. - */ -Blockly.BlockSvg.prototype.getCommentText = function() { - if (this.comment) { - var comment = this.comment.getText(); - // Trim off trailing whitespace. - return comment.replace(/\s+$/, '').replace(/ +\n/g, '\n'); - } - return ''; -}; - -/** - * Set this block's comment text. - * @param {?string} text The text, or null to delete. - * @param {string=} commentId Id of the comment, or a new one will be generated if not provided. - * @param {number=} commentX Optional x position for scratch comment in workspace coordinates - * @param {number=} commentY Optional y position for scratch comment in workspace coordinates - * @param {boolean=} minimized Optional minimized state for scratch comment, defaults to false - */ -Blockly.BlockSvg.prototype.setCommentText = function(text, commentId, - commentX, commentY, minimized) { - var changedState = false; - if (goog.isString(text)) { - if (!this.comment) { - this.comment = new Blockly.ScratchBlockComment(this, text, commentId, - commentX, commentY, minimized); - changedState = true; - } else { - this.comment.setText(/** @type {string} */ (text)); - } - } else { - if (this.comment) { - this.comment.dispose(); - changedState = true; - } - } - if (changedState && this.rendered) { - this.render(); - if (goog.isString(text)) { - this.comment.setVisible(true); - } - // Adding or removing a comment icon will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Set this block's warning text. - * @param {?string} text The text, or null to delete. - * @param {string=} opt_id An optional ID for the warning text to be able to - * maintain multiple warnings. - */ -Blockly.BlockSvg.prototype.setWarningText = function(text, opt_id) { - if (!this.setWarningText.pid_) { - // Create a database of warning PIDs. - // Only runs once per block (and only those with warnings). - this.setWarningText.pid_ = Object.create(null); - } - var id = opt_id || ''; - if (!id) { - // Kill all previous pending processes, this edit supersedes them all. - for (var n in this.setWarningText.pid_) { - clearTimeout(this.setWarningText.pid_[n]); - delete this.setWarningText.pid_[n]; - } - } else if (this.setWarningText.pid_[id]) { - // Only queue up the latest change. Kill any earlier pending process. - clearTimeout(this.setWarningText.pid_[id]); - delete this.setWarningText.pid_[id]; - } - if (this.workspace.isDragging()) { - // Don't change the warning text during a drag. - // Wait until the drag finishes. - var thisBlock = this; - this.setWarningText.pid_[id] = setTimeout(function() { - if (thisBlock.workspace) { // Check block wasn't deleted. - delete thisBlock.setWarningText.pid_[id]; - thisBlock.setWarningText(text, id); - } - }, 100); - return; - } - if (this.isInFlyout) { - text = null; - } - - var changedState = false; - if (goog.isString(text)) { - if (!this.warning) { - this.warning = new Blockly.Warning(this); - changedState = true; - } - this.warning.setText(/** @type {string} */ (text), id); - } else { - // Dispose all warnings if no ID is given. - if (this.warning && !id) { - this.warning.dispose(); - changedState = true; - } else if (this.warning) { - var oldText = this.warning.getText(); - this.warning.setText('', id); - var newText = this.warning.getText(); - if (!newText) { - this.warning.dispose(); - } - changedState = oldText != newText; - } - } - if (changedState && this.rendered) { - this.render(); - // Adding or removing a warning icon will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Give this block a mutator dialog. - * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. - */ -Blockly.BlockSvg.prototype.setMutator = function(mutator) { - if (this.mutator && this.mutator !== mutator) { - this.mutator.dispose(); - } - if (mutator) { - mutator.block_ = this; - this.mutator = mutator; - mutator.createIcon(); - } -}; - -/** - * Select this block. Highlight it visually. - */ -Blockly.BlockSvg.prototype.addSelect = function() { - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklySelected'); -}; - -/** - * Unselect this block. Remove its highlighting. - */ -Blockly.BlockSvg.prototype.removeSelect = function() { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklySelected'); -}; - -/** - * Update the cursor over this block by adding or removing a class. - * @param {boolean} letMouseThrough True if the blocks should ignore pointer - * events, false otherwise. - * @package - */ -Blockly.BlockSvg.prototype.setMouseThroughStyle = function(letMouseThrough) { - if (letMouseThrough) { - Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDraggingMouseThrough'); - } else { - Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDraggingMouseThrough'); - } -}; - -/** - * Update the cursor over this block by adding or removing a class. - * @param {boolean} enable True if the delete cursor should be shown, false - * otherwise. - * @package - */ -Blockly.BlockSvg.prototype.setDeleteStyle = function(enable) { - if (enable) { - Blockly.utils.addClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDraggingDelete'); - } else { - Blockly.utils.removeClass(/** @type {!Element} */ (this.svgGroup_), - 'blocklyDraggingDelete'); - } -}; - -// Overrides of functions on Blockly.Block that take into account whether the -// block has been rendered. - -/** - * Change the colour of a block. - * @param {number|string} colour HSV hue value, or #RRGGBB string. - * @param {number|string} colourSecondary Secondary HSV hue value, or #RRGGBB - * string. - * @param {number|string} colourTertiary Tertiary HSV hue value, or #RRGGBB - * string. - */ -Blockly.BlockSvg.prototype.setColour = function(colour, colourSecondary, - colourTertiary) { - Blockly.BlockSvg.superClass_.setColour.call(this, colour, colourSecondary, - colourTertiary); - - if (this.rendered) { - this.updateColour(); - } -}; - -/** - * Move this block to the front of the visible workspace. - * tags do not respect z-index so SVG renders them in the - * order that they are in the DOM. By placing this block first within the - * block group's , it will render on top of any other blocks. - * @package - */ -Blockly.BlockSvg.prototype.bringToFront = function() { - var block = this; - do { - var root = block.getSvgRoot(); - root.parentNode.appendChild(root); - block = block.getParent(); - } while (block); -}; - -/** - * Set whether this block can chain onto the bottom of another block. - * @param {boolean} newBoolean True if there can be a previous statement. - * @param {(string|Array.|null)=} opt_check Statement type or - * list of statement types. Null/undefined if any type could be connected. - */ -Blockly.BlockSvg.prototype.setPreviousStatement = function(newBoolean, - opt_check) { - Blockly.BlockSvg.superClass_.setPreviousStatement.call(this, newBoolean, - opt_check); - - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Set whether another block can chain onto the bottom of this block. - * @param {boolean} newBoolean True if there can be a next statement. - * @param {(string|Array.|null)=} opt_check Statement type or - * list of statement types. Null/undefined if any type could be connected. - */ -Blockly.BlockSvg.prototype.setNextStatement = function(newBoolean, opt_check) { - Blockly.BlockSvg.superClass_.setNextStatement.call(this, newBoolean, - opt_check); - - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Set whether this block returns a value. - * @param {boolean} newBoolean True if there is an output. - * @param {(string|Array.|null)=} opt_check Returned type or list - * of returned types. Null or undefined if any type could be returned - * (e.g. variable get). - */ -Blockly.BlockSvg.prototype.setOutput = function(newBoolean, opt_check) { - Blockly.BlockSvg.superClass_.setOutput.call(this, newBoolean, opt_check); - - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Set whether value inputs are arranged horizontally or vertically. - * @param {boolean} newBoolean True if inputs are horizontal. - */ -Blockly.BlockSvg.prototype.setInputsInline = function(newBoolean) { - Blockly.BlockSvg.superClass_.setInputsInline.call(this, newBoolean); - - if (this.rendered) { - this.render(); - this.bumpNeighbours_(); - } -}; - -/** - * Remove an input from this block. - * @param {string} name The name of the input. - * @param {boolean=} opt_quiet True to prevent error if input is not present. - * @throws {goog.asserts.AssertionError} if the input is not present and - * opt_quiet is not true. - */ -Blockly.BlockSvg.prototype.removeInput = function(name, opt_quiet) { - Blockly.BlockSvg.superClass_.removeInput.call(this, name, opt_quiet); - - if (this.rendered) { - this.render(); - // Removing an input will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Move a numbered input to a different location on this block. - * @param {number} inputIndex Index of the input to move. - * @param {number} refIndex Index of input that should be after the moved input. - */ -Blockly.BlockSvg.prototype.moveNumberedInputBefore = function( - inputIndex, refIndex) { - Blockly.BlockSvg.superClass_.moveNumberedInputBefore.call(this, inputIndex, - refIndex); - - if (this.rendered) { - this.render(); - // Moving an input will cause the block to change shape. - this.bumpNeighbours_(); - } -}; - -/** - * Add a value input, statement input or local variable to this block. - * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or - * Blockly.DUMMY_INPUT. - * @param {string} name Language-neutral identifier which may used to find this - * input again. Should be unique to this block. - * @return {!Blockly.Input} The input object created. - * @private - */ -Blockly.BlockSvg.prototype.appendInput_ = function(type, name) { - var input = Blockly.BlockSvg.superClass_.appendInput_.call(this, type, name); - - if (this.rendered) { - this.render(); - // Adding an input will cause the block to change shape. - this.bumpNeighbours_(); - } - return input; -}; - -/** - * Returns connections originating from this block. - * @param {boolean} all If true, return all connections even hidden ones. - * Otherwise, for a non-rendered block return an empty list, and for a - * collapsed block don't return inputs connections. - * @return {!Array.} Array of connections. - * @package - */ -Blockly.BlockSvg.prototype.getConnections_ = function(all) { - var myConnections = []; - if (all || this.rendered) { - if (this.outputConnection) { - myConnections.push(this.outputConnection); - } - if (this.previousConnection) { - myConnections.push(this.previousConnection); - } - if (this.nextConnection) { - myConnections.push(this.nextConnection); - } - if (all || !this.collapsed_) { - for (var i = 0, input; input = this.inputList[i]; i++) { - if (input.connection) { - myConnections.push(input.connection); - } - } - } - } - return myConnections; -}; - -/** - * Create a connection of the specified type. - * @param {number} type The type of the connection to create. - * @return {!Blockly.RenderedConnection} A new connection of the specified type. - * @private - */ -Blockly.BlockSvg.prototype.makeConnection_ = function(type) { - return new Blockly.RenderedConnection(this, type); -}; - -/** - * Bump unconnected blocks out of alignment. Two blocks which aren't actually - * connected should not coincidentally line up on screen. - * @private - */ -Blockly.BlockSvg.prototype.bumpNeighbours_ = function() { - if (!this.workspace) { - return; // Deleted block. - } - if (this.workspace.isDragging()) { - return; // Don't bump blocks during a drag. - } - var rootBlock = this.getRootBlock(); - if (rootBlock.isInFlyout) { - return; // Don't move blocks around in a flyout. - } - // Loop through every connection on this block. - var myConnections = this.getConnections_(false); - for (var i = 0, connection; connection = myConnections[i]; i++) { - - // Spider down from this block bumping all sub-blocks. - if (connection.isConnected() && connection.isSuperior()) { - connection.targetBlock().bumpNeighbours_(); - } - - var neighbours = connection.neighbours_(Blockly.SNAP_RADIUS); - for (var j = 0, otherConnection; otherConnection = neighbours[j]; j++) { - - // If both connections are connected, that's probably fine. But if - // either one of them is unconnected, then there could be confusion. - if (!connection.isConnected() || !otherConnection.isConnected()) { - // Only bump blocks if they are from different tree structures. - if (otherConnection.getSourceBlock().getRootBlock() != rootBlock) { - - // Always bump the inferior block. - if (connection.isSuperior()) { - otherConnection.bumpAwayFrom_(connection); - } else { - connection.bumpAwayFrom_(otherConnection); - } - } - } - } - } -}; - -/** - * Schedule snapping to grid and bumping neighbours to occur after a brief - * delay. - * @package - */ -Blockly.BlockSvg.prototype.scheduleSnapAndBump = function() { - var block = this; - // Ensure that any snap and bump are part of this move's event group. - var group = Blockly.Events.getGroup(); - - setTimeout(function() { - Blockly.Events.setGroup(group); - block.snapToGrid(); - Blockly.Events.setGroup(false); - }, Blockly.BUMP_DELAY / 2); - - setTimeout(function() { - Blockly.Events.setGroup(group); - block.bumpNeighbours_(); - Blockly.Events.setGroup(false); - }, Blockly.BUMP_DELAY); -}; diff --git a/packages/scratch-blocks/core/blockly.js b/packages/scratch-blocks/core/blockly.js deleted file mode 100644 index fa0b48489..000000000 --- a/packages/scratch-blocks/core/blockly.js +++ /dev/null @@ -1,622 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Core JavaScript library for Blockly. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * The top level namespace used to access the Blockly library. - * @namespace Blockly - **/ -goog.provide('Blockly'); - -goog.require('Blockly.BlockSvg.render'); -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.Events'); -goog.require('Blockly.FieldAngle'); -goog.require('Blockly.FieldCheckbox'); -goog.require('Blockly.FieldColour'); -goog.require('Blockly.FieldColourSlider'); -// Date picker commented out since it increases footprint by 60%. -// Add it only if you need it. -//goog.require('Blockly.FieldDate'); -goog.require('Blockly.FieldDropdown'); -goog.require('Blockly.FieldIconMenu'); -goog.require('Blockly.FieldImage'); -goog.require('Blockly.FieldNote'); -goog.require('Blockly.FieldTextInput'); -goog.require('Blockly.FieldTextInputRemovable'); -goog.require('Blockly.FieldTextDropdown'); -goog.require('Blockly.FieldNumber'); -goog.require('Blockly.FieldNumberDropdown'); -goog.require('Blockly.FieldMatrix'); -goog.require('Blockly.FieldVariable'); -goog.require('Blockly.FieldVerticalSeparator'); -goog.require('Blockly.Generator'); -goog.require('Blockly.Msg'); -goog.require('Blockly.Procedures'); -goog.require('Blockly.ScratchMsgs'); -goog.require('Blockly.Toolbox'); -goog.require('Blockly.Touch'); -goog.require('Blockly.WidgetDiv'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('Blockly.constants'); -goog.require('Blockly.inject'); -goog.require('Blockly.utils'); -goog.require('goog.color'); - - -// Turn off debugging when compiled. -/* eslint-disable no-unused-vars */ -var CLOSURE_DEFINES = {'goog.DEBUG': false}; -/* eslint-enable no-unused-vars */ - -/** - * The main workspace most recently used. - * Set by Blockly.WorkspaceSvg.prototype.markFocused - * @type {Blockly.Workspace} - */ -Blockly.mainWorkspace = null; - -/** - * Currently selected block. - * @type {Blockly.Block} - */ -Blockly.selected = null; - -/** - * All of the connections on blocks that are currently being dragged. - * @type {!Array.} - * @private - */ -Blockly.draggingConnections_ = []; - -/** - * Contents of the local clipboard. - * @type {Element} - * @private - */ -Blockly.clipboardXml_ = null; - -/** - * Source of the local clipboard. - * @type {Blockly.WorkspaceSvg} - * @private - */ -Blockly.clipboardSource_ = null; - -/** - * Cached value for whether 3D is supported. - * @type {!boolean} - * @private - */ -Blockly.cache3dSupported_ = null; - -/** - * Convert a hue (HSV model) into an RGB hex triplet. - * @param {number} hue Hue on a colour wheel (0-360). - * @return {string} RGB code, e.g. '#5ba65b'. - */ -Blockly.hueToRgb = function(hue) { - return goog.color.hsvToHex(hue, Blockly.HSV_SATURATION, - Blockly.HSV_VALUE * 255); -}; - -/** - * Returns the dimensions of the specified SVG image. - * @param {!Element} svg SVG image. - * @return {!Object} Contains width and height properties. - */ -Blockly.svgSize = function(svg) { - return { - width: svg.cachedWidth_, - height: svg.cachedHeight_ - }; -}; - -/** - * Size the workspace when the contents change. This also updates - * scrollbars accordingly. - * @param {!Blockly.WorkspaceSvg} workspace The workspace to resize. - */ -Blockly.resizeSvgContents = function(workspace) { - workspace.resizeContents(); -}; - -/** - * Size the SVG image to completely fill its container. Call this when the view - * actually changes sizes (e.g. on a window resize/device orientation change). - * See Blockly.resizeSvgContents to resize the workspace when the contents - * change (e.g. when a block is added or removed). - * Record the height/width of the SVG image. - * @param {!Blockly.WorkspaceSvg} workspace Any workspace in the SVG. - */ -Blockly.svgResize = function(workspace) { - var mainWorkspace = workspace; - while (mainWorkspace.options.parentWorkspace) { - mainWorkspace = mainWorkspace.options.parentWorkspace; - } - var svg = mainWorkspace.getParentSvg(); - var div = svg.parentNode; - if (!div) { - // Workspace deleted, or something. - return; - } - var width = div.offsetWidth; - var height = div.offsetHeight; - if (svg.cachedWidth_ != width) { - svg.setAttribute('width', width + 'px'); - svg.cachedWidth_ = width; - } - if (svg.cachedHeight_ != height) { - svg.setAttribute('height', height + 'px'); - svg.cachedHeight_ = height; - } - mainWorkspace.resize(); -}; - -/** - * Handle a key-down on SVG drawing surface. Does nothing if the main workspace is not visible. - * @param {!Event} e Key down event. - * @private - */ -// TODO (https://github.com/google/blockly/issues/1998) handle cases where there are multiple workspaces -// and non-main workspaces are able to accept input. -Blockly.onKeyDown_ = function(e) { - if (Blockly.mainWorkspace.options.readOnly || Blockly.utils.isTargetInput(e) - || (Blockly.mainWorkspace.rendered && !Blockly.mainWorkspace.isVisible())) { - // No key actions on readonly workspaces. - // When focused on an HTML text input widget, don't trap any keys. - // Ignore keypresses on rendered workspaces that have been explicitly - // hidden. - return; - } - var deleteBlock = false; - if (e.keyCode == 27) { - // Pressing esc closes the context menu and any drop-down - Blockly.hideChaff(); - Blockly.DropDownDiv.hide(); - } else if (e.keyCode == 8 || e.keyCode == 46) { - // Delete or backspace. - // Stop the browser from going back to the previous page. - // Do this first to prevent an error in the delete code from resulting in - // data loss. - e.preventDefault(); - // Don't delete while dragging. Jeez. - if (Blockly.mainWorkspace.isDragging()) { - return; - } - if (Blockly.selected && Blockly.selected.isDeletable()) { - deleteBlock = true; - } - } else if (e.altKey || e.ctrlKey || e.metaKey) { - // Don't use meta keys during drags. - if (Blockly.mainWorkspace.isDragging()) { - return; - } - if (Blockly.selected && - Blockly.selected.isDeletable() && Blockly.selected.isMovable()) { - // Don't allow copying immovable or undeletable blocks. The next step - // would be to paste, which would create additional undeletable/immovable - // blocks on the workspace. - if (e.keyCode == 67) { - // 'c' for copy. - Blockly.hideChaff(); - Blockly.copy_(Blockly.selected); - } else if (e.keyCode == 88 && !Blockly.selected.workspace.isFlyout) { - // 'x' for cut, but not in a flyout. - // Don't even copy the selected item in the flyout. - Blockly.copy_(Blockly.selected); - deleteBlock = true; - } - } - if (e.keyCode == 86) { - // 'v' for paste. - if (Blockly.clipboardXml_) { - Blockly.Events.setGroup(true); - // Pasting always pastes to the main workspace, even if the copy started - // in a flyout workspace. - var workspace = Blockly.clipboardSource_; - if (workspace.isFlyout) { - workspace = workspace.targetWorkspace; - } - workspace.paste(Blockly.clipboardXml_); - Blockly.Events.setGroup(false); - } - } else if (e.keyCode == 90) { - // 'z' for undo 'Z' is for redo. - Blockly.hideChaff(); - Blockly.mainWorkspace.undo(e.shiftKey); - } - } - // Common code for delete and cut. - // Don't delete in the flyout. - if (deleteBlock && !Blockly.selected.workspace.isFlyout) { - Blockly.Events.setGroup(true); - Blockly.hideChaff(); - Blockly.selected.dispose(/* heal */ true, true); - Blockly.Events.setGroup(false); - } -}; - -/** - * Copy a block or workspace comment onto the local clipboard. - * @param {!Blockly.Block | !Blockly.WorkspaceComment} toCopy Block or Workspace Comment - * to be copied. - * @private - */ -Blockly.copy_ = function(toCopy) { - if (toCopy.isComment) { - var xml = toCopy.toXmlWithXY(); - } else { - var xml = Blockly.Xml.blockToDom(toCopy); - // Encode start position in XML. - var xy = toCopy.getRelativeToSurfaceXY(); - xml.setAttribute('x', toCopy.RTL ? -xy.x : xy.x); - xml.setAttribute('y', xy.y); - } - Blockly.clipboardXml_ = xml; - Blockly.clipboardSource_ = toCopy.workspace; -}; - -/** - * Duplicate this block and its children, or a workspace comment. - * @param {!Blockly.Block | !Blockly.WorkspaceComment} toDuplicate Block or - * Workspace Comment to be copied. - * @private - */ -Blockly.duplicate_ = function(toDuplicate) { - // Save the clipboard. - var clipboardXml = Blockly.clipboardXml_; - var clipboardSource = Blockly.clipboardSource_; - - // Create a duplicate via a copy/paste operation. - Blockly.copy_(toDuplicate); - toDuplicate.workspace.paste(Blockly.clipboardXml_); - - // Restore the clipboard. - Blockly.clipboardXml_ = clipboardXml; - Blockly.clipboardSource_ = clipboardSource; -}; - -/** - * Cancel the native context menu, unless the focus is on an HTML input widget. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.onContextMenu_ = function(e) { - if (!Blockly.utils.isTargetInput(e)) { - // When focused on an HTML text input widget, don't cancel the context menu. - e.preventDefault(); - } -}; - -/** - * Close tooltips, context menus, dropdown selections, etc. - * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. - */ -Blockly.hideChaff = function(opt_allowToolbox) { - Blockly.hideChaffInternal_(opt_allowToolbox); - Blockly.WidgetDiv.hide(true); -}; - -/** - * Close tooltips, context menus, dropdown selections, etc. - * For some elements (e.g. field text inputs), rather than hiding, it will - * move them. - * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. - */ -Blockly.hideChaffOnResize = function(opt_allowToolbox) { - Blockly.hideChaffInternal_(opt_allowToolbox); - Blockly.WidgetDiv.repositionForWindowResize(); -}; - -/** - * Does a majority of the work for hideChaff including tooltips, dropdowns, - * toolbox, etc. It does not deal with the WidgetDiv. - * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. - * @private - */ -Blockly.hideChaffInternal_ = function(opt_allowToolbox) { - Blockly.Tooltip.hide(); - Blockly.DropDownDiv.hideWithoutAnimation(); - if (!opt_allowToolbox) { - var workspace = Blockly.getMainWorkspace(); - if (workspace.toolbox_ && - workspace.toolbox_.flyout_ && - workspace.toolbox_.flyout_.autoClose) { - workspace.toolbox_.clearSelection(); - } - } -}; - -/** - * Returns the main workspace. Returns the last used main workspace (based on - * focus). Try not to use this function, particularly if there are multiple - * Blockly instances on a page. - * @return {!Blockly.Workspace} The main workspace. - */ -Blockly.getMainWorkspace = function() { - return Blockly.mainWorkspace; -}; - -/** - * Wrapper to window.alert() that app developers may override to - * provide alternatives to the modal browser window. - * @param {string} message The message to display to the user. - * @param {function()=} opt_callback The callback when the alert is dismissed. - */ -Blockly.alert = function(message, opt_callback) { - window.alert(message); - if (opt_callback) { - opt_callback(); - } -}; - -/** - * Wrapper to window.confirm() that app developers may override to - * provide alternatives to the modal browser window. - * @param {string} message The message to display to the user. - * @param {!function(boolean)} callback The callback for handling user response. - */ -Blockly.confirm = function(message, callback) { - callback(window.confirm(message)); -}; - -/** - * Wrapper to window.prompt() that app developers may override to provide - * alternatives to the modal browser window. Built-in browser prompts are - * often used for better text input experience on mobile device. We strongly - * recommend testing mobile when overriding this. - * @param {string} message The message to display to the user. - * @param {string} defaultValue The value to initialize the prompt with. - * @param {!function(string)} callback The callback for handling user response. - * @param {?string} _opt_title An optional title for the prompt. - * @param {?string} _opt_varType An optional variable type for variable specific - * prompt behavior. - */ -Blockly.prompt = function(message, defaultValue, callback, _opt_title, - _opt_varType) { - // opt_title and opt_varType are unused because we only need them to pass - // information to the scratch-gui, which overwrites this function - callback(window.prompt(message, defaultValue)); -}; - -/** - * A callback for status buttons. The window.alert is here for testing and - * should be overridden. - * @param {string} id An identifier. - */ -Blockly.statusButtonCallback = function(id) { - window.alert('status button was pressed for ' + id); -}; - -/** - * Refresh the visual state of a status button in all extension category headers. - * @param {Blockly.Workspace} workspace A workspace. - */ -Blockly.refreshStatusButtons = function(workspace) { - var buttons = workspace.getFlyout().buttons_; - for (var i = 0; i < buttons.length; i++) { - if (buttons[i] instanceof Blockly.FlyoutExtensionCategoryHeader) { - buttons[i].refreshStatus(); - } - } -}; - -/** - * Helper function for defining a block from JSON. The resulting function has - * the correct value of jsonDef at the point in code where jsonInit is called. - * @param {!Object} jsonDef The JSON definition of a block. - * @return {function()} A function that calls jsonInit with the correct value - * of jsonDef. - * @private - */ -Blockly.jsonInitFactory_ = function(jsonDef) { - return function() { - this.jsonInit(jsonDef); - }; -}; - -/** - * Define blocks from an array of JSON block definitions, as might be generated - * by the Blockly Developer Tools. - * @param {!Array.} jsonArray An array of JSON block definitions. - */ -Blockly.defineBlocksWithJsonArray = function(jsonArray) { - for (var i = 0; i < jsonArray.length; i++) { - var elem = jsonArray[i]; - if (!elem) { - console.warn( - 'Block definition #' + i + ' in JSON array is ' + elem + '. ' + - 'Skipping.'); - } else { - var typename = elem.type; - if (typename == null || typename === '') { - console.warn( - 'Block definition #' + i + - ' in JSON array is missing a type attribute. Skipping.'); - } else { - if (Blockly.Blocks[typename]) { - console.warn( - 'Block definition #' + i + ' in JSON array' + - ' overwrites prior definition of "' + typename + '".'); - } - Blockly.Blocks[typename] = { - init: Blockly.jsonInitFactory_(elem) - }; - } - } - } -}; - -/** - * Bind an event to a function call. When calling the function, verifies that - * it belongs to the touch stream that is currently being processed, and splits - * multitouch events into multiple events as needed. - * @param {!EventTarget} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @param {boolean=} opt_noCaptureIdentifier True if triggering on this event - * should not block execution of other event handlers on this touch or other - * simultaneous touches. - * @param {boolean=} opt_noPreventDefault True if triggering on this event - * should prevent the default handler. False by default. If - * opt_noPreventDefault is provided, opt_noCaptureIdentifier must also be - * provided. - * @return {!Array.} Opaque data that can be passed to unbindEvent_. - */ -Blockly.bindEventWithChecks_ = function(node, name, thisObject, func, - opt_noCaptureIdentifier, opt_noPreventDefault) { - var handled = false; - var wrapFunc = function(e) { - var captureIdentifier = !opt_noCaptureIdentifier; - // Handle each touch point separately. If the event was a mouse event, this - // will hand back an array with one element, which we're fine handling. - var events = Blockly.Touch.splitEventByTouches(e); - for (var i = 0, event; event = events[i]; i++) { - if (captureIdentifier && !Blockly.Touch.shouldHandleEvent(event)) { - continue; - } - Blockly.Touch.setClientFromTouch(event); - if (thisObject) { - func.call(thisObject, event); - } else { - func(event); - } - handled = true; - } - }; - - node.addEventListener(name, wrapFunc, false); - var bindData = [[node, name, wrapFunc]]; - - // Add equivalent touch event. - if (name in Blockly.Touch.TOUCH_MAP) { - var touchWrapFunc = function(e) { - wrapFunc(e); - // Calling preventDefault stops the browser from scrolling/zooming the - // page. - var preventDef = !opt_noPreventDefault; - if (handled && preventDef) { - e.preventDefault(); - } - }; - for (var i = 0, type; type = Blockly.Touch.TOUCH_MAP[name][i]; i++) { - node.addEventListener(type, touchWrapFunc, false); - bindData.push([node, type, touchWrapFunc]); - } - } - return bindData; -}; - - -/** - * Bind an event to a function call. Handles multitouch events by using the - * coordinates of the first changed touch, and doesn't do any safety checks for - * simultaneous event processing. - * @deprecated in favor of bindEventWithChecks_, but preserved for external - * users. - * @param {!EventTarget} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @return {!Array.} Opaque data that can be passed to unbindEvent_. - * @private - */ -Blockly.bindEvent_ = function(node, name, thisObject, func) { - var wrapFunc = function(e) { - if (thisObject) { - func.call(thisObject, e); - } else { - func(e); - } - }; - - node.addEventListener(name, wrapFunc, false); - var bindData = [[node, name, wrapFunc]]; - - // Add equivalent touch event. - if (name in Blockly.Touch.TOUCH_MAP) { - var touchWrapFunc = function(e) { - // Punt on multitouch events. - if (e.changedTouches.length == 1) { - // Map the touch event's properties to the event. - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; - } - wrapFunc(e); - - // Stop the browser from scrolling/zooming the page. - e.preventDefault(); - }; - for (var i = 0, type; type = Blockly.Touch.TOUCH_MAP[name][i]; i++) { - node.addEventListener(type, touchWrapFunc, false); - bindData.push([node, type, touchWrapFunc]); - } - } - return bindData; -}; - -/** - * Unbind one or more events event from a function call. - * @param {!Array.} bindData Opaque data from bindEvent_. - * This list is emptied during the course of calling this function. - * @return {!Function} The function call. - * @private - */ -Blockly.unbindEvent_ = function(bindData) { - while (bindData.length) { - var bindDatum = bindData.pop(); - var node = bindDatum[0]; - var name = bindDatum[1]; - var func = bindDatum[2]; - node.removeEventListener(name, func, false); - } - return func; -}; - -/** - * Is the given string a number (includes negative and decimals). - * @param {string} str Input string. - * @return {boolean} True if number, false otherwise. - */ -Blockly.isNumber = function(str) { - return !!str.match(/^\s*-?\d+(\.\d+)?\s*$/); -}; - -// IE9 does not have a console. Create a stub to stop errors. -if (!goog.global['console']) { - goog.global['console'] = { - 'log': function() {}, - 'warn': function() {} - }; -} - -// Export symbols that would otherwise be renamed by Closure compiler. -if (!goog.global['Blockly']) { - goog.global['Blockly'] = {}; -} -goog.global['Blockly']['getMainWorkspace'] = Blockly.getMainWorkspace; diff --git a/packages/scratch-blocks/core/blocks.js b/packages/scratch-blocks/core/blocks.js deleted file mode 100644 index c27be1d40..000000000 --- a/packages/scratch-blocks/core/blocks.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview A mapping of block type names to block prototype objects. - * @author spertus@google.com (Ellen Spertus) - */ -'use strict'; - -/** - * A mapping of block type names to block prototype objects. - * @name Blockly.Blocks - */ -goog.provide('Blockly.Blocks'); - -/* - * A mapping of block type names to block prototype objects. - * @type {!Object.} - */ -Blockly.Blocks = new Object(null); diff --git a/packages/scratch-blocks/core/bubble.js b/packages/scratch-blocks/core/bubble.js deleted file mode 100644 index 912155424..000000000 --- a/packages/scratch-blocks/core/bubble.js +++ /dev/null @@ -1,664 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a UI bubble. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Bubble'); - -goog.require('Blockly.Touch'); -goog.require('Blockly.Workspace'); -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); - - -/** - * Class for UI bubble. - * @param {!Blockly.WorkspaceSvg} workspace The workspace on which to draw the - * bubble. - * @param {!Element} content SVG content for the bubble. - * @param {Element} shape SVG element to avoid eclipsing. - * @param {!goog.math.Coordinate} anchorXY Absolute position of bubble's anchor - * point. - * @param {?number} bubbleWidth Width of bubble, or null if not resizable. - * @param {?number} bubbleHeight Height of bubble, or null if not resizable. - * @constructor - */ -Blockly.Bubble = function(workspace, content, shape, anchorXY, - bubbleWidth, bubbleHeight) { - this.workspace_ = workspace; - this.content_ = content; - this.shape_ = shape; - - var angle = Blockly.Bubble.ARROW_ANGLE; - if (this.workspace_.RTL) { - angle = -angle; - } - this.arrow_radians_ = Blockly.utils.toRadians(angle); - - var canvas = workspace.getBubbleCanvas(); - canvas.appendChild(this.createDom_(content, !!(bubbleWidth && bubbleHeight))); - - this.setAnchorLocation(anchorXY); - if (!bubbleWidth || !bubbleHeight) { - var bBox = /** @type {SVGLocatable} */ (this.content_).getBBox(); - bubbleWidth = bBox.width + 2 * Blockly.Bubble.BORDER_WIDTH; - bubbleHeight = bBox.height + 2 * Blockly.Bubble.BORDER_WIDTH; - } - this.setBubbleSize(bubbleWidth, bubbleHeight); - - // Render the bubble. - this.positionBubble_(); - this.renderArrow_(); - this.rendered_ = true; - - if (!workspace.options.readOnly) { - Blockly.bindEventWithChecks_( - this.bubbleBack_, 'mousedown', this, this.bubbleMouseDown_); - if (this.resizeGroup_) { - Blockly.bindEventWithChecks_( - this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); - } - } -}; - -/** - * Width of the border around the bubble. - */ -Blockly.Bubble.BORDER_WIDTH = 6; - -/** - * Determines the thickness of the base of the arrow in relation to the size - * of the bubble. Higher numbers result in thinner arrows. - */ -Blockly.Bubble.ARROW_THICKNESS = 5; - -/** - * The number of degrees that the arrow bends counter-clockwise. - */ -Blockly.Bubble.ARROW_ANGLE = 20; - -/** - * The sharpness of the arrow's bend. Higher numbers result in smoother arrows. - */ -Blockly.Bubble.ARROW_BEND = 4; - -/** - * Distance between arrow point and anchor point. - */ -Blockly.Bubble.ANCHOR_RADIUS = 8; - -/** - * Wrapper function called when a mouseUp occurs during a drag operation. - * @type {Array.} - * @private - */ -Blockly.Bubble.onMouseUpWrapper_ = null; - -/** - * Wrapper function called when a mouseMove occurs during a drag operation. - * @type {Array.} - * @private - */ -Blockly.Bubble.onMouseMoveWrapper_ = null; - -/** - * Function to call on resize of bubble. - * @type {Function} - */ -Blockly.Bubble.prototype.resizeCallback_ = null; - -/** - * Stop binding to the global mouseup and mousemove events. - * @private - */ -Blockly.Bubble.unbindDragEvents_ = function() { - if (Blockly.Bubble.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Bubble.onMouseUpWrapper_); - Blockly.Bubble.onMouseUpWrapper_ = null; - } - if (Blockly.Bubble.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.Bubble.onMouseMoveWrapper_); - Blockly.Bubble.onMouseMoveWrapper_ = null; - } -}; - -/* - * Handle a mouse-up event while dragging a bubble's border or resize handle. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.Bubble.bubbleMouseUp_ = function(/*e*/) { - Blockly.Touch.clearTouchIdentifier(); - Blockly.Bubble.unbindDragEvents_(); -}; - -/** - * Flag to stop incremental rendering during construction. - * @private - */ -Blockly.Bubble.prototype.rendered_ = false; - -/** - * Absolute coordinate of anchor point, in workspace coordinates. - * @type {goog.math.Coordinate} - * @private - */ -Blockly.Bubble.prototype.anchorXY_ = null; - -/** - * Relative X coordinate of bubble with respect to the anchor's centre, - * in workspace units. - * In RTL mode the initial value is negated. - * @private - */ -Blockly.Bubble.prototype.relativeLeft_ = 0; - -/** - * Relative Y coordinate of bubble with respect to the anchor's centre. - * @private - */ -Blockly.Bubble.prototype.relativeTop_ = 0; - -/** - * Width of bubble. - * @private - */ -Blockly.Bubble.prototype.width_ = 0; - -/** - * Height of bubble. - * @private - */ -Blockly.Bubble.prototype.height_ = 0; - -/** - * Automatically position and reposition the bubble. - * @private - */ -Blockly.Bubble.prototype.autoLayout_ = true; - -/** - * Create the bubble's DOM. - * @param {!Element} content SVG content for the bubble. - * @param {boolean} hasResize Add diagonal resize gripper if true. - * @return {!Element} The bubble's SVG group. - * @private - */ -Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { - /* Create the bubble. Here's the markup that will be generated: - - - - - - - - - - - [...content goes here...] - - */ - this.bubbleGroup_ = Blockly.utils.createSvgElement('g', {}, null); - var filter = - {'filter': 'url(#' + this.workspace_.options.embossFilterId + ')'}; - if (goog.userAgent.getUserAgentString().indexOf('JavaFX') != -1) { - // Multiple reports that JavaFX can't handle filters. UserAgent: - // Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.44 - // (KHTML, like Gecko) JavaFX/8.0 Safari/537.44 - // https://github.com/google/blockly/issues/99 - filter = {}; - } - var bubbleEmboss = Blockly.utils.createSvgElement('g', - filter, this.bubbleGroup_); - this.bubbleArrow_ = Blockly.utils.createSvgElement('path', {}, bubbleEmboss); - this.bubbleBack_ = Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyDraggable', - 'x': 0, - 'y': 0, - 'rx': Blockly.Bubble.BORDER_WIDTH, - 'ry': Blockly.Bubble.BORDER_WIDTH - }, - bubbleEmboss); - if (hasResize) { - this.resizeGroup_ = Blockly.utils.createSvgElement('g', - {'class': this.workspace_.RTL ? - 'blocklyResizeSW' : 'blocklyResizeSE'}, - this.bubbleGroup_); - var resizeSize = 2 * Blockly.Bubble.BORDER_WIDTH; - Blockly.utils.createSvgElement('polygon', - {'points': '0,x x,x x,0'.replace(/x/g, resizeSize.toString())}, - this.resizeGroup_); - Blockly.utils.createSvgElement('line', - { - 'class': 'blocklyResizeLine', - 'x1': resizeSize / 3, 'y1': resizeSize - 1, - 'x2': resizeSize - 1, 'y2': resizeSize / 3 - }, this.resizeGroup_); - Blockly.utils.createSvgElement('line', - { - 'class': 'blocklyResizeLine', - 'x1': resizeSize * 2 / 3, - 'y1': resizeSize - 1, - 'x2': resizeSize - 1, - 'y2': resizeSize * 2 / 3 - }, this.resizeGroup_); - } else { - this.resizeGroup_ = null; - } - this.bubbleGroup_.appendChild(content); - return this.bubbleGroup_; -}; - -/** - * Return the root node of the bubble's SVG group. - * @return {Element} The root SVG node of the bubble's group. - */ -Blockly.Bubble.prototype.getSvgRoot = function() { - return this.bubbleGroup_; -}; - -/** - * Expose the block's ID on the bubble's top-level SVG group. - * @param {string} id ID of block. - */ -Blockly.Bubble.prototype.setSvgId = function(id) { - if (this.bubbleGroup_.dataset) { - this.bubbleGroup_.dataset.blockId = id; - } -}; - -/** - * Handle a mouse-down on bubble's border. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Bubble.prototype.bubbleMouseDown_ = function(e) { - var gesture = this.workspace_.getGesture(e); - if (gesture) { - gesture.handleBubbleStart(e, this); - } -}; - -/** - * Show the context menu for this bubble. - * @param {!Event} _e Mouse event. - * @private - */ -Blockly.Bubble.prototype.showContextMenu_ = function(_e) { - // NOP on bubbles, but used by the bubble dragger to pass events to - // workspace comments. -}; - -/** - * Get whether this bubble is deletable or not. - * @return {boolean} True if deletable. - * @package - */ -Blockly.Bubble.prototype.isDeletable = function() { - return false; -}; - -/** - * Handle a mouse-down on bubble's resize corner. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Bubble.prototype.resizeMouseDown_ = function(e) { - this.promote_(); - Blockly.Bubble.unbindDragEvents_(); - if (Blockly.utils.isRightButton(e)) { - // No right-click. - e.stopPropagation(); - return; - } - // Left-click (or middle click) - this.workspace_.startDrag(e, new goog.math.Coordinate( - this.workspace_.RTL ? -this.width_ : this.width_, this.height_)); - - Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, - 'mouseup', this, Blockly.Bubble.bubbleMouseUp_); - Blockly.Bubble.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, - 'mousemove', this, this.resizeMouseMove_); - Blockly.hideChaff(); - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); -}; - -/** - * Resize this bubble to follow the mouse. - * @param {!Event} e Mouse move event. - * @private - */ -Blockly.Bubble.prototype.resizeMouseMove_ = function(e) { - this.autoLayout_ = false; - var newXY = this.workspace_.moveDrag(e); - this.setBubbleSize(this.workspace_.RTL ? -newXY.x : newXY.x, newXY.y); - if (this.workspace_.RTL) { - // RTL requires the bubble to move its left edge. - this.positionBubble_(); - } -}; - -/** - * Register a function as a callback event for when the bubble is resized. - * @param {!Function} callback The function to call on resize. - */ -Blockly.Bubble.prototype.registerResizeEvent = function(callback) { - this.resizeCallback_ = callback; -}; - -/** - * Move this bubble to the top of the stack. - * @return {!boolean} Whether or not the bubble has been moved. - * @private - */ -Blockly.Bubble.prototype.promote_ = function() { - var svgGroup = this.bubbleGroup_.parentNode; - if (svgGroup.lastChild !== this.bubbleGroup_) { - svgGroup.appendChild(this.bubbleGroup_); - return true; - } - return false; -}; - -/** - * Notification that the anchor has moved. - * Update the arrow and bubble accordingly. - * @param {!goog.math.Coordinate} xy Absolute location. - */ -Blockly.Bubble.prototype.setAnchorLocation = function(xy) { - this.anchorXY_ = xy; - if (this.rendered_) { - this.positionBubble_(); - } -}; - -/** - * Position the bubble so that it does not fall off-screen. - * @private - */ -Blockly.Bubble.prototype.layoutBubble_ = function() { - // Compute the preferred bubble location. - var relativeLeft = -this.width_ / 4; - var relativeTop = -this.height_ - Blockly.BlockSvg.MIN_BLOCK_Y; - // Prevent the bubble from being off-screen. - var metrics = this.workspace_.getMetrics(); - metrics.viewWidth /= this.workspace_.scale; - metrics.viewLeft /= this.workspace_.scale; - var anchorX = this.anchorXY_.x; - if (this.workspace_.RTL) { - if (anchorX - metrics.viewLeft - relativeLeft - this.width_ < - Blockly.Scrollbar.scrollbarThickness) { - // Slide the bubble right until it is onscreen. - relativeLeft = anchorX - metrics.viewLeft - this.width_ - - Blockly.Scrollbar.scrollbarThickness; - } else if (anchorX - metrics.viewLeft - relativeLeft > - metrics.viewWidth) { - // Slide the bubble left until it is onscreen. - relativeLeft = anchorX - metrics.viewLeft - metrics.viewWidth; - } - } else { - if (anchorX + relativeLeft < metrics.viewLeft) { - // Slide the bubble right until it is onscreen. - relativeLeft = metrics.viewLeft - anchorX; - } else if (metrics.viewLeft + metrics.viewWidth < - anchorX + relativeLeft + this.width_ + - Blockly.BlockSvg.SEP_SPACE_X + - Blockly.Scrollbar.scrollbarThickness) { - // Slide the bubble left until it is onscreen. - relativeLeft = metrics.viewLeft + metrics.viewWidth - anchorX - - this.width_ - Blockly.Scrollbar.scrollbarThickness; - } - } - if (this.anchorXY_.y + relativeTop < metrics.viewTop) { - // Slide the bubble below the block. - var bBox = /** @type {SVGLocatable} */ (this.shape_).getBBox(); - relativeTop = bBox.height; - } - this.relativeLeft_ = relativeLeft; - this.relativeTop_ = relativeTop; -}; - -/** - * Move the bubble to a location relative to the anchor's centre. - * @private - */ -Blockly.Bubble.prototype.positionBubble_ = function() { - var left = this.anchorXY_.x; - if (this.workspace_.RTL) { - left -= this.relativeLeft_ ; - } else { - left += this.relativeLeft_; - } - var top = this.relativeTop_ + this.anchorXY_.y; - this.moveTo(left, top); -}; - -/** - * Move the bubble group to the specified location in workspace coordinates. - * @param {number} x The x position to move to. - * @param {number} y The y position to move to. - * @package - */ -Blockly.Bubble.prototype.moveTo = function(x, y) { - this.bubbleGroup_.setAttribute('transform', 'translate(' + x + ',' + y + ')'); -}; - -/** - * Get the dimensions of this bubble. - * @return {!Object} Object with width and height properties. - */ -Blockly.Bubble.prototype.getBubbleSize = function() { - return {width: this.width_, height: this.height_}; -}; - -/** - * Size this bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - */ -Blockly.Bubble.prototype.setBubbleSize = function(width, height) { - var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; - // Minimum size of a bubble. - width = Math.max(width, doubleBorderWidth + 45); - height = Math.max(height, doubleBorderWidth + 20); - this.width_ = width; - this.height_ = height; - this.bubbleBack_.setAttribute('width', width); - this.bubbleBack_.setAttribute('height', height); - if (this.resizeGroup_) { - if (this.workspace_.RTL) { - // Mirror the resize group. - var resizeSize = 2 * Blockly.Bubble.BORDER_WIDTH; - this.resizeGroup_.setAttribute('transform', 'translate(' + - resizeSize + ',' + (height - doubleBorderWidth) + ') scale(-1 1)'); - } else { - this.resizeGroup_.setAttribute('transform', 'translate(' + - (width - doubleBorderWidth) + ',' + - (height - doubleBorderWidth) + ')'); - } - } - if (this.rendered_) { - if (this.autoLayout_) { - this.layoutBubble_(); - } - this.positionBubble_(); - this.renderArrow_(); - } - // Allow the contents to resize. - if (this.resizeCallback_) { - this.resizeCallback_(); - } -}; - -/** - * Draw the arrow between the bubble and the origin. - * @private - */ -Blockly.Bubble.prototype.renderArrow_ = function() { - var steps = []; - // Find the relative coordinates of the center of the bubble. - var relBubbleX = this.width_ / 2; - var relBubbleY = this.height_ / 2; - // Find the relative coordinates of the center of the anchor. - var relAnchorX = -this.relativeLeft_; - var relAnchorY = -this.relativeTop_; - if (relBubbleX == relAnchorX && relBubbleY == relAnchorY) { - // Null case. Bubble is directly on top of the anchor. - // Short circuit this rather than wade through divide by zeros. - steps.push('M ' + relBubbleX + ',' + relBubbleY); - } else { - // Compute the angle of the arrow's line. - var rise = relAnchorY - relBubbleY; - var run = relAnchorX - relBubbleX; - if (this.workspace_.RTL) { - run *= -1; - } - var hypotenuse = Math.sqrt(rise * rise + run * run); - var angle = Math.acos(run / hypotenuse); - if (rise < 0) { - angle = 2 * Math.PI - angle; - } - // Compute a line perpendicular to the arrow. - var rightAngle = angle + Math.PI / 2; - if (rightAngle > Math.PI * 2) { - rightAngle -= Math.PI * 2; - } - var rightRise = Math.sin(rightAngle); - var rightRun = Math.cos(rightAngle); - - // Calculate the thickness of the base of the arrow. - var bubbleSize = this.getBubbleSize(); - var thickness = (bubbleSize.width + bubbleSize.height) / - Blockly.Bubble.ARROW_THICKNESS; - thickness = Math.min(thickness, bubbleSize.width, bubbleSize.height) / 4; - - // Back the tip of the arrow off of the anchor. - var backoffRatio = 1 - Blockly.Bubble.ANCHOR_RADIUS / hypotenuse; - relAnchorX = relBubbleX + backoffRatio * run; - relAnchorY = relBubbleY + backoffRatio * rise; - - // Coordinates for the base of the arrow. - var baseX1 = relBubbleX + thickness * rightRun; - var baseY1 = relBubbleY + thickness * rightRise; - var baseX2 = relBubbleX - thickness * rightRun; - var baseY2 = relBubbleY - thickness * rightRise; - - // Distortion to curve the arrow. - var swirlAngle = angle + this.arrow_radians_; - if (swirlAngle > Math.PI * 2) { - swirlAngle -= Math.PI * 2; - } - var swirlRise = Math.sin(swirlAngle) * - hypotenuse / Blockly.Bubble.ARROW_BEND; - var swirlRun = Math.cos(swirlAngle) * - hypotenuse / Blockly.Bubble.ARROW_BEND; - - steps.push('M' + baseX1 + ',' + baseY1); - steps.push('C' + (baseX1 + swirlRun) + ',' + (baseY1 + swirlRise) + - ' ' + relAnchorX + ',' + relAnchorY + - ' ' + relAnchorX + ',' + relAnchorY); - steps.push('C' + relAnchorX + ',' + relAnchorY + - ' ' + (baseX2 + swirlRun) + ',' + (baseY2 + swirlRise) + - ' ' + baseX2 + ',' + baseY2); - } - steps.push('z'); - this.bubbleArrow_.setAttribute('d', steps.join(' ')); -}; - -/** - * Change the colour of a bubble. - * @param {string} hexColour Hex code of colour. - */ -Blockly.Bubble.prototype.setColour = function(hexColour) { - this.bubbleBack_.setAttribute('fill', hexColour); - this.bubbleArrow_.setAttribute('fill', hexColour); -}; - -/** - * Dispose of this bubble. - */ -Blockly.Bubble.prototype.dispose = function() { - Blockly.Bubble.unbindDragEvents_(); - // Dispose of and unlink the bubble. - goog.dom.removeNode(this.bubbleGroup_); - this.bubbleGroup_ = null; - this.bubbleArrow_ = null; - this.bubbleBack_ = null; - this.resizeGroup_ = null; - this.workspace_ = null; - this.content_ = null; - this.shape_ = null; -}; - -/** - * Move this bubble during a drag, taking into account whether or not there is - * a drag surface. - * @param {?Blockly.BlockDragSurfaceSvg} dragSurface The surface that carries - * rendered items during a drag, or null if no drag surface is in use. - * @param {!goog.math.Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ -Blockly.Bubble.prototype.moveDuringDrag = function(dragSurface, newLoc) { - if (dragSurface) { - dragSurface.translateSurface(newLoc.x, newLoc.y); - } else { - this.moveTo(newLoc.x, newLoc.y); - } - if (this.workspace_.RTL) { - this.relativeLeft_ = this.anchorXY_.x - newLoc.x - this.width_; - } else { - this.relativeLeft_ = newLoc.x - this.anchorXY_.x; - } - this.relativeTop_ = newLoc.y - this.anchorXY_.y; - this.renderArrow_(); -}; - -/** - * Return the coordinates of the top corner of this bubble's starting edge (e.g. - * top left corner in LTR and top right corner in RTL) relative - * to the drawing surface's origin (0,0), in workspace units. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - */ -Blockly.Bubble.prototype.getRelativeToSurfaceXY = function() { - return new goog.math.Coordinate( - this.workspace_.RTL ? this.anchorXY_.x - this.relativeLeft_ : this.anchorXY_.x + this.relativeLeft_, - this.anchorXY_.y + this.relativeTop_); -}; - -/** - * Set whether auto-layout of this bubble is enabled. The first time a bubble - * is shown it positions itself to not cover any blocks. Once a user has - * dragged it to reposition, it renders where the user put it. - * @param {boolean} enable True if auto-layout should be enabled, false - * otherwise. - * @package - */ -Blockly.Bubble.prototype.setAutoLayout = function(enable) { - this.autoLayout_ = enable; -}; diff --git a/packages/scratch-blocks/core/bubble_dragger.js b/packages/scratch-blocks/core/bubble_dragger.js deleted file mode 100644 index 2366581e8..000000000 --- a/packages/scratch-blocks/core/bubble_dragger.js +++ /dev/null @@ -1,285 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for dragging a bubble visually. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.BubbleDragger'); - -goog.require('Blockly.Bubble'); -goog.require('Blockly.Events.CommentMove'); -goog.require('Blockly.WorkspaceCommentSvg'); - -goog.require('goog.math.Coordinate'); -goog.require('goog.asserts'); - - -/** - * Class for a bubble dragger. It moves things on the bubble canvas around the - * workspace when they are being dragged by a mouse or touch. These can be - * block comments, mutators, warnings, or workspace comments. - * @param {!Blockly.Bubble|!Blockly.WorkspaceCommentSvg} bubble The item on the - * bubble canvas to drag. - * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. - * @constructor - */ -Blockly.BubbleDragger = function(bubble, workspace) { - /** - * The item on the bubble canvas that is being dragged. - * @type {!Blockly.Bubble|!Blockly.WorkspaceCommentSvg} - * @private - */ - this.draggingBubble_ = bubble; - - /** - * The workspace on which the bubble is being dragged. - * @type {!Blockly.WorkspaceSvg} - * @private - */ - this.workspace_ = workspace; - - /** - * Which delete area the mouse pointer is over, if any. - * One of {@link Blockly.DELETE_AREA_TRASH}, - * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. - * @type {?number} - * @private - */ - this.deleteArea_ = null; - - /** - * Whether the bubble would be deleted if dropped immediately. - * @type {boolean} - * @private - */ - this.wouldDeleteBubble_ = false; - - /** - * The location of the top left corner of the dragging bubble's body at the - * beginning of the drag, in workspace coordinates. - * @type {!goog.math.Coordinate} - * @private - */ - this.startXY_ = this.draggingBubble_.getRelativeToSurfaceXY(); - - /** - * The drag surface to move bubbles to during a drag, or null if none should - * be used. Block dragging and bubble dragging use the same surface. - * @type {?Blockly.BlockDragSurfaceSvg} - * @private - */ - this.dragSurface_ = - Blockly.utils.is3dSupported() && !!workspace.getBlockDragSurface() ? - workspace.getBlockDragSurface() : null; -}; - -/** - * Sever all links from this object. - * @package - */ -Blockly.BubbleDragger.prototype.dispose = function() { - this.draggingBubble_ = null; - this.workspace_ = null; - this.dragSurface_ = null; -}; - -/** - * Start dragging a bubble. This includes moving it to the drag surface. - * @package - */ -Blockly.BubbleDragger.prototype.startBubbleDrag = function() { - if (!Blockly.Events.getGroup()) { - Blockly.Events.setGroup(true); - } - - this.workspace_.setResizesEnabled(false); - this.draggingBubble_.setAutoLayout(false); - if (this.dragSurface_) { - this.moveToDragSurface_(); - } - - this.draggingBubble_.setDragging && this.draggingBubble_.setDragging(true); - - var toolbox = this.workspace_.getToolbox(); - if (toolbox) { - var style = this.draggingBubble_.isDeletable() ? 'blocklyToolboxDelete' : - 'blocklyToolboxGrab'; - toolbox.addStyle(style); - } -}; - -/** - * Execute a step of bubble dragging, based on the given event. Update the - * display accordingly. - * @param {!Event} e The most recent move event. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @package - */ -Blockly.BubbleDragger.prototype.dragBubble = function(e, currentDragDeltaXY) { - var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); - var newLoc = goog.math.Coordinate.sum(this.startXY_, delta); - - this.draggingBubble_.moveDuringDrag(this.dragSurface_, newLoc); - - if (this.draggingBubble_.isDeletable()) { - this.deleteArea_ = this.workspace_.isDeleteArea(e); - this.updateCursorDuringBubbleDrag_(); - } -}; - -/** - * Shut the trash can and, if necessary, delete the dragging bubble. - * Should be called at the end of a bubble drag. - * @return {boolean} whether the bubble was deleted. - * @private - */ -Blockly.BubbleDragger.prototype.maybeDeleteBubble_ = function() { - var trashcan = this.workspace_.trashcan; - - if (this.wouldDeleteBubble_) { - if (trashcan) { - setTimeout(trashcan.close.bind(trashcan), 100); - } - // Fire a move event, so we know where to go back to for an undo. - this.fireMoveEvent_(); - this.draggingBubble_.dispose(false, true); - } else if (trashcan) { - // Make sure the trash can is closed. - trashcan.close(); - } - return this.wouldDeleteBubble_; -}; - -/** - * Update the cursor (and possibly the trash can lid) to reflect whether the - * dragging bubble would be deleted if released immediately. - * @private - */ -Blockly.BubbleDragger.prototype.updateCursorDuringBubbleDrag_ = function() { - this.wouldDeleteBubble_ = this.deleteArea_ != Blockly.DELETE_AREA_NONE; - var trashcan = this.workspace_.trashcan; - if (this.wouldDeleteBubble_) { - this.draggingBubble_.setDeleteStyle(true); - if (this.deleteArea_ == Blockly.DELETE_AREA_TRASH && trashcan) { - trashcan.setOpen_(true); - } - } else { - this.draggingBubble_.setDeleteStyle(false); - if (trashcan) { - trashcan.setOpen_(false); - } - } -}; - -/** - * Finish a bubble drag and put the bubble back on the workspace. - * @param {!Event} e The mouseup/touchend event. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @package - */ -Blockly.BubbleDragger.prototype.endBubbleDrag = function( - e, currentDragDeltaXY) { - // Make sure internal state is fresh. - this.dragBubble(e, currentDragDeltaXY); - - var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); - var newLoc = goog.math.Coordinate.sum(this.startXY_, delta); - - // Move the bubble to its final location. - this.draggingBubble_.moveTo(newLoc.x, newLoc.y); - var deleted = this.maybeDeleteBubble_(); - - if (!deleted) { - // Put everything back onto the bubble canvas. - if (this.dragSurface_) { - this.dragSurface_.clearAndHide(this.workspace_.getBubbleCanvas()); - } - - this.draggingBubble_.setDragging && this.draggingBubble_.setDragging(false); - this.fireMoveEvent_(); - } - this.workspace_.setResizesEnabled(true); - - if (this.workspace_.toolbox_) { - var style = this.draggingBubble_.isDeletable() ? 'blocklyToolboxDelete' : - 'blocklyToolboxGrab'; - this.workspace_.toolbox_.removeStyle(style); - } - Blockly.Events.setGroup(false); -}; - -/** - * Fire a move event at the end of a bubble drag. - * @private - */ -Blockly.BubbleDragger.prototype.fireMoveEvent_ = function() { - var event = null; - if (this.draggingBubble_.isComment) { - event = new Blockly.Events.CommentMove(this.draggingBubble_); - } else if (this.draggingBubble_ instanceof Blockly.ScratchBubble) { - event = new Blockly.Events.CommentMove(this.draggingBubble_.comment); - } else { - return; - } - event.setOldCoordinate(this.startXY_); - event.recordNew(); - Blockly.Events.fire(event); -}; - -/** - * Convert a coordinate object from pixels to workspace units, including a - * correction for mutator workspaces. - * This function does not consider differing origins. It simply scales the - * input's x and y values. - * @param {!goog.math.Coordinate} pixelCoord A coordinate with x and y values - * in css pixel units. - * @return {!goog.math.Coordinate} The input coordinate divided by the workspace - * scale. - * @private - */ -Blockly.BubbleDragger.prototype.pixelsToWorkspaceUnits_ = function(pixelCoord) { - var result = new goog.math.Coordinate(pixelCoord.x / this.workspace_.scale, - pixelCoord.y / this.workspace_.scale); - if (this.workspace_.isMutator) { - // If we're in a mutator, its scale is always 1, purely because of some - // oddities in our rendering optimizations. The actual scale is the same as - // the scale on the parent workspace. - // Fix that for dragging. - var mainScale = this.workspace_.options.parentWorkspace.scale; - result = result.scale(1 / mainScale); - } - return result; -}; -/** - * Move the bubble onto the drag surface at the beginning of a drag. Move the - * drag surface to preserve the apparent location of the bubble. - * @private - */ -Blockly.BubbleDragger.prototype.moveToDragSurface_ = function() { - this.draggingBubble_.moveTo(0, 0); - this.dragSurface_.translateSurface(this.startXY_.x, this.startXY_.y); - // Execute the move on the top-level SVG component. - this.dragSurface_.setBlocksAndShow(this.draggingBubble_.getSvgRoot()); -}; diff --git a/packages/scratch-blocks/core/colours.js b/packages/scratch-blocks/core/colours.js deleted file mode 100644 index bb205cdd6..000000000 --- a/packages/scratch-blocks/core/colours.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -'use strict'; - -goog.provide('Blockly.Colours'); - -Blockly.Colours = { - // SVG colours: these must be specificed in #RRGGBB style - // To add an opacity, this must be specified as a separate property (for SVG fill-opacity) - "motion": { - "primary": "#4C97FF", - "secondary": "#4280D7", - "tertiary": "#3373CC" - }, - "looks": { - "primary": "#9966FF", - "secondary": "#855CD6", - "tertiary": "#774DCB" - }, - "sounds": { - "primary": "#CF63CF", - "secondary": "#C94FC9", - "tertiary": "#BD42BD" - }, - "control": { - "primary": "#FFAB19", - "secondary": "#EC9C13", - "tertiary": "#CF8B17" - }, - "event": { - "primary": "#FFBF00", - "secondary": "#E6AC00", - "tertiary": "#CC9900" - }, - "sensing": { - "primary": "#5CB1D6", - "secondary": "#47A8D1", - "tertiary": "#2E8EB8" - }, - "pen": { - "primary": "#0fBD8C", - "secondary": "#0DA57A", - "tertiary": "#0B8E69" - }, - "operators": { - "primary": "#59C059", - "secondary": "#46B946", - "tertiary": "#389438" - }, - "data": { - "primary": "#FF8C1A", - "secondary": "#FF8000", - "tertiary": "#DB6E00" - }, - // This is not a new category, but rather for differentiation - // between lists and scalar variables. - "data_lists": { - "primary": "#FF661A", - "secondary": "#FF5500", - "tertiary": "#E64D00" - }, - "more": { - "primary": "#FF6680", - "secondary": "#FF4D6A", - "tertiary": "#FF3355" - }, - "text": "#575E75", - "workspace": "#F9F9F9", - "toolboxHover": "#4C97FF", - "toolboxSelected": "#e9eef2", - "toolboxText": "#575E75", - "toolbox": "#FFFFFF", - "flyout": "#F9F9F9", - "scrollbar": "#CECDCE", - "scrollbarHover": '#CECDCE', - "textField": "#FFFFFF", - "insertionMarker": "#000000", - "insertionMarkerOpacity": 0.2, - "dragShadowOpacity": 0.3, - "stackGlow": "#FFF200", - "stackGlowSize": 4, - "stackGlowOpacity": 1, - "replacementGlow": "#FFFFFF", - "replacementGlowSize": 2, - "replacementGlowOpacity": 1, - "colourPickerStroke": "#FFFFFF", - // CSS colours: support RGBA - "fieldShadow": "rgba(0,0,0,0.1)", - "dropDownShadow": "rgba(0, 0, 0, .3)", - "numPadBackground": "#547AB2", - "numPadBorder": "#435F91", - "numPadActiveBackground": "#435F91", - "numPadText": "white", // Do not use hex here, it cannot be inlined with data-uri SVG - "valueReportBackground": "#FFFFFF", - "valueReportBorder": "#AAAAAA" -}; - -/** - * Override the colours in Blockly.Colours with new values basded on the - * given dictionary. - * @param {!Object} colours Dictionary of colour properties and new values. - * @package - */ -Blockly.Colours.overrideColours = function(colours) { - // Colour overrides provided by the injection - if (colours) { - for (var colourProperty in colours) { - if (colours.hasOwnProperty(colourProperty) && - Blockly.Colours.hasOwnProperty(colourProperty)) { - // If a property is in both colours option and Blockly.Colours, - // set the Blockly.Colours value to the override. - // Override Blockly category color object properties with those - // provided. - var colourPropertyValue = colours[colourProperty]; - if (goog.isObject(colourPropertyValue)) { - for (var colourSequence in colourPropertyValue) { - if (colourPropertyValue.hasOwnProperty(colourSequence) && - Blockly.Colours[colourProperty].hasOwnProperty(colourSequence)) { - Blockly.Colours[colourProperty][colourSequence] = - colourPropertyValue[colourSequence]; - } - } - } else { - Blockly.Colours[colourProperty] = colourPropertyValue; - } - } - } - } -}; diff --git a/packages/scratch-blocks/core/comment.js b/packages/scratch-blocks/core/comment.js deleted file mode 100644 index 65e1bceca..000000000 --- a/packages/scratch-blocks/core/comment.js +++ /dev/null @@ -1,293 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a code comment. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Comment'); - -goog.require('Blockly.Bubble'); -goog.require('Blockly.Events.BlockChange'); -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.Icon'); -goog.require('goog.userAgent'); - - -/** - * Class for a comment. - * @param {!Blockly.Block} block The block associated with this comment. - * @extends {Blockly.Icon} - * @constructor - */ -Blockly.Comment = function(block) { - Blockly.Comment.superClass_.constructor.call(this, block); - this.createIcon(); -}; -goog.inherits(Blockly.Comment, Blockly.Icon); - -/** - * Comment text (if bubble is not visible). - * @private - */ -Blockly.Comment.prototype.text_ = ''; - -/** - * Width of bubble. - * @private - */ -Blockly.Comment.prototype.width_ = 160; - -/** - * Height of bubble. - * @private - */ -Blockly.Comment.prototype.height_ = 80; - -/** - * Draw the comment icon. - * @param {!Element} group The icon group. - * @private - */ -Blockly.Comment.prototype.drawIcon_ = function(group) { - // Circle. - Blockly.utils.createSvgElement('circle', - {'class': 'blocklyIconShape', 'r': '8', 'cx': '8', 'cy': '8'}, - group); - // Can't use a real '?' text character since different browsers and operating - // systems render it differently. - // Body of question mark. - Blockly.utils.createSvgElement('path', - { - 'class': 'blocklyIconSymbol', - 'd': 'm6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.405' + - '0.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25' + - '-1.201,0.998 -1.201,1.528 -1.204,2.19z' - }, - group); - // Dot of question mark. - Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyIconSymbol', - 'x': '6.8', - 'y': '10.78', - 'height': '2', - 'width': '2' - }, - group); -}; - -/** - * Create the editor for the comment's bubble. - * @return {!Element} The top-level node of the editor. - * @private - */ -Blockly.Comment.prototype.createEditor_ = function() { - /* Create the editor. Here's the markup that will be generated: - - - - - - */ - this.foreignObject_ = Blockly.utils.createSvgElement('foreignObject', - {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, - null); - var body = document.createElementNS(Blockly.HTML_NS, 'body'); - body.setAttribute('xmlns', Blockly.HTML_NS); - body.className = 'blocklyMinimalBody'; - var textarea = document.createElementNS(Blockly.HTML_NS, 'textarea'); - textarea.className = 'blocklyCommentTextarea'; - textarea.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); - body.appendChild(textarea); - this.textarea_ = textarea; - this.foreignObject_.appendChild(body); - Blockly.bindEventWithChecks_(textarea, 'mouseup', this, this.textareaFocus_); - // Don't zoom with mousewheel. - Blockly.bindEventWithChecks_(textarea, 'wheel', this, function(e) { - e.stopPropagation(); - }); - Blockly.bindEventWithChecks_(textarea, 'change', this, function(_e) { - if (this.text_ != textarea.value) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.block_, 'comment', null, this.text_, textarea.value)); - this.text_ = textarea.value; - } - }); - setTimeout(function() { - textarea.focus(); - }, 0); - return this.foreignObject_; -}; - -/** - * Add or remove editability of the comment. - * @override - */ -Blockly.Comment.prototype.updateEditable = function() { - if (this.isVisible()) { - // Toggling visibility will force a rerendering. - this.setVisible(false); - this.setVisible(true); - } - // Allow the icon to update. - Blockly.Icon.prototype.updateEditable.call(this); -}; - -/** - * Callback function triggered when the bubble has resized. - * Resize the text area accordingly. - * @private - */ -Blockly.Comment.prototype.resizeBubble_ = function() { - if (this.isVisible()) { - var size = this.bubble_.getBubbleSize(); - var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; - this.foreignObject_.setAttribute('width', size.width - doubleBorderWidth); - this.foreignObject_.setAttribute('height', size.height - doubleBorderWidth); - this.textarea_.style.width = (size.width - doubleBorderWidth - 4) + 'px'; - this.textarea_.style.height = (size.height - doubleBorderWidth - 4) + 'px'; - } -}; - -/** - * Show or hide the comment bubble. - * @param {boolean} visible True if the bubble should be visible. - */ -Blockly.Comment.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - // No change. - return; - } - Blockly.Events.fire( - new Blockly.Events.Ui(this.block_, 'commentOpen', !visible, visible)); - if ((!this.block_.isEditable() && !this.textarea_) || goog.userAgent.IE) { - // Steal the code from warnings to make an uneditable text bubble. - // MSIE does not support foreignobject; textareas are impossible. - // http://msdn.microsoft.com/en-us/library/hh834675%28v=vs.85%29.aspx - // Always treat comments in IE as uneditable. - Blockly.Warning.prototype.setVisible.call(this, visible); - return; - } - // Save the bubble stats before the visibility switch. - var text = this.getText(); - var size = this.getBubbleSize(); - if (visible) { - // Create the bubble. - this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), - this.createEditor_(), this.block_.svgPath_, - this.iconXY_, this.width_, this.height_); - // Expose this comment's block's ID on its top-level SVG group. - this.bubble_.setSvgId(this.block_.id); - this.bubble_.registerResizeEvent(this.resizeBubble_.bind(this)); - this.updateColour(); - } else { - // Dispose of the bubble. - this.bubble_.dispose(); - this.bubble_ = null; - this.textarea_ = null; - this.foreignObject_ = null; - } - // Restore the bubble stats after the visibility switch. - this.setText(text); - this.setBubbleSize(size.width, size.height); -}; - -/** - * Bring the comment to the top of the stack when clicked on. - * @param {!Event} _e Mouse up event. - * @private - */ -Blockly.Comment.prototype.textareaFocus_ = function(_e) { - // Ideally this would be hooked to the focus event for the comment. - // This is tied to mousedown, however doing so in Firefox swallows the cursor - // for unknown reasons. - // See https://github.com/LLK/scratch-blocks/issues/1631 for more history. - if (this.bubble_.promote_()) { - // Since the act of moving this node within the DOM causes a loss of focus, - // we need to reapply the focus. - this.textarea_.focus(); - } -}; - -/** - * Get the dimensions of this comment's bubble. - * @return {!Object} Object with width and height properties. - */ -Blockly.Comment.prototype.getBubbleSize = function() { - if (this.isVisible()) { - return this.bubble_.getBubbleSize(); - } else { - return {width: this.width_, height: this.height_}; - } -}; - -/** - * Size this comment's bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - */ -Blockly.Comment.prototype.setBubbleSize = function(width, height) { - if (this.textarea_) { - this.bubble_.setBubbleSize(width, height); - } else { - this.width_ = width; - this.height_ = height; - } -}; - -/** - * Returns this comment's text. - * @return {string} Comment text. - */ -Blockly.Comment.prototype.getText = function() { - return this.textarea_ ? this.textarea_.value : this.text_; -}; - -/** - * Set this comment's text. - * @param {string} text Comment text. - */ -Blockly.Comment.prototype.setText = function(text) { - if (this.text_ != text) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.block_, 'comment', null, this.text_, text)); - this.text_ = text; - } - if (this.textarea_) { - this.textarea_.value = text; - } -}; - -/** - * Dispose of this comment. - */ -Blockly.Comment.prototype.dispose = function() { - if (Blockly.Events.isEnabled()) { - this.setText(''); // Fire event to delete comment. - } - this.block_.comment = null; - Blockly.Icon.prototype.dispose.call(this); -}; diff --git a/packages/scratch-blocks/core/comment_events.js b/packages/scratch-blocks/core/comment_events.js deleted file mode 100644 index d9a13c7f2..000000000 --- a/packages/scratch-blocks/core/comment_events.js +++ /dev/null @@ -1,539 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Classes for all comment events. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Events.CommentBase'); -goog.provide('Blockly.Events.CommentChange'); -goog.provide('Blockly.Events.CommentCreate'); -goog.provide('Blockly.Events.CommentDelete'); -goog.provide('Blockly.Events.CommentMove'); - -goog.require('Blockly.Events'); -goog.require('Blockly.Events.Abstract'); - -goog.require('goog.math.Coordinate'); - - -/** - * Abstract class for a comment event. - * @param {Blockly.WorkspaceComment | Blockly.ScratchBlockComment} comment - * The comment this event corresponds to. - * @extends {Blockly.Events.Abstract} - * @constructor - */ -Blockly.Events.CommentBase = function(comment) { - /** - * The ID of the comment this event pertains to. - * @type {string} - */ - this.commentId = comment.id; - - /** - * The workspace identifier for this event. - * @type {string} - */ - this.workspaceId = comment.workspace.id; - - /** - * The ID of the block this comment belongs to or null if it is not a block - * comment. - * @type {string} - */ - this.blockId = comment.blockId || null; - - /** - * The event group id for the group this event belongs to. Groups define - * events that should be treated as an single action from the user's - * perspective, and should be undone together. - * @type {string} - */ - this.group = Blockly.Events.group_; - - /** - * Sets whether the event should be added to the undo stack. - * @type {boolean} - */ - this.recordUndo = Blockly.Events.recordUndo; -}; -goog.inherits(Blockly.Events.CommentBase, Blockly.Events.Abstract); - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.CommentBase.prototype.toJson = function() { - var json = { - 'type': this.type - }; - if (this.group) { - json['group'] = this.group; - } - if (this.commentId) { - json['commentId'] = this.commentId; - } - if (this.blockId) { - json['blockId'] = this.blockId; - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.CommentBase.prototype.fromJson = function(json) { - this.commentId = json['commentId']; - this.group = json['group']; - this.blockId = json['blockId']; -}; - -/** - * Helper function for finding the comment this event pertains to. - * @return {?(Blockly.WorkspaceComment | Blockly.ScratchBlockComment)} - * The comment this event pertains to, or null if it no longer exists. - * @private - */ -Blockly.Events.CommentBase.prototype.getComment_ = function() { - var workspace = this.getEventWorkspace_(); - return workspace.getCommentById(this.commentId); -}; - -/** - * Class for a comment change event. - * @param {Blockly.WorkspaceComment | Blockly.ScratchBlockComment} comment - * The comment that is being changed. Null for a blank event. - * @param {!object} oldContents Object containing previous state of a comment's - * properties. The possible properties can be: 'minimized', 'text', or - * 'width' and 'height' together. Must contain the same property (or in the - * case of 'width' and 'height' properties) as the 'newContents' param. - * @param {!object} newContents Object containing the new state of a comment's - * properties. The possible properties can be: 'minimized', 'text', or - * 'width' and 'height' together. Must contain the same property (or in the - * case of 'width' and 'height' properties) as the 'oldContents' param. - * @extends {Blockly.Events.CommentBase} - * @constructor - */ -Blockly.Events.CommentChange = function(comment, oldContents, newContents) { - if (!comment) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.CommentChange.superClass_.constructor.call(this, comment); - this.oldContents_ = oldContents; - this.newContents_ = newContents; -}; -goog.inherits(Blockly.Events.CommentChange, Blockly.Events.CommentBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.CommentChange.prototype.type = Blockly.Events.COMMENT_CHANGE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.CommentChange.prototype.toJson = function() { - var json = Blockly.Events.CommentChange.superClass_.toJson.call(this); - json['newContents'] = this.newContents_; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.CommentChange.prototype.fromJson = function(json) { - Blockly.Events.CommentChange.superClass_.fromJson.call(this, json); - this.newContents_ = json['newValue']; -}; - -/** - * Does this event record any change of state? - * @return {boolean} False if something changed. - */ -Blockly.Events.CommentChange.prototype.isNull = function() { - return this.oldContents_ == this.newContents_; -}; - -/** - * Run a change event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.CommentChange.prototype.run = function(forward) { - var comment = this.getComment_(); - if (!comment) { - console.warn('Can\'t change non-existent comment: ' + this.commentId); - return; - } - var contents = forward ? this.newContents_ : this.oldContents_; - - if (contents.hasOwnProperty('minimized')) { - comment.setMinimized(contents.minimized); - } - if (contents.hasOwnProperty('width') && contents.hasOwnProperty('height')) { - comment.setSize(contents.width, contents.height); - } - if (contents.hasOwnProperty('text')) { - comment.setText(contents.text); - } -}; - -/** - * Class for a comment creation event. - * @param {Blockly.WorkspaceComment | Blockly.ScratchBlockComment} comment - * The created comment. Null for a blank event. - * @param {string=} opt_blockId Optional id for the block this comment belongs - * to, if it is a block comment. - * @extends {Blockly.Events.CommentBase} - * @constructor - */ -Blockly.Events.CommentCreate = function(comment) { - if (!comment) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.CommentCreate.superClass_.constructor.call(this, comment); - - /** - * The text content of this comment. - * @type {string} - */ - this.text = comment.getText(); - - /** - * The XY position of this comment on the workspace. - * @type {goog.math.Coordinate} - */ - this.xy = comment.getXY(); - - var hw = comment.getHeightWidth(); - - /** - * The width of this comment when it is full size. - * @type {number} - */ - this.width = hw.width; - - /** - * The height of this comment when it is full size. - * @type {number} - */ - this.height = hw.height; - - /** - * Whether or not this comment is minimized. - * @type {boolean} - */ - this.minimized = comment.isMinimized() || false; - - this.xml = comment.toXmlWithXY(); -}; -goog.inherits(Blockly.Events.CommentCreate, Blockly.Events.CommentBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.CommentCreate.prototype.type = Blockly.Events.COMMENT_CREATE; - -/** - * Encode the event as JSON. - * TODO (github.com/google/blockly/issues/1266): "Full" and "minimal" - * serialization. - * @return {!Object} JSON representation. - */ -Blockly.Events.CommentCreate.prototype.toJson = function() { - var json = Blockly.Events.CommentCreate.superClass_.toJson.call(this); - json['xml'] = Blockly.Xml.domToText(this.xml); - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.CommentCreate.prototype.fromJson = function(json) { - Blockly.Events.CommentCreate.superClass_.fromJson.call(this, json); - this.xml = Blockly.Xml.textToDom('' + json['xml'] + '').firstChild; -}; - -/** - * Run a creation event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.CommentCreate.prototype.run = function(forward) { - if (forward) { - var workspace = this.getEventWorkspace_(); - if (this.blockId) { - var block = workspace.getBlockById(this.blockId); - if (block) { - block.setCommentText('', this.commentId, this.xy.x, this.xy.y, this.minimized); - } - } else { - var xml = goog.dom.createDom('xml'); - xml.appendChild(this.xml); - Blockly.Xml.domToWorkspace(xml, workspace); - } - } else { - var comment = this.getComment_(); - if (comment) { - comment.dispose(false, false); - } else { - // Only complain about root-level block. - console.warn("Can't uncreate non-existent comment: " + this.commentId); - } - } -}; - -/** - * Class for a comment deletion event. - * @param {Blockly.WorkspaceComment | Blockly.ScratchBlockComment} comment - * The deleted comment. Null for a blank event. - * @extends {Blockly.Events.CommentBase} - * @constructor - */ -Blockly.Events.CommentDelete = function(comment) { - if (!comment) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.CommentDelete.superClass_.constructor.call(this, comment); - this.xy = comment.getXY(); - this.minimized = comment.isMinimized() || false; - this.text = comment.getText(); - var hw = comment.getHeightWidth(); - this.height = hw.height; - this.width = hw.width; - - this.xml = comment.toXmlWithXY(); -}; -goog.inherits(Blockly.Events.CommentDelete, Blockly.Events.CommentBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.CommentDelete.prototype.type = Blockly.Events.COMMENT_DELETE; - -/** - * Encode the event as JSON. - * TODO (github.com/google/blockly/issues/1266): "Full" and "minimal" - * serialization. - * @return {!Object} JSON representation. - */ -Blockly.Events.CommentDelete.prototype.toJson = function() { - var json = Blockly.Events.CommentDelete.superClass_.toJson.call(this); - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.CommentDelete.prototype.fromJson = function(json) { - Blockly.Events.CommentDelete.superClass_.fromJson.call(this, json); -}; - -/** - * Run a creation event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.CommentDelete.prototype.run = function(forward) { - if (forward) { - var comment = this.getComment_(); - if (comment) { - comment.dispose(false, false); - } else { - // Only complain about root-level block. - console.warn("Can't delete non-existent comment: " + this.commentId); - } - } else { - var workspace = this.getEventWorkspace_(); - if (this.blockId) { - var block = workspace.getBlockById(this.blockId); - block.setCommentText(this.text, this.commentId, this.xy.x, this.xy.y, this.minimized); - block.comment.setSize(this.width, this.height); - } else { - var xml = goog.dom.createDom('xml'); - xml.appendChild(this.xml); - Blockly.Xml.domToWorkspace(xml, workspace); - } - } -}; - -/** - * Class for a comment move event. Created before the move. - * @param {Blockly.WorkspaceComment | Blockly.ScratchBlockComment} comment - * The comment that is being moved. Null for a blank event. - * @extends {Blockly.Events.CommentBase} - * @constructor - */ -Blockly.Events.CommentMove = function(comment) { - if (!comment) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.CommentMove.superClass_.constructor.call(this, comment); - - /** - * The comment that is being moved. Will be cleared after recording the new - * location. - * @type {?Blockly.WorkspaceComment | Blockly.ScratchBlockComment} - */ - this.comment_ = comment; - - this.workspaceWidth_ = comment.workspace.getWidth(); - /** - * The location before the move, in workspace coordinates. - * @type {!goog.math.Coordinate} - */ - this.oldCoordinate_ = this.currentLocation_(); - - /** - * The location after the move, in workspace coordinates. - * @type {!goog.math.Coordinate} - */ - this.newCoordinate_ = null; -}; -goog.inherits(Blockly.Events.CommentMove, Blockly.Events.CommentBase); - -/** - * Calculate the current, language agnostic location of the comment. - * This value should not report different numbers in LTR vs. RTL. - * @return {goog.math.Coordinate} The location of the comment. - * @private - */ -Blockly.Events.CommentMove.prototype.currentLocation_ = function() { - var xy = this.comment_.getXY(); - if (!this.comment_.workspace.RTL) { - return xy; - } - - var rtlAwareX; - if (this.comment_ instanceof Blockly.ScratchBlockComment) { - var commentWidth = this.comment_.getBubbleSize().width; - rtlAwareX = this.workspaceWidth_ - xy.x - commentWidth; - } else { - rtlAwareX = this.workspaceWidth_ - xy.x; - } - return new goog.math.Coordinate(rtlAwareX, xy.y); -}; - -/** - * Record the comment's new location. Called after the move. Can only be - * called once. - */ -Blockly.Events.CommentMove.prototype.recordNew = function() { - if (!this.comment_) { - throw new Error('Tried to record the new position of a comment on the ' + - 'same event twice.'); - } - this.newCoordinate_ = this.currentLocation_(); - this.comment_ = null; -}; - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.CommentMove.prototype.type = Blockly.Events.COMMENT_MOVE; - -/** - * Override the location before the move. Use this if you don't create the - * event until the end of the move, but you know the original location. - * @param {!goog.math.Coordinate} xy The location before the move, in workspace - * coordinates. - */ -Blockly.Events.CommentMove.prototype.setOldCoordinate = function(xy) { - this.oldCoordinate_ = new goog.math.Coordinate(this.comment_.workspace.RTL ? - this.workspaceWidth_ - xy.x : xy.x, xy.y); -}; - -/** - * Encode the event as JSON. - * TODO (github.com/google/blockly/issues/1266): "Full" and "minimal" - * serialization. - * @return {!Object} JSON representation. - */ -Blockly.Events.CommentMove.prototype.toJson = function() { - var json = Blockly.Events.CommentMove.superClass_.toJson.call(this); - if (this.newCoordinate_) { - json['newCoordinate'] = Math.round(this.newCoordinate_.x) + ',' + - Math.round(this.newCoordinate_.y); - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.CommentMove.prototype.fromJson = function(json) { - Blockly.Events.CommentMove.superClass_.fromJson.call(this, json); - - if (json['newCoordinate']) { - var xy = json['newCoordinate'].split(','); - this.newCoordinate_ = - new goog.math.Coordinate(parseFloat(xy[0]), parseFloat(xy[1])); - } -}; - -/** - * Does this event record any change of state? - * @return {boolean} False if something changed. - */ -Blockly.Events.CommentMove.prototype.isNull = function() { - return goog.math.Coordinate.equals(this.oldCoordinate_, this.newCoordinate_); -}; - -/** - * Run a move event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.CommentMove.prototype.run = function(forward) { - var comment = this.getComment_(); - if (!comment) { - console.warn('Can\'t move non-existent comment: ' + this.commentId); - return; - } - - var target = forward ? this.newCoordinate_ : this.oldCoordinate_; - - if (comment instanceof Blockly.ScratchBlockComment) { - if (comment.workspace.RTL) { - comment.moveTo(this.workspaceWidth_ - target.x, target.y); - } else { - comment.moveTo(target.x, target.y); - } - } else { - // TODO: Check if the comment is being dragged, and give up if so. - var current = comment.getXY(); - if (comment.workspace.RTL) { - var deltaX = target.x - (this.workspaceWidth_ - current.x); - comment.moveBy(-deltaX, target.y - current.y); - } else { - comment.moveBy(target.x - current.x, target.y - current.y); - } - - } -}; diff --git a/packages/scratch-blocks/core/connection.js b/packages/scratch-blocks/core/connection.js deleted file mode 100644 index cfc0f779c..000000000 --- a/packages/scratch-blocks/core/connection.js +++ /dev/null @@ -1,766 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Components for creating connections between blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Connection'); - -goog.require('Blockly.Events.BlockMove'); - -goog.require('goog.asserts'); -goog.require('goog.dom'); - - -/** - * Class for a connection between blocks. - * @param {!Blockly.Block} source The block establishing this connection. - * @param {number} type The type of the connection. - * @constructor - */ -Blockly.Connection = function(source, type) { - /** - * @type {!Blockly.Block} - * @protected - */ - this.sourceBlock_ = source; - /** @type {number} */ - this.type = type; - // Shortcut for the databases for this connection's workspace. - if (source.workspace.connectionDBList) { - this.db_ = source.workspace.connectionDBList[type]; - this.dbOpposite_ = - source.workspace.connectionDBList[Blockly.OPPOSITE_TYPE[type]]; - this.hidden_ = !this.db_; - } -}; - -/** - * Constants for checking whether two connections are compatible. - */ -Blockly.Connection.CAN_CONNECT = 0; -Blockly.Connection.REASON_SELF_CONNECTION = 1; -Blockly.Connection.REASON_WRONG_TYPE = 2; -Blockly.Connection.REASON_TARGET_NULL = 3; -Blockly.Connection.REASON_CHECKS_FAILED = 4; -Blockly.Connection.REASON_DIFFERENT_WORKSPACES = 5; -Blockly.Connection.REASON_SHADOW_PARENT = 6; -// Fixes #1127, but may be the wrong solution. -Blockly.Connection.REASON_CUSTOM_PROCEDURE = 7; - -/** - * Connection this connection connects to. Null if not connected. - * @type {Blockly.Connection} - */ -Blockly.Connection.prototype.targetConnection = null; - -/** - * List of compatible value types. Null if all types are compatible. - * @type {Array} - * @private - */ -Blockly.Connection.prototype.check_ = null; - -/** - * DOM representation of a shadow block, or null if none. - * @type {Element} - * @private - */ -Blockly.Connection.prototype.shadowDom_ = null; - -/** - * Horizontal location of this connection. - * @type {number} - * @protected - */ -Blockly.Connection.prototype.x_ = 0; - -/** - * Vertical location of this connection. - * @type {number} - * @protected - */ -Blockly.Connection.prototype.y_ = 0; - -/** - * Has this connection been added to the connection database? - * @type {boolean} - * @protected - */ -Blockly.Connection.prototype.inDB_ = false; - -/** - * Connection database for connections of this type on the current workspace. - * @type {Blockly.ConnectionDB} - * @protected - */ -Blockly.Connection.prototype.db_ = null; - -/** - * Connection database for connections compatible with this type on the - * current workspace. - * @type {Blockly.ConnectionDB} - * @protected - */ -Blockly.Connection.prototype.dbOpposite_ = null; - -/** - * Whether this connections is hidden (not tracked in a database) or not. - * @type {boolean} - * @protected - */ -Blockly.Connection.prototype.hidden_ = null; - -/** - * Connect two connections together. This is the connection on the superior - * block. - * @param {!Blockly.Connection} childConnection Connection on inferior block. - * @protected - */ -Blockly.Connection.prototype.connect_ = function(childConnection) { - var parentConnection = this; - var parentBlock = parentConnection.getSourceBlock(); - var childBlock = childConnection.getSourceBlock(); - var isSurroundingC = false; - if (parentConnection == parentBlock.getFirstStatementConnection()) { - isSurroundingC = true; - } - // Disconnect any existing parent on the child connection. - if (childConnection.isConnected()) { - // Scratch-specific behaviour: - // If we're using a c-shaped block to surround a stack, remember where the - // stack used to be connected. - if (isSurroundingC) { - var previousParentConnection = childConnection.targetConnection; - } - childConnection.disconnect(); - } - if (parentConnection.isConnected()) { - // Other connection is already connected to something. - // Disconnect it and reattach it or bump it as needed. - var orphanBlock = parentConnection.targetBlock(); - var shadowDom = parentConnection.getShadowDom(); - // Temporarily set the shadow DOM to null so it does not respawn. - parentConnection.setShadowDom(null); - // Displaced shadow blocks dissolve rather than reattaching or bumping. - if (orphanBlock.isShadow()) { - // Save the shadow block so that field values are preserved. - shadowDom = Blockly.Xml.blockToDom(orphanBlock); - orphanBlock.dispose(); - orphanBlock = null; - } else if (parentConnection.type == Blockly.NEXT_STATEMENT) { - // Statement connections. - // Statement blocks may be inserted into the middle of a stack. - // Split the stack. - if (!orphanBlock.previousConnection) { - throw 'Orphan block does not have a previous connection.'; - } - // Attempt to reattach the orphan at the bottom of the newly inserted - // block. Since this block may be a stack, walk down to the end. - var newBlock = childBlock; - while (newBlock.nextConnection) { - var nextBlock = newBlock.getNextBlock(); - if (nextBlock && !nextBlock.isShadow()) { - newBlock = nextBlock; - } else { - if (orphanBlock.previousConnection.checkType_( - newBlock.nextConnection)) { - newBlock.nextConnection.connect(orphanBlock.previousConnection); - orphanBlock = null; - } - break; - } - } - } - if (orphanBlock) { - // Unable to reattach orphan. - parentConnection.disconnect(); - if (Blockly.Events.recordUndo) { - // Bump it off to the side after a moment. - var group = Blockly.Events.getGroup(); - setTimeout(function() { - // Verify orphan hasn't been deleted or reconnected (user on meth). - if (orphanBlock.workspace && !orphanBlock.getParent()) { - Blockly.Events.setGroup(group); - if (orphanBlock.outputConnection) { - orphanBlock.outputConnection.bumpAwayFrom_(parentConnection); - } else if (orphanBlock.previousConnection) { - orphanBlock.previousConnection.bumpAwayFrom_(parentConnection); - } - Blockly.Events.setGroup(false); - } - }, Blockly.BUMP_DELAY); - } - } - // Restore the shadow DOM. - parentConnection.setShadowDom(shadowDom); - } - - if (isSurroundingC && previousParentConnection) { - previousParentConnection.connect(parentBlock.previousConnection); - } - - var event; - if (Blockly.Events.isEnabled()) { - event = new Blockly.Events.BlockMove(childBlock); - } - // Establish the connections. - Blockly.Connection.connectReciprocally_(parentConnection, childConnection); - // Demote the inferior block so that one is a child of the superior one. - childBlock.setParent(parentBlock); - if (event) { - event.recordNew(); - Blockly.Events.fire(event); - } -}; - -/** - * Sever all links to this connection (not including from the source object). - */ -Blockly.Connection.prototype.dispose = function() { - if (this.isConnected()) { - throw 'Disconnect connection before disposing of it.'; - } - if (this.inDB_) { - this.db_.removeConnection_(this); - } - this.db_ = null; - this.dbOpposite_ = null; -}; - -/** - * @return {boolean} true if the connection is not connected or is connected to - * an insertion marker, false otherwise. - */ -Blockly.Connection.prototype.isConnectedToNonInsertionMarker = function() { - return this.targetConnection && !this.targetBlock().isInsertionMarker(); -}; - -/** - * Get the source block for this connection. - * @return {Blockly.Block} The source block, or null if there is none. - */ -Blockly.Connection.prototype.getSourceBlock = function() { - return this.sourceBlock_; -}; - -/** - * Does the connection belong to a superior block (higher in the source stack)? - * @return {boolean} True if connection faces down or right. - */ -Blockly.Connection.prototype.isSuperior = function() { - return this.type == Blockly.INPUT_VALUE || - this.type == Blockly.NEXT_STATEMENT; -}; - -/** - * Is the connection connected? - * @return {boolean} True if connection is connected to another connection. - */ -Blockly.Connection.prototype.isConnected = function() { - return !!this.targetConnection; -}; - -/** - * Checks whether the current connection can connect with the target - * connection. - * @param {Blockly.Connection} target Connection to check compatibility with. - * @return {number} Blockly.Connection.CAN_CONNECT if the connection is legal, - * an error code otherwise. - * @private - */ -Blockly.Connection.prototype.canConnectWithReason_ = function(target) { - if (!target) { - return Blockly.Connection.REASON_TARGET_NULL; - } - if (this.isSuperior()) { - var blockA = this.sourceBlock_; - var blockB = target.getSourceBlock(); - var superiorConn = this; - } else { - var blockB = this.sourceBlock_; - var blockA = target.getSourceBlock(); - var superiorConn = target; - } - if (blockA && blockA == blockB) { - return Blockly.Connection.REASON_SELF_CONNECTION; - } else if (target.type != Blockly.OPPOSITE_TYPE[this.type]) { - return Blockly.Connection.REASON_WRONG_TYPE; - } else if (blockA && blockB && blockA.workspace !== blockB.workspace) { - return Blockly.Connection.REASON_DIFFERENT_WORKSPACES; - } else if (!this.checkType_(target)) { - return Blockly.Connection.REASON_CHECKS_FAILED; - } else if (blockA.isShadow() && !blockB.isShadow()) { - return Blockly.Connection.REASON_SHADOW_PARENT; - } else if ((blockA.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE && - blockB.type != Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE && - superiorConn == blockA.getInput('custom_block').connection) || - (blockB.type == Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE && - blockA.type != Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE)) { - // Hack to fix #1127: Fail attempts to connect to the custom_block input - // on a defnoreturn block, unless the connecting block is a specific type. - // And hack to fix #1534: Fail attempts to connect anything but a - // defnoreturn block to a prototype block. - return Blockly.Connection.REASON_CUSTOM_PROCEDURE; - } - return Blockly.Connection.CAN_CONNECT; -}; - -/** - * Checks whether the current connection and target connection are compatible - * and throws an exception if they are not. - * @param {Blockly.Connection} target The connection to check compatibility - * with. - * @private - */ -Blockly.Connection.prototype.checkConnection_ = function(target) { - switch (this.canConnectWithReason_(target)) { - case Blockly.Connection.CAN_CONNECT: - break; - case Blockly.Connection.REASON_SELF_CONNECTION: - throw 'Attempted to connect a block to itself.'; - case Blockly.Connection.REASON_DIFFERENT_WORKSPACES: - // Usually this means one block has been deleted. - throw 'Blocks not on same workspace.'; - case Blockly.Connection.REASON_WRONG_TYPE: - throw 'Attempt to connect incompatible types.'; - case Blockly.Connection.REASON_TARGET_NULL: - throw 'Target connection is null.'; - case Blockly.Connection.REASON_CHECKS_FAILED: - var msg = 'Connection checks failed. '; - msg += this + ' expected ' + this.check_ + ', found ' + target.check_; - throw msg; - case Blockly.Connection.REASON_SHADOW_PARENT: - throw 'Connecting non-shadow to shadow block.'; - case Blockly.Connection.REASON_CUSTOM_PROCEDURE: - throw 'Trying to replace a shadow on a custom procedure definition.'; - default: - throw 'Unknown connection failure: this should never happen!'; - } -}; - -/** - * Check if the two connections can be dragged to connect to each other. - * This is used by the connection database when searching for the closest - * connection. - * @param {!Blockly.Connection} candidate A nearby connection to check, which - * must be a previous connection. - * @return {boolean} True if the connection is allowed, false otherwise. - */ -Blockly.Connection.prototype.canConnectToPrevious_ = function(candidate) { - if (this.targetConnection) { - // This connection is already occupied. - // A next connection will never disconnect itself mid-drag. - return false; - } - - // Don't let blocks try to connect to themselves or ones they nest. - if (Blockly.draggingConnections_.indexOf(candidate) != -1) { - return false; - } - - var firstStatementConnection = - this.sourceBlock_.getFirstStatementConnection(); - // Is it a C-shaped (e.g. repeat) or E-shaped (e.g. if-else) block? - var isComplexStatement = firstStatementConnection != null; - var isFirstStatementConnection = this == firstStatementConnection; - var isNextConnection = this == this.sourceBlock_.nextConnection; - - // Scratch-specific behaviour: can connect to the first statement input of a - // C-shaped or E-shaped block, or to the next connection of any statement - // block, but not to the second statement input of an E-shaped block. - if (isComplexStatement && !isFirstStatementConnection && !isNextConnection) { - return false; - } - - // Complex blocks with no previous connection will not be allowed to connect - // mid-stack. - var sourceHasPreviousConn = this.sourceBlock_.previousConnection != null; - - if (isFirstStatementConnection && sourceHasPreviousConn) { - return true; - } - - if (isNextConnection || - (isFirstStatementConnection && !sourceHasPreviousConn)) { - // If the candidate is the first connection in a stack, we can connect. - if (!candidate.targetConnection) { - return true; - } - - var targetBlock = candidate.targetBlock(); - // If it is connected a real block, game over. - if (!targetBlock.isInsertionMarker()) { - return false; - } - // If it's connected to an insertion marker but that insertion marker - // is the first block in a stack, it's still fine. If that insertion - // marker is in the middle of a stack, it won't work. - return !targetBlock.getPreviousBlock(); - } -}; - -/** - * Check if the two connections can be dragged to connect to each other. - * This is used by the connection database when searching for the closest - * connection. - * @param {!Blockly.Connection} candidate A nearby connection to check. - * @return {boolean} True if the connection is allowed, false otherwise. - */ -Blockly.Connection.prototype.isConnectionAllowed = function(candidate) { - - // Don't consider insertion markers. - if (candidate.sourceBlock_.isInsertionMarker()) { - return false; - } - - // Type checking. - var canConnect = this.canConnectWithReason_(candidate); - if (canConnect != Blockly.Connection.CAN_CONNECT) { - return false; - } - - var firstStatementConnection = - this.sourceBlock_.getFirstStatementConnection(); - switch (candidate.type) { - case Blockly.PREVIOUS_STATEMENT: - return this.canConnectToPrevious_(candidate); - case Blockly.OUTPUT_VALUE: { - // Can't drag an input to an output--you have to move the inferior block. - return false; - } - case Blockly.INPUT_VALUE: { - // Offering to connect the left (male) of a value block to an already - // connected value pair is ok, we'll splice it in. - // However, don't offer to splice into an unmovable block. - if (candidate.targetConnection && - !candidate.targetBlock().isMovable() && - !candidate.targetBlock().isShadow()) { - return false; - } - break; - } - case Blockly.NEXT_STATEMENT: { - // Scratch-specific behaviour: - // If this is a c-block, we can't connect this block's - // previous connection unless we're connecting to the end of the last - // block on a stack or there's already a block connected inside the c. - if (firstStatementConnection && - this == this.sourceBlock_.previousConnection && - candidate.isConnectedToNonInsertionMarker() && - !firstStatementConnection.targetConnection) { - return false; - } - // Don't let a block with no next connection bump other blocks out of the - // stack. But covering up a shadow block or stack of shadow blocks is - // fine. Similarly, replacing a terminal statement with another terminal - // statement is allowed. - if (candidate.isConnectedToNonInsertionMarker() && - !this.sourceBlock_.nextConnection && - !candidate.targetBlock().isShadow() && - candidate.targetBlock().nextConnection) { - return false; - } - break; - } - default: - throw 'Unknown connection type in isConnectionAllowed'; - } - - // Don't let blocks try to connect to themselves or ones they nest. - if (Blockly.draggingConnections_.indexOf(candidate) != -1) { - return false; - } - - return true; -}; - -/** - * Connect this connection to another connection. - * @param {!Blockly.Connection} otherConnection Connection to connect to. - */ -Blockly.Connection.prototype.connect = function(otherConnection) { - if (this.targetConnection == otherConnection) { - // Already connected together. NOP. - return; - } - this.checkConnection_(otherConnection); - // Determine which block is superior (higher in the source stack). - if (this.isSuperior()) { - // Superior block. - this.connect_(otherConnection); - } else { - // Inferior block. - otherConnection.connect_(this); - } -}; - -/** - * Update two connections to target each other. - * @param {Blockly.Connection} first The first connection to update. - * @param {Blockly.Connection} second The second connection to update. - * @private - */ -Blockly.Connection.connectReciprocally_ = function(first, second) { - goog.asserts.assert(first && second, 'Cannot connect null connections.'); - first.targetConnection = second; - second.targetConnection = first; -}; - -/** - * Does the given block have one and only one connection point that will accept - * an orphaned block? - * @param {!Blockly.Block} block The superior block. - * @param {!Blockly.Block} orphanBlock The inferior block. - * @return {Blockly.Connection} The suitable connection point on 'block', - * or null. - * @private - */ -Blockly.Connection.singleConnection_ = function(block, orphanBlock) { - var connection = false; - for (var i = 0; i < block.inputList.length; i++) { - var thisConnection = block.inputList[i].connection; - if (thisConnection && thisConnection.type == Blockly.INPUT_VALUE && - orphanBlock.outputConnection.checkType_(thisConnection)) { - if (connection) { - return null; // More than one connection. - } - connection = thisConnection; - } - } - return connection; -}; - -/** - * Disconnect this connection. - */ -Blockly.Connection.prototype.disconnect = function() { - var otherConnection = this.targetConnection; - goog.asserts.assert(otherConnection, 'Source connection not connected.'); - goog.asserts.assert(otherConnection.targetConnection == this, - 'Target connection not connected to source connection.'); - - var parentBlock, childBlock, parentConnection; - if (this.isSuperior()) { - // Superior block. - parentBlock = this.sourceBlock_; - childBlock = otherConnection.getSourceBlock(); - parentConnection = this; - } else { - // Inferior block. - parentBlock = otherConnection.getSourceBlock(); - childBlock = this.sourceBlock_; - parentConnection = otherConnection; - } - this.disconnectInternal_(parentBlock, childBlock); - parentConnection.respawnShadow_(); -}; - -/** - * Disconnect two blocks that are connected by this connection. - * @param {!Blockly.Block} parentBlock The superior block. - * @param {!Blockly.Block} childBlock The inferior block. - * @protected - */ -Blockly.Connection.prototype.disconnectInternal_ = function(parentBlock, - childBlock) { - var event; - if (Blockly.Events.isEnabled()) { - event = new Blockly.Events.BlockMove(childBlock); - } - var otherConnection = this.targetConnection; - otherConnection.targetConnection = null; - this.targetConnection = null; - childBlock.setParent(null); - if (event) { - event.recordNew(); - Blockly.Events.fire(event); - } -}; - -/** - * Respawn the shadow block if there was one connected to the this connection. - * @protected - */ -Blockly.Connection.prototype.respawnShadow_ = function() { - var parentBlock = this.getSourceBlock(); - var shadow = this.getShadowDom(); - if (parentBlock.workspace && shadow && Blockly.Events.recordUndo) { - var blockShadow = - Blockly.Xml.domToBlock(shadow, parentBlock.workspace); - if (blockShadow.outputConnection) { - this.connect(blockShadow.outputConnection); - } else if (blockShadow.previousConnection) { - this.connect(blockShadow.previousConnection); - } else { - throw 'Child block does not have output or previous statement.'; - } - } -}; - -/** - * Returns the block that this connection connects to. - * @return {Blockly.Block} The connected block or null if none is connected. - */ -Blockly.Connection.prototype.targetBlock = function() { - if (this.isConnected()) { - return this.targetConnection.getSourceBlock(); - } - return null; -}; - -/** - * Is this connection compatible with another connection with respect to the - * value type system. E.g. square_root("Hello") is not compatible. - * @param {!Blockly.Connection} otherConnection Connection to compare against. - * @return {boolean} True if the connections share a type. - * @protected - */ -Blockly.Connection.prototype.checkType_ = function(otherConnection) { - if (!this.check_ || !otherConnection.check_) { - // One or both sides are promiscuous enough that anything will fit. - return true; - } - // Find any intersection in the check lists. - for (var i = 0; i < this.check_.length; i++) { - if (otherConnection.check_.indexOf(this.check_[i]) != -1) { - return true; - } - } - // No intersection. - return false; -}; - -/** - * Function to be called when this connection's compatible types have changed. - * @private - */ -Blockly.Connection.prototype.onCheckChanged_ = function() { - // The new value type may not be compatible with the existing connection. - if (this.isConnected() && !this.checkType_(this.targetConnection)) { - var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; - child.unplug(); - } -}; - -/** - * Change a connection's compatibility. - * @param {*} check Compatible value type or list of value types. - * Null if all types are compatible. - * @return {!Blockly.Connection} The connection being modified - * (to allow chaining). - */ -Blockly.Connection.prototype.setCheck = function(check) { - if (check) { - // Ensure that check is in an array. - if (!goog.isArray(check)) { - check = [check]; - } - this.check_ = check; - this.onCheckChanged_(); - } else { - this.check_ = null; - } - return this; -}; - -/** - * Returns a shape enum for this connection. - * Used in scratch-blocks to draw unoccupied inputs. - * @return {number} Enum representing shape. - */ -Blockly.Connection.prototype.getOutputShape = function() { - if (!this.check_) return Blockly.OUTPUT_SHAPE_ROUND; - if (this.check_.indexOf('Boolean') !== -1) { - return Blockly.OUTPUT_SHAPE_HEXAGONAL; - } - if (this.check_.indexOf('Number') !== -1) { - return Blockly.OUTPUT_SHAPE_ROUND; - } - if (this.check_.indexOf('String') !== -1) { - return Blockly.OUTPUT_SHAPE_SQUARE; - } - return Blockly.OUTPUT_SHAPE_ROUND; -}; - -/** - * Change a connection's shadow block. - * @param {Element} shadow DOM representation of a block or null. - */ -Blockly.Connection.prototype.setShadowDom = function(shadow) { - this.shadowDom_ = shadow; -}; - -/** - * Return a connection's shadow block. - * @return {Element} shadow DOM representation of a block or null. - */ -Blockly.Connection.prototype.getShadowDom = function() { - return this.shadowDom_; -}; - -/** - * Find all nearby compatible connections to this connection. - * Type checking does not apply, since this function is used for bumping. - * - * Headless configurations (the default) do not have neighboring connection, - * and always return an empty list (the default). - * {@link Blockly.RenderedConnection} overrides this behavior with a list - * computed from the rendered positioning. - * @param {number} maxLimit The maximum radius to another connection. - * @return {!Array.} List of connections. - * @private - */ -Blockly.Connection.prototype.neighbours_ = function(/* maxLimit */) { - return []; -}; - -/** - * This method returns a string describing this Connection in developer terms - * (English only). Intended to on be used in console logs and errors. - * @return {string} The description. - */ -Blockly.Connection.prototype.toString = function() { - var msg; - var block = this.sourceBlock_; - if (!block) { - return 'Orphan Connection'; - } else if (block.outputConnection == this) { - msg = 'Output Connection of '; - } else if (block.previousConnection == this) { - msg = 'Previous Connection of '; - } else if (block.nextConnection == this) { - msg = 'Next Connection of '; - } else { - var parentInput = goog.array.find(block.inputList, function(input) { - return input.connection == this; - }, this); - if (parentInput) { - msg = 'Input "' + parentInput.name + '" connection on '; - } else { - console.warn('Connection not actually connected to sourceBlock_'); - return 'Orphan Connection'; - } - } - return msg + block.toDevString(); -}; diff --git a/packages/scratch-blocks/core/connection_db.js b/packages/scratch-blocks/core/connection_db.js deleted file mode 100644 index 476b824bb..000000000 --- a/packages/scratch-blocks/core/connection_db.js +++ /dev/null @@ -1,300 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Components for managing connections between blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.ConnectionDB'); - -goog.require('Blockly.Connection'); - - -/** - * Database of connections. - * Connections are stored in order of their vertical component. This way - * connections in an area may be looked up quickly using a binary search. - * @constructor - */ -Blockly.ConnectionDB = function() { - /** - * Array of connections sorted by y coordinate. - * @type {!Array.} - * @private - */ - this.connections_ = []; -}; - -/** - * Add a connection to the database. Must not already exist in DB. - * @param {!Blockly.Connection} connection The connection to be added. - */ -Blockly.ConnectionDB.prototype.addConnection = function(connection) { - if (connection.inDB_) { - throw Error('Connection already in database.'); - } - if (connection.getSourceBlock().isInFlyout) { - // Don't bother maintaining a database of connections in a flyout. - return; - } - var position = this.findPositionForConnection_(connection); - this.connections_.splice(position, 0, connection); - connection.inDB_ = true; -}; - -/** - * Find the given connection. - * Starts by doing a binary search to find the approximate location, then - * linearly searches nearby for the exact connection. - * @param {!Blockly.Connection} conn The connection to find. - * @return {number} The index of the connection, or -1 if the connection was - * not found. - */ -Blockly.ConnectionDB.prototype.findConnection = function(conn) { - if (!this.connections_.length) { - return -1; - } - - var bestGuess = this.findPositionForConnection_(conn); - if (bestGuess >= this.connections_.length) { - // Not in list - return -1; - } - - var yPos = conn.y_; - // Walk forward and back on the y axis looking for the connection. - var pointerMin = bestGuess; - var pointerMax = bestGuess; - while (pointerMin >= 0 && this.connections_[pointerMin].y_ == yPos) { - if (this.connections_[pointerMin] == conn) { - return pointerMin; - } - pointerMin--; - } - - while (pointerMax < this.connections_.length && - this.connections_[pointerMax].y_ == yPos) { - if (this.connections_[pointerMax] == conn) { - return pointerMax; - } - pointerMax++; - } - return -1; -}; - -/** - * Finds a candidate position for inserting this connection into the list. - * This will be in the correct y order but makes no guarantees about ordering in - * the x axis. - * @param {!Blockly.Connection} connection The connection to insert. - * @return {number} The candidate index. - * @private - */ -Blockly.ConnectionDB.prototype.findPositionForConnection_ = function( - connection) { - if (!this.connections_.length) { - return 0; - } - var pointerMin = 0; - var pointerMax = this.connections_.length; - while (pointerMin < pointerMax) { - var pointerMid = Math.floor((pointerMin + pointerMax) / 2); - if (this.connections_[pointerMid].y_ < connection.y_) { - pointerMin = pointerMid + 1; - } else if (this.connections_[pointerMid].y_ > connection.y_) { - pointerMax = pointerMid; - } else { - pointerMin = pointerMid; - break; - } - } - return pointerMin; -}; - -/** - * Remove a connection from the database. Must already exist in DB. - * @param {!Blockly.Connection} connection The connection to be removed. - * @private - */ -Blockly.ConnectionDB.prototype.removeConnection_ = function(connection) { - if (!connection.inDB_) { - throw Error('Connection not in database.'); - } - var removalIndex = this.findConnection(connection); - if (removalIndex == -1) { - throw Error('Unable to find connection in connectionDB.'); - } - connection.inDB_ = false; - this.connections_.splice(removalIndex, 1); -}; - -/** - * Find all nearby connections to the given connection. - * Type checking does not apply, since this function is used for bumping. - * @param {!Blockly.Connection} connection The connection whose neighbours - * should be returned. - * @param {number} maxRadius The maximum radius to another connection. - * @return {!Array.} List of connections. - */ -Blockly.ConnectionDB.prototype.getNeighbours = function(connection, maxRadius) { - var db = this.connections_; - var currentX = connection.x_; - var currentY = connection.y_; - - // Binary search to find the closest y location. - var pointerMin = 0; - var pointerMax = db.length - 2; - var pointerMid = pointerMax; - while (pointerMin < pointerMid) { - if (db[pointerMid].y_ < currentY) { - pointerMin = pointerMid; - } else { - pointerMax = pointerMid; - } - pointerMid = Math.floor((pointerMin + pointerMax) / 2); - } - - var neighbours = []; - /** - * Computes if the current connection is within the allowed radius of another - * connection. - * This function is a closure and has access to outside variables. - * @param {number} yIndex The other connection's index in the database. - * @return {boolean} True if the current connection's vertical distance from - * the other connection is less than the allowed radius. - */ - function checkConnection_(yIndex) { - var dx = currentX - db[yIndex].x_; - var dy = currentY - db[yIndex].y_; - var r = Math.sqrt(dx * dx + dy * dy); - if (r <= maxRadius) { - neighbours.push(db[yIndex]); - } - return dy < maxRadius; - } - - // Walk forward and back on the y axis looking for the closest x,y point. - pointerMin = pointerMid; - pointerMax = pointerMid; - if (db.length) { - while (pointerMin >= 0 && checkConnection_(pointerMin)) { - pointerMin--; - } - do { - pointerMax++; - } while (pointerMax < db.length && checkConnection_(pointerMax)); - } - - return neighbours; -}; - - -/** - * Is the candidate connection close to the reference connection. - * Extremely fast; only looks at Y distance. - * @param {number} index Index in database of candidate connection. - * @param {number} baseY Reference connection's Y value. - * @param {number} maxRadius The maximum radius to another connection. - * @return {boolean} True if connection is in range. - * @private - */ -Blockly.ConnectionDB.prototype.isInYRange_ = function(index, baseY, maxRadius) { - return (Math.abs(this.connections_[index].y_ - baseY) <= maxRadius); -}; - -/** - * Find the closest compatible connection to this connection. - * @param {!Blockly.Connection} conn The connection searching for a compatible - * mate. - * @param {number} maxRadius The maximum radius to another connection. - * @param {!goog.math.Coordinate} dxy Offset between this connection's location - * in the database and the current location (as a result of dragging). - * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two - * properties:' connection' which is either another connection or null, - * and 'radius' which is the distance. - */ -Blockly.ConnectionDB.prototype.searchForClosest = function(conn, maxRadius, - dxy) { - // Don't bother. - if (!this.connections_.length) { - return {connection: null, radius: maxRadius}; - } - - // Stash the values of x and y from before the drag. - var baseY = conn.y_; - var baseX = conn.x_; - - conn.x_ = baseX + dxy.x; - conn.y_ = baseY + dxy.y; - - // findPositionForConnection finds an index for insertion, which is always - // after any block with the same y index. We want to search both forward - // and back, so search on both sides of the index. - var closestIndex = this.findPositionForConnection_(conn); - - var bestConnection = null; - var bestRadius = maxRadius; - var temp; - - // Walk forward and back on the y axis looking for the closest x,y point. - var pointerMin = closestIndex - 1; - while (pointerMin >= 0 && this.isInYRange_(pointerMin, conn.y_, maxRadius)) { - temp = this.connections_[pointerMin]; - if (conn.isConnectionAllowed(temp, bestRadius)) { - bestConnection = temp; - bestRadius = temp.distanceFrom(conn); - } - pointerMin--; - } - - var pointerMax = closestIndex; - while (pointerMax < this.connections_.length && - this.isInYRange_(pointerMax, conn.y_, maxRadius)) { - temp = this.connections_[pointerMax]; - if (conn.isConnectionAllowed(temp, bestRadius)) { - bestConnection = temp; - bestRadius = temp.distanceFrom(conn); - } - pointerMax++; - } - - // Reset the values of x and y. - conn.x_ = baseX; - conn.y_ = baseY; - - // If there were no valid connections, bestConnection will be null. - return {connection: bestConnection, radius: bestRadius}; -}; - -/** - * Initialize a set of connection DBs for a specified workspace. - * @param {!Blockly.Workspace} workspace The workspace this DB is for. - */ -Blockly.ConnectionDB.init = function(workspace) { - // Create four databases, one for each connection type. - var dbList = []; - dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(); - dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(); - dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(); - dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(); - workspace.connectionDBList = dbList; -}; diff --git a/packages/scratch-blocks/core/constants.js b/packages/scratch-blocks/core/constants.js deleted file mode 100644 index 2b6d65358..000000000 --- a/packages/scratch-blocks/core/constants.js +++ /dev/null @@ -1,387 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Blockly constants. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.constants'); - - -/** - * Number of pixels the mouse must move before a drag starts. - */ -Blockly.DRAG_RADIUS = 3; - -/** - * Number of pixels the mouse must move before a drag/scroll starts from the - * flyout. Because the drag-intention is determined when this is reached, it is - * larger than Blockly.DRAG_RADIUS so that the drag-direction is clearer. - */ -Blockly.FLYOUT_DRAG_RADIUS = 10; - -/** - * Maximum misalignment between connections for them to snap together. - */ -Blockly.SNAP_RADIUS = 48; - -/** - * Maximum misalignment between connections for them to snap together, - * when a connection is already highlighted. - */ -Blockly.CONNECTING_SNAP_RADIUS = 68; - -/** - * How much to prefer staying connected to the current connection over moving to - * a new connection. The current previewed connection is considered to be this - * much closer to the matching connection on the block than it actually is. - */ -Blockly.CURRENT_CONNECTION_PREFERENCE = 20; - -/** - * Delay in ms between trigger and bumping unconnected block out of alignment. - */ -Blockly.BUMP_DELAY = 0; - -/** - * Number of characters to truncate a collapsed block to. - */ -Blockly.COLLAPSE_CHARS = 30; - -/** - * Length in ms for a touch to become a long press. - */ -Blockly.LONGPRESS = 750; - -/** - * Distance to scroll when a mouse wheel event is received and its delta mode - * is line (0x1) instead of pixel (0x0). In these cases, a single "scroll" has - * a delta of 1, which makes the workspace scroll very slowly (just one pixel). - * To compensate, that delta is multiplied by this value. - * @const - * @package - */ -Blockly.LINE_SCROLL_MULTIPLIER = 15; - -/** - * Prevent a sound from playing if another sound preceded it within this many - * milliseconds. - */ -Blockly.SOUND_LIMIT = 100; - -/** - * When dragging a block out of a stack, split the stack in two (true), or drag - * out the block healing the stack (false). - */ -Blockly.DRAG_STACK = true; - -/** - * The richness of block colours, regardless of the hue. - * Must be in the range of 0 (inclusive) to 1 (exclusive). - */ -Blockly.HSV_SATURATION = 0.45; - -/** - * The intensity of block colours, regardless of the hue. - * Must be in the range of 0 (inclusive) to 1 (exclusive). - */ -Blockly.HSV_VALUE = 0.65; - -/** - * Sprited icons and images. - */ -Blockly.SPRITE = { - width: 96, - height: 124, - url: 'sprites.png' -}; - -// Constants below this point are not intended to be changed. - -/** - * Required name space for SVG elements. - * @const - */ -Blockly.SVG_NS = 'http://www.w3.org/2000/svg'; - -/** - * Required name space for HTML elements. - * @const - */ -Blockly.HTML_NS = 'http://www.w3.org/1999/xhtml'; - -/** - * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. - * @const - */ -Blockly.INPUT_VALUE = 1; - -/** - * ENUM for a left-facing value output. E.g. 'random fraction'. - * @const - */ -Blockly.OUTPUT_VALUE = 2; - -/** - * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. - * @const - */ -Blockly.NEXT_STATEMENT = 3; - -/** - * ENUM for an up-facing block stack. E.g. 'break out of loop'. - * @const - */ -Blockly.PREVIOUS_STATEMENT = 4; - -/** - * ENUM for an dummy input. Used to add field(s) with no input. - * @const - */ -Blockly.DUMMY_INPUT = 5; - -/** - * ENUM for left alignment. - * @const - */ -Blockly.ALIGN_LEFT = -1; - -/** - * ENUM for centre alignment. - * @const - */ -Blockly.ALIGN_CENTRE = 0; - -/** - * ENUM for right alignment. - * @const - */ -Blockly.ALIGN_RIGHT = 1; - -/** - * ENUM for no drag operation. - * @const - */ -Blockly.DRAG_NONE = 0; - -/** - * ENUM for inside the sticky DRAG_RADIUS. - * @const - */ -Blockly.DRAG_STICKY = 1; - -/** - * ENUM for inside the non-sticky DRAG_RADIUS, for differentiating between - * clicks and drags. - * @const - */ -Blockly.DRAG_BEGIN = 1; - -/** - * ENUM for freely draggable (outside the DRAG_RADIUS, if one applies). - * @const - */ -Blockly.DRAG_FREE = 2; - -/** - * Lookup table for determining the opposite type of a connection. - * @const - */ -Blockly.OPPOSITE_TYPE = []; -Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; -Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; - -/** - * ENUM for toolbox and flyout at top of screen. - * @const - */ -Blockly.TOOLBOX_AT_TOP = 0; - -/** - * ENUM for toolbox and flyout at bottom of screen. - * @const - */ -Blockly.TOOLBOX_AT_BOTTOM = 1; - -/** - * ENUM for toolbox and flyout at left of screen. - * @const - */ -Blockly.TOOLBOX_AT_LEFT = 2; - -/** - * ENUM for toolbox and flyout at right of screen. - * @const - */ -Blockly.TOOLBOX_AT_RIGHT = 3; - -/** - * ENUM for output shape: hexagonal (booleans/predicates). - * @const - */ -Blockly.OUTPUT_SHAPE_HEXAGONAL = 1; - -/** - * ENUM for output shape: rounded (numbers). - * @const - */ -Blockly.OUTPUT_SHAPE_ROUND = 2; - -/** - * ENUM for output shape: squared (any/all values; strings). - * @const - */ -Blockly.OUTPUT_SHAPE_SQUARE = 3; - -/** - * ENUM for categories. - * @const - */ -Blockly.Categories = { - "motion": "motion", - "looks": "looks", - "sound": "sounds", - "pen": "pen", - "data": "data", - "dataLists": "data-lists", - "event": "events", - "control": "control", - "sensing": "sensing", - "operators": "operators", - "more": "more" -}; - -/** - * ENUM representing that an event is not in any delete areas. - * Null for backwards compatibility reasons. - * @const - */ -Blockly.DELETE_AREA_NONE = null; - -/** - * ENUM representing that an event is in the delete area of the trash can. - * @const - */ -Blockly.DELETE_AREA_TRASH = 1; - -/** - * ENUM representing that an event is in the delete area of the toolbox or - * flyout. - * @const - */ -Blockly.DELETE_AREA_TOOLBOX = 2; - -/** - * String for use in the "custom" attribute of a category in toolbox xml. - * This string indicates that the category should be dynamically populated with - * variable blocks. - * @const {string} - */ -Blockly.VARIABLE_CATEGORY_NAME = 'VARIABLE'; - -/** - * String for use in the "custom" attribute of a category in toolbox xml. - * This string indicates that the category should be dynamically populated with - * procedure blocks. - * @const {string} - */ -Blockly.PROCEDURE_CATEGORY_NAME = 'PROCEDURE'; - -/** - * String for use in the dropdown created in field_variable. - * This string indicates that this option in the dropdown is 'Rename - * variable...' and if selected, should trigger the prompt to rename a variable. - * @const {string} - */ -Blockly.RENAME_VARIABLE_ID = 'RENAME_VARIABLE_ID'; - -/** - * String for use in the dropdown created in field_variable. - * This string indicates that this option in the dropdown is 'Delete the "%1" - * variable' and if selected, should trigger the prompt to delete a variable. - * @const {string} - */ -Blockly.DELETE_VARIABLE_ID = 'DELETE_VARIABLE_ID'; - -/** - * String for use in the dropdown created in field_variable, - * specifically for broadcast messages. - * This string indicates that this option in the dropdown is 'New message...' - * and if selected, should trigger the prompt to create a new message. - * @const {string} - */ -Blockly.NEW_BROADCAST_MESSAGE_ID = 'NEW_BROADCAST_MESSAGE_ID'; - -/** - * String representing the variable type of broadcast message blocks. - * This string, for use in differentiating between types of variables, - * indicates that the current variable is a broadcast message. - * @const {string} - */ -Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE = 'broadcast_msg'; - -/** - * String representing the variable type of list blocks. - * This string, for use in differentiating between types of variables, - * indicates that the current variable is a list. - * @const {string} - */ -Blockly.LIST_VARIABLE_TYPE = 'list'; - -// TODO (#1251) Replace '' below with 'scalar', and start using this constant -// everywhere. -/** - * String representing the variable type of scalar variables. - * This string, for use in differentiating between types of variables, - * indicates that the current variable is a scalar variable. - * @const {string} - */ -Blockly.SCALAR_VARIABLE_TYPE = ''; - -/** - * The type of all procedure definition blocks. - * @const {string} - */ -Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE = 'procedures_definition'; - -/** - * The type of all procedure prototype blocks. - * @const {string} - */ -Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE = 'procedures_prototype'; - -/** - * The type of all procedure call blocks. - * @const {string} - */ -Blockly.PROCEDURES_CALL_BLOCK_TYPE = 'procedures_call'; - -/** - * ENUM for flyout status button states. - * @const - */ -Blockly.StatusButtonState = { - "READY": "ready", - "NOT_READY": "not ready", -}; diff --git a/packages/scratch-blocks/core/contextmenu.js b/packages/scratch-blocks/core/contextmenu.js deleted file mode 100644 index 65401747e..000000000 --- a/packages/scratch-blocks/core/contextmenu.js +++ /dev/null @@ -1,519 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Functionality for the right-click context menus. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.ContextMenu - * @namespace - */ -goog.provide('Blockly.ContextMenu'); - -goog.require('Blockly.Events.BlockCreate'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.utils'); -goog.require('Blockly.utils.uiMenu'); - -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.style'); -goog.require('goog.ui.Menu'); -goog.require('goog.ui.MenuItem'); -goog.require('goog.userAgent'); - - -/** - * Which block is the context menu attached to? - * @type {Blockly.Block} - */ -Blockly.ContextMenu.currentBlock = null; - -/** - * Opaque data that can be passed to unbindEvent_. - * @type {Array.} - * @private - */ -Blockly.ContextMenu.eventWrapper_ = null; - -/** - * Construct the menu based on the list of options and show the menu. - * @param {!Event} e Mouse event. - * @param {!Array.} options Array of menu options. - * @param {boolean} rtl True if RTL, false if LTR. - */ -Blockly.ContextMenu.show = function(e, options, rtl) { - Blockly.WidgetDiv.show(Blockly.ContextMenu, rtl, null); - if (!options.length) { - Blockly.ContextMenu.hide(); - return; - } - var menu = Blockly.ContextMenu.populate_(options, rtl); - - goog.events.listen( - menu, goog.ui.Component.EventType.ACTION, Blockly.ContextMenu.hide); - - Blockly.ContextMenu.position_(menu, e, rtl); - // 1ms delay is required for focusing on context menus because some other - // mouse event is still waiting in the queue and clears focus. - setTimeout(function() {menu.getElement().focus();}, 1); - Blockly.ContextMenu.currentBlock = null; // May be set by Blockly.Block. -}; - -/** - * Create the context menu object and populate it with the given options. - * @param {!Array.} options Array of menu options. - * @param {boolean} rtl True if RTL, false if LTR. - * @return {!goog.ui.Menu} The menu that will be shown on right click. - * @private - */ -Blockly.ContextMenu.populate_ = function(options, rtl) { - /* Here's what one option object looks like: - {text: 'Make It So', - enabled: true, - callback: Blockly.MakeItSo} - */ - var menu = new goog.ui.Menu(); - menu.setRightToLeft(rtl); - for (var i = 0, option; option = options[i]; i++) { - var menuItem = new goog.ui.MenuItem(option.text); - menuItem.setRightToLeft(rtl); - menu.addChild(menuItem, true); - menuItem.setEnabled(option.enabled); - if (option.enabled) { - goog.events.listen( - menuItem, goog.ui.Component.EventType.ACTION, option.callback); - menuItem.handleContextMenu = function(/* e */) { - // Right-clicking on menu option should count as a click. - goog.events.dispatchEvent(this, goog.ui.Component.EventType.ACTION); - }; - } - } - return menu; -}; - -/** - * Add the menu to the page and position it correctly. - * @param {!goog.ui.Menu} menu The menu to add and position. - * @param {!Event} e Mouse event for the right click that is making the context - * menu appear. - * @param {boolean} rtl True if RTL, false if LTR. - * @private - */ -Blockly.ContextMenu.position_ = function(menu, e, rtl) { - // Record windowSize and scrollOffset before adding menu. - var viewportBBox = Blockly.utils.getViewportBBox(); - // This one is just a point, but we'll pretend that it's a rect so we can use - // some helper functions. - var anchorBBox = { - top: e.clientY + viewportBBox.top, - bottom: e.clientY + viewportBBox.top, - left: e.clientX + viewportBBox.left, - right: e.clientX + viewportBBox.left - }; - - Blockly.ContextMenu.createWidget_(menu); - var menuSize = Blockly.utils.uiMenu.getSize(menu); - - if (rtl) { - Blockly.utils.uiMenu.adjustBBoxesForRTL(viewportBBox, anchorBBox, menuSize); - } - - Blockly.WidgetDiv.positionWithAnchor(viewportBBox, anchorBBox, menuSize, rtl); - // Calling menuDom.focus() has to wait until after the menu has been placed - // correctly. Otherwise it will cause a page scroll to get the misplaced menu - // in view. See issue #1329. - menu.getElement().focus(); -}; - -/** - * Create and render the menu widget inside Blockly's widget div. - * @param {!goog.ui.Menu} menu The menu to add to the widget div. - * @private - */ -Blockly.ContextMenu.createWidget_ = function(menu) { - var div = Blockly.WidgetDiv.DIV; - menu.render(div); - var menuDom = menu.getElement(); - Blockly.utils.addClass(menuDom, 'blocklyContextMenu'); - // Prevent system context menu when right-clicking a Blockly context menu. - Blockly.bindEventWithChecks_( - menuDom, 'contextmenu', null, Blockly.utils.noEvent); - // Enable autofocus after the initial render to avoid issue #1329. - menu.setAllowAutoFocus(true); -}; - -/** - * Hide the context menu. - */ -Blockly.ContextMenu.hide = function() { - Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu); - Blockly.ContextMenu.currentBlock = null; - if (Blockly.ContextMenu.eventWrapper_) { - Blockly.unbindEvent_(Blockly.ContextMenu.eventWrapper_); - } -}; - -/** - * Create a callback function that creates and configures a block, - * then places the new block next to the original. - * @param {!Blockly.Block} block Original block. - * @param {!Element} xml XML representation of new block. - * @return {!Function} Function that creates a block. - */ -Blockly.ContextMenu.callbackFactory = function(block, xml) { - return function() { - Blockly.Events.disable(); - try { - var newBlock = Blockly.Xml.domToBlock(xml, block.workspace); - // Move the new block next to the old block. - var xy = block.getRelativeToSurfaceXY(); - if (block.RTL) { - xy.x -= Blockly.SNAP_RADIUS; - } else { - xy.x += Blockly.SNAP_RADIUS; - } - xy.y += Blockly.SNAP_RADIUS * 2; - newBlock.moveBy(xy.x, xy.y); - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled() && !newBlock.isShadow()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); - } - newBlock.select(); - }; -}; - -// Helper functions for creating context menu options. - -/** - * Make a context menu option for deleting the current block. - * @param {!Blockly.BlockSvg} block The block where the right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.blockDeleteOption = function(block) { - // Option to delete this block but not blocks lower in the stack. - // Count the number of blocks that are nested in this block, - // ignoring shadows and without ordering. - var descendantCount = block.getDescendants(false, true).length; - var nextBlock = block.getNextBlock(); - if (nextBlock) { - // Blocks in the current stack would survive this block's deletion. - descendantCount -= nextBlock.getDescendants(false, true).length; - } - var deleteOption = { - text: descendantCount == 1 ? Blockly.Msg.DELETE_BLOCK : - Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(descendantCount)), - enabled: true, - callback: function() { - Blockly.Events.setGroup(true); - block.dispose(true, true); - Blockly.Events.setGroup(false); - } - }; - return deleteOption; -}; - -/** - * Make a context menu option for showing help for the current block. - * @param {!Blockly.BlockSvg} block The block where the right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.blockHelpOption = function(block) { - var url = goog.isFunction(block.helpUrl) ? block.helpUrl() : block.helpUrl; - var helpOption = { - enabled: !!url, - text: Blockly.Msg.HELP, - callback: function() { - block.showHelp_(); - } - }; - return helpOption; -}; - -/** - * Make a context menu option for duplicating the current block. - * @param {!Blockly.BlockSvg} block The block where the right-click originated. - * @param {!Event} event Event that caused the context menu to open. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.blockDuplicateOption = function(block, event) { - var duplicateOption = { - text: Blockly.Msg.DUPLICATE, - enabled: true, - callback: - Blockly.scratchBlocksUtils.duplicateAndDragCallback(block, event) - }; - return duplicateOption; -}; - -/** - * Make a context menu option for adding or removing comments on the current - * block. - * @param {!Blockly.BlockSvg} block The block where the right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.blockCommentOption = function(block) { - var commentOption = { - enabled: !goog.userAgent.IE - }; - // If there's already a comment, add an option to delete it. - if (block.comment) { - commentOption.text = Blockly.Msg.REMOVE_COMMENT; - commentOption.callback = function() { - block.setCommentText(null); - }; - } else { - // If there's no comment, add an option to create a comment. - commentOption.text = Blockly.Msg.ADD_COMMENT; - commentOption.callback = function() { - block.setCommentText(''); - block.comment.focus(); - }; - } - return commentOption; -}; - -/** - * Make a context menu option for undoing the most recent action on the - * workspace. - * @param {!Blockly.WorkspaceSvg} ws The workspace where the right-click - * originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.wsUndoOption = function(ws) { - return { - text: Blockly.Msg.UNDO, - enabled: ws.hasUndoStack(), - callback: ws.undo.bind(ws, false) - }; -}; - -/** - * Make a context menu option for redoing the most recent action on the - * workspace. - * @param {!Blockly.WorkspaceSvg} ws The workspace where the right-click - * originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.wsRedoOption = function(ws) { - return { - text: Blockly.Msg.REDO, - enabled: ws.hasRedoStack(), - callback: ws.undo.bind(ws, true) - }; -}; - -/** - * Make a context menu option for cleaning up blocks on the workspace, by - * aligning them vertically. - * @param {!Blockly.WorkspaceSvg} ws The workspace where the right-click - * originated. - * @param {number} numTopBlocks The number of top blocks on the workspace. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.wsCleanupOption = function(ws, numTopBlocks) { - return { - text: Blockly.Msg.CLEAN_UP, - enabled: numTopBlocks > 1, - callback: ws.cleanUp.bind(ws, true) - }; -}; - -/** - * Helper function for toggling delete state on blocks on the workspace, to be - * called from a right-click menu. - * @param {!Array.} topBlocks The list of top blocks on the - * the workspace. - * @param {boolean} shouldCollapse True if the blocks should be collapsed, false - * if they should be expanded. - * @private - */ -Blockly.ContextMenu.toggleCollapseFn_ = function(topBlocks, shouldCollapse) { - // Add a little animation to collapsing and expanding. - var DELAY = 10; - var ms = 0; - for (var i = 0; i < topBlocks.length; i++) { - var block = topBlocks[i]; - while (block) { - setTimeout(block.setCollapsed.bind(block, shouldCollapse), ms); - block = block.getNextBlock(); - ms += DELAY; - } - } -}; - -/** - * Make a context menu option for collapsing all block stacks on the workspace. - * @param {boolean} hasExpandedBlocks Whether there are any non-collapsed blocks - * on the workspace. - * @param {!Array.} topBlocks The list of top blocks on the - * the workspace. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.wsCollapseOption = function(hasExpandedBlocks, topBlocks) { - return { - enabled: hasExpandedBlocks, - text: Blockly.Msg.COLLAPSE_ALL, - callback: function() { - Blockly.ContextMenu.toggleCollapseFn_(topBlocks, true); - } - }; -}; - -/** - * Make a context menu option for expanding all block stacks on the workspace. - * @param {boolean} hasCollapsedBlocks Whether there are any collapsed blocks - * on the workspace. - * @param {!Array.} topBlocks The list of top blocks on the - * the workspace. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.wsExpandOption = function(hasCollapsedBlocks, topBlocks) { - return { - enabled: hasCollapsedBlocks, - text: Blockly.Msg.EXPAND_ALL, - callback: function() { - Blockly.ContextMenu.toggleCollapseFn_(topBlocks, false); - } - }; -}; - -/** - * Make a context menu option for deleting the current workspace comment. - * @param {!Blockly.WorkspaceCommentSvg} comment The workspace comment where the - * right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.commentDeleteOption = function(comment) { - var deleteOption = { - text: Blockly.Msg.DELETE, - enabled: true, - callback: function() { - Blockly.Events.setGroup(true); - comment.dispose(true, true); - Blockly.Events.setGroup(false); - } - }; - return deleteOption; -}; - -/** - * Make a context menu option for duplicating the current workspace comment. - * @param {!Blockly.WorkspaceCommentSvg} comment The workspace comment where the - * right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.commentDuplicateOption = function(comment) { - var duplicateOption = { - text: Blockly.Msg.DUPLICATE, - enabled: true, - callback: function() { - Blockly.duplicate_(comment); - } - }; - return duplicateOption; -}; - -/** - * Make a context menu option for adding a comment on the workspace. - * @param {!Blockly.WorkspaceSvg} ws The workspace where the right-click - * originated. - * @param {!Event} e The right-click mouse event. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.ContextMenu.workspaceCommentOption = function(ws, e) { - // Helper function to create and position a comment correctly based on the - // location of the mouse event. - var addWsComment = function() { - // Disable events while this comment is getting created - // so that we can fire a single create event for this comment - // at the end (instead of CommentCreate followed by CommentMove, - // which results in unexpected undo behavior). - var disabled = false; - if (Blockly.Events.isEnabled()) { - Blockly.Events.disable(); - disabled = true; - } - var comment = new Blockly.WorkspaceCommentSvg( - ws, '', Blockly.WorkspaceCommentSvg.DEFAULT_SIZE, - Blockly.WorkspaceCommentSvg.DEFAULT_SIZE, false); - - var injectionDiv = ws.getInjectionDiv(); - // Bounding rect coordinates are in client coordinates, meaning that they - // are in pixels relative to the upper left corner of the visible browser - // window. These coordinates change when you scroll the browser window. - var boundingRect = injectionDiv.getBoundingClientRect(); - - // The client coordinates offset by the injection div's upper left corner. - var clientOffsetPixels = new goog.math.Coordinate( - e.clientX - boundingRect.left, e.clientY - boundingRect.top); - - // The offset in pixels between the main workspace's origin and the upper - // left corner of the injection div. - var mainOffsetPixels = ws.getOriginOffsetInPixels(); - - // The position of the new comment in pixels relative to the origin of the - // main workspace. - var finalOffsetPixels = goog.math.Coordinate.difference(clientOffsetPixels, - mainOffsetPixels); - - // The position of the new comment in main workspace coordinates. - var finalOffsetMainWs = finalOffsetPixels.scale(1 / ws.scale); - - var commentX = finalOffsetMainWs.x; - var commentY = finalOffsetMainWs.y; - comment.moveBy(commentX, commentY); - if (ws.rendered) { - comment.initSvg(); - comment.render(false); - comment.select(); - } - if (disabled) { - Blockly.Events.enable(); - } - Blockly.WorkspaceComment.fireCreateEvent(comment); - }; - - var wsCommentOption = {enabled: true}; - wsCommentOption.text = Blockly.Msg.ADD_COMMENT; - wsCommentOption.callback = function() { - addWsComment(); - }; - return wsCommentOption; -}; - -// End helper functions for creating context menu options. diff --git a/packages/scratch-blocks/core/css.js b/packages/scratch-blocks/core/css.js deleted file mode 100644 index c12e6cde0..000000000 --- a/packages/scratch-blocks/core/css.js +++ /dev/null @@ -1,1350 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Inject Blockly's CSS synchronously. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.Css - * @namespace - */ -goog.provide('Blockly.Css'); - -goog.require('Blockly.Colours'); - -goog.require('goog.userAgent'); - -/** - * List of cursors. - * @enum {string} - */ -Blockly.Css.Cursor = { - OPEN: 'handopen', - CLOSED: 'handclosed', - DELETE: 'handdelete' -}; - -/** - * Current cursor (cached value). - * @type {string} - * @private - */ -Blockly.Css.currentCursor_ = ''; - -/** - * Large stylesheet added by Blockly.Css.inject. - * @type {Element} - * @private - */ -Blockly.Css.styleSheet_ = null; - -/** - * Path to media directory, with any trailing slash removed. - * @type {string} - * @private - */ -Blockly.Css.mediaPath_ = ''; - -/** - * Inject the CSS into the DOM. This is preferable over using a regular CSS - * file since: - * a) It loads synchronously and doesn't force a redraw later. - * b) It speeds up loading by not blocking on a separate HTTP transfer. - * c) The CSS content may be made dynamic depending on init options. - * @param {boolean} hasCss If false, don't inject CSS - * (providing CSS becomes the document's responsibility). - * @param {string} pathToMedia Path from page to the Blockly media directory. - */ -Blockly.Css.inject = function(hasCss, pathToMedia) { - // Only inject the CSS once. - if (Blockly.Css.styleSheet_) { - return; - } - // Placeholder for cursor rule. Must be first rule (index 0). - var text = '.blocklyDraggable {}\n'; - if (hasCss) { - text += Blockly.Css.CONTENT.join('\n'); - if (Blockly.FieldDate) { - text += Blockly.FieldDate.CSS.join('\n'); - } - } - // Strip off any trailing slash (either Unix or Windows). - Blockly.Css.mediaPath_ = pathToMedia.replace(/[\\\/]$/, ''); - text = text.replace(/<<>>/g, Blockly.Css.mediaPath_); - // Dynamically replace colours in the CSS text, in case they have - // been set at run-time injection. - for (var colourProperty in Blockly.Colours) { - if (Blockly.Colours.hasOwnProperty(colourProperty)) { - // Replace all - text = text.replace( - new RegExp('\\$colour\\_' + colourProperty, 'g'), - Blockly.Colours[colourProperty] - ); - } - } - - // Inject CSS tag at start of head. - var cssNode = document.createElement('style'); - document.head.insertBefore(cssNode, document.head.firstChild); - - var cssTextNode = document.createTextNode(text); - cssNode.appendChild(cssTextNode); - Blockly.Css.styleSheet_ = cssNode.sheet; -}; - -/** - * Set the cursor to be displayed when over something draggable. - * See See https://github.com/google/blockly/issues/981 for context. - * @param {Blockly.Css.Cursor} cursor Enum. - * @deprecated April 2017. - */ -Blockly.Css.setCursor = function(cursor) { - console.warn('Deprecated call to Blockly.Css.setCursor.' + - 'See https://github.com/google/blockly/issues/981 for context'); -}; - -/** - * Array making up the CSS content for Blockly. - */ -Blockly.Css.CONTENT = [ - '.blocklySvg {', - 'background-color: $colour_workspace;', - 'outline: none;', - 'overflow: hidden;', /* IE overflows by default. */ - 'position: absolute;', - 'display: block;', - '}', - - /* Necessary to position the drag surface */ - '.blocklyRelativeWrapper {', - 'position: relative;', - 'width: 100%;', - 'height: 100%;', - '}', - - '.blocklyWidgetDiv {', - 'display: none;', - 'position: absolute;', - 'z-index: 99999;', /* big value for bootstrap3 compatibility */ - '}', - - '.injectionDiv {', - 'height: 100%;', - 'position: relative;', - 'overflow: hidden;', /* So blocks in drag surface disappear at edges */ - 'touch-action: none', - '}', - - '.blocklyNonSelectable {', - 'user-select: none;', - '-moz-user-select: none;', - '-webkit-user-select: none;', - '-ms-user-select: none;', - '}', - - '.blocklyWidgetDiv.fieldTextInput {', - 'overflow: hidden;', - 'border: 1px solid;', - 'box-sizing: border-box;', - 'transform-origin: 0 0;', - '-ms-transform-origin: 0 0;', - '-moz-transform-origin: 0 0;', - '-webkit-transform-origin: 0 0;', - '}', - - '.blocklyWidgetDiv.fieldTextInput.removableTextInput {', - 'overflow: visible;', - '}', - - '.blocklyTextDropDownArrow {', - 'position: absolute;', - '}', - - '.blocklyTextRemoveIcon {', - 'position: absolute;', - 'width: 24px;', - 'height: 24px;', - 'top: -40px;', - 'left: 50%;', - 'margin-left: -12px;', - 'cursor: pointer;', - '}', - - '.blocklyNonSelectable {', - 'user-select: none;', - '-moz-user-select: none;', - '-webkit-user-select: none;', - '-ms-user-select: none;', - '}', - - '.blocklyWsDragSurface {', - 'display: none;', - 'position: absolute;', - 'top: 0;', - 'left: 0;', - '}', - /* Added as a separate rule with multiple classes to make it more specific - than a bootstrap rule that selects svg:root. See issue #1275 for context. - */ - '.blocklyWsDragSurface.blocklyOverflowVisible {', - 'overflow: visible;', - '}', - - '.blocklyBlockDragSurface {', - 'display: none;', - 'position: absolute;', - 'top: 0;', - 'left: 0;', - 'right: 0;', - 'bottom: 0;', - 'overflow: visible !important;', - 'z-index: 50;', /* Display above the toolbox */ - '}', - - '.blocklyTooltipDiv {', - 'background-color: #ffffc7;', - 'border: 1px solid #ddc;', - 'box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);', - 'color: #000;', - 'display: none;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 9pt;', - 'opacity: 0.9;', - 'padding: 2px;', - 'position: absolute;', - 'z-index: 100000;', /* big value for bootstrap3 compatibility */ - '}', - - '.blocklyDropDownDiv {', - 'position: fixed;', - 'left: 0;', - 'top: 0;', - 'z-index: 1000;', - 'display: none;', - 'border: 1px solid;', - 'border-radius: 4px;', - 'box-shadow: 0px 0px 8px 1px ' + Blockly.Colours.dropDownShadow + ';', - 'padding: 4px;', - '-webkit-user-select: none;', - 'min-height: 15px', - '}', - - '.blocklyDropDownContent {', - 'max-height: 300px;', // @todo: spec for maximum height. - 'overflow: auto;', - '}', - - '.blocklyDropDownArrow {', - 'position: absolute;', - 'left: 0;', - 'top: 0;', - 'width: 16px;', - 'height: 16px;', - 'z-index: -1;', - 'background-color: inherit;', - 'border-color: inherit;', - '}', - - '.blocklyDropDownButton {', - 'display: inline-block;', - 'float: left;', - 'padding: 0;', - 'margin: 4px;', - 'border-radius: 4px;', - 'outline: none;', - 'border: 1px solid;', - 'transition: box-shadow .1s;', - 'cursor: pointer;', - '}', - - '.blocklyDropDownButtonHover {', - 'box-shadow: 0px 0px 0px 4px ' + Blockly.Colours.fieldShadow + ';', - '}', - - '.blocklyDropDownButton:active {', - 'box-shadow: 0px 0px 0px 6px ' + Blockly.Colours.fieldShadow + ';', - '}', - - '.blocklyDropDownButton > img {', - 'width: 80%;', - 'height: 80%;', - 'margin-top: 5%', - '}', - - '.blocklyDropDownPlaceholder {', - 'display: inline-block;', - 'float: left;', - 'padding: 0;', - 'margin: 4px;', - '}', - - '.blocklyNumPadButton {', - 'display: inline-block;', - 'float: left;', - 'padding: 0;', - 'width: 48px;', - 'height: 48px;', - 'margin: 4px;', - 'border-radius: 4px;', - 'background: $colour_numPadBackground;', - 'color: $colour_numPadText;', - 'outline: none;', - 'border: 1px solid $colour_numPadBorder;', - 'cursor: pointer;', - 'font-weight: 600;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 12pt;', - '-webkit-tap-highlight-color: rgba(0,0,0,0);', - '}', - - '.blocklyNumPadButton > img {', - 'margin-top: 10%;', - 'width: 80%;', - 'height: 80%;', - '}', - - '.blocklyNumPadButton:active {', - 'background: $colour_numPadActiveBackground;', - '-webkit-tap-highlight-color: rgba(0,0,0,0);', - '}', - - '.arrowTop {', - 'border-top: 1px solid;', - 'border-left: 1px solid;', - 'border-top-left-radius: 4px;', - 'border-color: inherit;', - '}', - - '.arrowBottom {', - 'border-bottom: 1px solid;', - 'border-right: 1px solid;', - 'border-bottom-right-radius: 4px;', - 'border-color: inherit;', - '}', - - '.valueReportBox {', - 'min-width: 50px;', - 'max-width: 300px;', - 'max-height: 200px;', - 'overflow: auto;', - 'word-wrap: break-word;', - 'text-align: center;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: .8em;', - '}', - - '.blocklyResizeSE {', - 'cursor: se-resize;', - 'fill: #aaa;', - '}', - - '.blocklyResizeSW {', - 'cursor: sw-resize;', - 'fill: #aaa;', - '}', - - '.blocklyResizeLine {', - 'stroke: #888;', - 'stroke-width: 1;', - '}', - - '.blocklyHighlightedConnectionPath {', - 'fill: none;', - 'stroke: #fc3;', - 'stroke-width: 4px;', - '}', - - '.blocklyPath {', - 'stroke-width: 1px;', - '}', - - '.blocklySelected>.blocklyPath {', - // 'stroke: #fc3;', - // 'stroke-width: 3px;', - '}', - - '.blocklySelected>.blocklyPathLight {', - 'display: none;', - '}', - - '.blocklyDraggable {', - /* backup for browsers (e.g. IE11) that don't support grab */ - 'cursor: url("<<>>/handopen.cur"), auto;', - 'cursor: grab;', - 'cursor: -webkit-grab;', - 'cursor: -moz-grab;', - '}', - - '.blocklyDragging {', - /* backup for browsers (e.g. IE11) that don't support grabbing */ - 'cursor: url("<<>>/handclosed.cur"), auto;', - 'cursor: grabbing;', - 'cursor: -webkit-grabbing;', - 'cursor: -moz-grabbing;', - '}', - /* Changes cursor on mouse down. Not effective in Firefox because of - https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */ - '.blocklyDraggable:active {', - /* backup for browsers (e.g. IE11) that don't support grabbing */ - 'cursor: url("<<>>/handclosed.cur"), auto;', - 'cursor: grabbing;', - 'cursor: -webkit-grabbing;', - 'cursor: -moz-grabbing;', - '}', - /* Change the cursor on the whole drag surface in case the mouse gets - ahead of block during a drag. This way the cursor is still a closed hand. - */ - '.blocklyBlockDragSurface .blocklyDraggable {', - /* backup for browsers (e.g. IE11) that don't support grabbing */ - 'cursor: url("<<>>/handclosed.cur"), auto;', - 'cursor: grabbing;', - 'cursor: -webkit-grabbing;', - 'cursor: -moz-grabbing;', - '}', - - '.blocklyDragging.blocklyDraggingDelete {', - 'cursor: url("<<>>/handdelete.cur"), auto;', - '}', - - '.blocklyDragging.blocklyDraggingMouseThrough {', - 'pointer-events: none;', - '}', - - '.blocklyToolboxDelete {', - 'cursor: url("<<>>/handdelete.cur"), auto;', - '}', - - '.blocklyToolboxGrab {', - 'cursor: url("<<>>/handclosed.cur"), auto;', - 'cursor: grabbing;', - 'cursor: -webkit-grabbing;', - '}', - - '.blocklyDragging>.blocklyPath,', - '.blocklyDragging>.blocklyPathLight {', - 'fill-opacity: 1.0;', - 'stroke-opacity: 1.0;', - '}', - - '.blocklyDragging>.blocklyPath {', - '}', - - '.blocklyDisabled>.blocklyPath {', - 'fill-opacity: .5;', - 'stroke-opacity: .5;', - '}', - - '.blocklyInsertionMarker>.blocklyPath {', - 'stroke: none;', - '}', - - '.blocklyText {', - 'fill: #fff;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 12pt;', - 'font-weight: 500;', - '}', - - '.blocklyTextTruncated {', - 'font-size: 11pt;', - '}', - - '.blocklyNonEditableText>text {', - 'pointer-events: none;', - '}', - '.blocklyNonEditableText>text,', - '.blocklyEditableText>text {', - 'fill: $colour_text;', - '}', - - '.blocklyEditableText>.blocklyEditableLabel {', - 'fill: #fff;', - '}', - - '.blocklyDropdownText {', - 'fill: #fff !important;', - '}', - - '.blocklyBubbleText {', - 'fill: $colour_text;', - '}', - '.blocklyFlyout {', - 'position: absolute;', - 'z-index: 20;', - '}', - '.blocklyFlyoutButton {', - 'fill: none;', - 'pointer-events: all;', - '}', - - '.blocklyFlyoutButtonBackground {', - 'stroke: #c6c6c6;', - '}', - - '.blocklyFlyoutButton .blocklyText {', - 'fill: $colour_text;', - '}', - - '.blocklyFlyoutButtonShadow {', - 'fill: transparent;', - '}', - - '.blocklyFlyoutButton:hover {', - 'fill: white;', - 'cursor: pointer;', - '}', - - '.blocklyFlyoutLabel {', - 'cursor: default;', - '}', - - '.blocklyFlyoutLabelBackground {', - 'opacity: 0;', - '}', - - '.blocklyTouchTargetBackground {', - 'fill: transparent;', - 'cursor: pointer;', - '}', - - '.blocklyFlyoutLabelText {', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 14pt;', - 'fill: #575E75;', - 'font-weight: bold;', - '}', - - /* - Don't allow users to select text. It gets annoying when trying to - drag a block and selected text moves instead. - */ - '.blocklySvg text, .blocklyBlockDragSurface text, .blocklyFlyout text, .blocklyToolboxDiv text {', - 'user-select: none;', - '-moz-user-select: none;', - '-webkit-user-select: none;', - 'cursor: inherit;', - '}', - - '.blocklyHidden {', - 'display: none;', - '}', - - '.blocklyFieldDropdown:not(.blocklyHidden) {', - 'display: block;', - '}', - - '.blocklyIconGroup {', - 'cursor: default;', - '}', - - '.blocklyIconGroup:not(:hover),', - '.blocklyIconGroupReadonly {', - 'opacity: .6;', - '}', - - '.blocklyIconShape {', - 'fill: #00f;', - 'stroke: #fff;', - 'stroke-width: 1px;', - '}', - - '.blocklyIconSymbol {', - 'fill: #fff;', - '}', - - '.blocklyMinimalBody {', - 'margin: 0;', - 'padding: 0;', - '}', - - '.blocklyCommentForeignObject {', - 'position: relative;', - 'z-index: 0;', - '}', - - '.blocklyCommentRect {', - 'fill: #E7DE8E;', - 'stroke: #bcA903;', - 'stroke-width: 1px', - '}', - - '.blocklyCommentTarget {', - 'fill: transparent;', - 'stroke: #bcA903;', - '}', - - '.blocklyCommentTargetFocused {', - 'fill: none;', - '}', - - '.blocklyCommentHandleTarget {', - 'fill: none;', - '}', - - '.blocklyCommentHandleTargetFocused {', - 'fill: transparent;', - '}', - - '.blocklyFocused>.blocklyCommentRect {', - 'fill: #B9B272;', - 'stroke: #B9B272;', - '}', - - '.blocklySelected>.blocklyCommentTarget {', - 'stroke: #fc3;', - 'stroke-width: 3px;', - '}', - - - '.blocklyCommentTextarea {', - 'background-color: #fef49c;', - 'border: 0;', - 'outline: 0;', - 'margin: 0;', - 'padding: 3px;', - 'resize: none;', - 'display: block;', - 'overflow: hidden;', - '}', - - '.blocklyCommentDeleteIcon {', - 'cursor: pointer;', - 'fill: #000;', - 'display: none', - '}', - - '.blocklySelected > .blocklyCommentDeleteIcon {', - 'display: block', - '}', - - '.blocklyDeleteIconShape {', - 'fill: #000;', - 'stroke: #000;', - 'stroke-width: 1px;', - '}', - - '.blocklyDeleteIconShape.blocklyDeleteIconHighlighted {', - 'stroke: #fc3;', - '}', - - // Scratch Comments - - '.scratchCommentForeignObject {', - 'position: relative;', - '}', - - '.scratchCommentBody {', - 'background-color: #fef49c;', - 'border-radius: 4px;', - '}', - - '.scratchCommentRect {', - 'fill: #fef49c;', - '}', - - '.scratchCommentTarget {', - 'fill: transparent;', - '}', - - '.scratchWorkspaceCommentBorder {', - 'stroke: #bcA903;', - 'stroke-width: 1px;', - '}', - - '.scratchCommentTargetFocused {', - 'fill: none;', - '}', - - '.scratchCommentTopBar {', - 'fill: #000000;', - 'fill-opacity: 0.1', - '}', - - '.scratchCommentText {', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 12pt;', - 'font-weight: 400;', - '}', - - '.scratchCommentTextarea {', - 'background-color: #fef49c;', - 'border: 0;', - 'outline: 0;', - 'padding: 0;', - 'resize: none;', - 'overflow: hidden;', - '}', - - '.scratchCommentTextarea::placeholder {', - 'color: rgba(0,0,0,0.5);', - 'font-style: italic;', - '}', - - '.scratchCommentResizeSE {', - 'cursor: se-resize;', - 'fill: transparent;', - '}', - - '.scratchCommentResizeSW {', - 'cursor: sw-resize;', - 'fill: transparent;', - '}', - - '.blocklyHtmlInput {', - 'border: none;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 12pt;', - 'height: 100%;', - 'margin: 0;', - 'outline: none;', - 'box-sizing: border-box;', - 'width: 100%;', - 'text-align: center;', - 'color: $colour_text;', - 'font-weight: 500;', - '}', - - '.blocklyMainBackground {', - 'stroke-width: 1;', - 'stroke: #c6c6c6;', /* Equates to #ddd due to border being off-pixel. */ - '}', - - '.blocklyMutatorBackground {', - 'fill: #fff;', - 'stroke: #ddd;', - 'stroke-width: 1;', - '}', - - '.blocklyFlyoutBackground {', - 'fill: $colour_flyout;', - 'fill-opacity: .8;', - '}', - - '.blocklyMainWorkspaceScrollbar {', - 'z-index: 20;', - '}', - - '.blocklyFlyoutScrollbar {', - 'z-index: 30;', - '}', - - '.blocklyScrollbarHorizontal, .blocklyScrollbarVertical {', - 'position: absolute;', - 'outline: none;', - '}', - - '.blocklyScrollbarBackground {', - 'opacity: 0;', - '}', - - '.blocklyScrollbarHandle {', - 'fill: $colour_scrollbar;', - '}', - - '.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,', - '.blocklyScrollbarHandle:hover {', - 'fill: $colour_scrollbarHover;', - '}', - - '.blocklyZoom>image {', - 'opacity: 1;', - '}', - - /* Darken flyout scrollbars due to being on a grey background. */ - /* By contrast, workspace scrollbars are on a white background. */ - '.blocklyFlyout .blocklyScrollbarHandle {', - 'fill: #bbb;', - '}', - - '.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,', - '.blocklyFlyout .blocklyScrollbarHandle:hover {', - 'fill: #aaa;', - '}', - - '.blocklyInvalidInput {', - 'background: #faa;', - '}', - - '.blocklyAngleCircle {', - 'stroke: ' + Blockly.Colours.motion.tertiary + ';', - 'stroke-width: 1;', - 'fill: ' + Blockly.Colours.motion.secondary + ';', - '}', - - '.blocklyAngleCenterPoint {', - 'stroke: #fff;', - 'stroke-width: 1;', - 'fill: #fff;', - '}', - - '.blocklyAngleDragHandle {', - 'stroke: #fff;', - 'stroke-width: 5;', - 'stroke-opacity: 0.25;', - 'fill: #fff;', - 'cursor: pointer;', - '}', - - '.blocklyAngleDragArrow {', - 'pointer-events: none', - '}', - - '.blocklyAngleMarks {', - 'stroke: #fff;', - 'stroke-width: 1;', - 'stroke-opacity: 0.5;', - '}', - - '.blocklyAngleGauge {', - 'fill: #fff;', - 'fill-opacity: 0.20;', - '}', - - '.blocklyAngleLine {', - 'stroke: #fff;', - 'stroke-width: 1;', - 'stroke-linecap: round;', - 'pointer-events: none;', - '}', - - '.blocklyContextMenu {', - 'border-radius: 4px;', - 'max-height: 100%;', - '}', - - '.blocklyDropdownMenu {', - 'padding: 0 !important;', - '}', - - '.blocklyDropDownNumPad {', - 'background-color: $colour_numPadBackground;', - '}', - - /* Override the default Closure URL. */ - '.blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,', - '.blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon {', - 'background: url(<<>>/sprites.png) no-repeat -48px -16px !important;', - '}', - - /* Category tree in Toolbox. */ - '.blocklyToolboxDiv {', - 'background-color: $colour_toolbox;', - 'color: $colour_toolboxText;', - 'overflow-x: visible;', - 'overflow-y: auto;', - 'position: absolute;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'z-index: 40;', /* so blocks go over toolbox when dragging */ - '-webkit-tap-highlight-color: transparent;', /* issue #1345 */ - '}', - - '.blocklyTreeRoot {', - 'padding: 4px 0;', - '}', - - '.blocklyTreeRoot:focus {', - 'outline: none;', - '}', - - '.blocklyTreeRow {', - 'height: 22px;', - 'line-height: 22px;', - 'margin-bottom: 3px;', - 'padding-right: 8px;', - 'white-space: nowrap;', - '}', - - '.blocklyHorizontalTree {', - 'float: left;', - 'margin: 1px 5px 8px 0;', - '}', - - '.blocklyHorizontalTreeRtl {', - 'float: right;', - 'margin: 1px 0 8px 5px;', - '}', - - '.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {', - 'margin-left: 8px;', - '}', - - '.blocklyTreeRow:not(.blocklyTreeSelected):hover {', - 'background-color: #e4e4e4;', - '}', - - '.blocklyTreeSeparator {', - 'border-bottom: solid #e5e5e5 1px;', - 'height: 0;', - 'margin: 5px 0;', - '}', - - '.blocklyTreeSeparatorHorizontal {', - 'border-right: solid #e5e5e5 1px;', - 'width: 0;', - 'padding: 5px 0;', - 'margin: 0 5px;', - '}', - - '.blocklyTreeIcon {', - 'background-image: url(<<>>/sprites.png);', - 'height: 16px;', - 'vertical-align: middle;', - 'width: 16px;', - '}', - - '.blocklyTreeIconClosedLtr {', - 'background-position: -32px -1px;', - '}', - - '.blocklyTreeIconClosedRtl {', - 'background-position: 0px -1px;', - '}', - - '.blocklyTreeIconOpen {', - 'background-position: -16px -1px;', - '}', - - '.blocklyTreeSelected>.blocklyTreeIconClosedLtr {', - 'background-position: -32px -17px;', - '}', - - '.blocklyTreeSelected>.blocklyTreeIconClosedRtl {', - 'background-position: 0px -17px;', - '}', - - '.blocklyTreeSelected>.blocklyTreeIconOpen {', - 'background-position: -16px -17px;', - '}', - - '.blocklyTreeIconNone,', - '.blocklyTreeSelected>.blocklyTreeIconNone {', - 'background-position: -48px -1px;', - '}', - - '.blocklyTreeLabel {', - 'cursor: default;', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 16px;', - 'padding: 0 3px;', - 'vertical-align: middle;', - '}', - - '.blocklyToolboxDelete .blocklyTreeLabel {', - 'cursor: url("<<>>/handdelete.cur"), auto;', - '}', - - '.blocklyTreeSelected .blocklyTreeLabel {', - 'color: #fff;', - '}', - - '.blocklyDropDownDiv .goog-slider-horizontal {', - 'margin: 8px;', - 'height: 22px;', - 'width: 150px;', - 'position: relative;', - 'outline: none;', - 'border-radius: 11px;', - 'margin-bottom: 20px;', - '}', - - '.blocklyDropDownDiv .goog-slider-horizontal .goog-slider-thumb {', - 'width: 26px;', - 'height: 26px;', - 'top: -1px;', - 'position: absolute;', - 'background-color: white;', - 'border-radius: 100%;', - '-webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.15);', - '-moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.15);', - 'box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.15);', - '}', - - '.scratchEyedropper {', - 'background: none;', - 'outline: none;', - 'border: none;', - 'width: 100%;', - 'text-align: center;', - 'border-top: 1px solid #ddd;', - 'padding-top: 5px;', - 'cursor: pointer;', - '}', - - '.scratchColourPickerLabel {', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 0.65rem;', - 'color: $colour_toolboxText;', - 'margin: 8px;', - '}', - - '.scratchColourPickerLabelText {', - 'font-weight: bold;', - '}', - - '.scratchColourPickerReadout {', - 'margin-left: 10px;', - '}', - - '.scratchMatrixButtonDiv {', - 'width: 50%;', - 'text-align: center;', - 'float: left;', - '}', - - '.scratchNotePickerKeyLabel {', - 'font-family: "Helvetica Neue", Helvetica, sans-serif;', - 'font-size: 0.75rem;', - 'fill: $colour_text;', - 'pointer-events: none;', - '}', - - /* Copied from: goog/css/menu.css */ - /* - * Copyright 2009 The Closure Library Authors. All Rights Reserved. - * - * Use of this source code is governed by the Apache License, Version 2.0. - * See the COPYING file for details. - */ - - /** - * Standard styling for menus created by goog.ui.MenuRenderer. - * - * @author attila@google.com (Attila Bodis) - */ - - '.blocklyWidgetDiv .goog-menu {', - 'background: #fff;', - 'border-color: #ccc #666 #666 #ccc;', - 'border-style: solid;', - 'border-width: 1px;', - 'cursor: default;', - 'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', - 'margin: 0;', - 'outline: none;', - 'padding: 4px 0;', - 'position: absolute;', - 'overflow-y: auto;', - 'overflow-x: hidden;', - 'z-index: 20000;', /* Arbitrary, but some apps depend on it... */ - '}', - - '.blocklyDropDownDiv .goog-menu {', - 'cursor: default;', - 'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', - 'outline: none;', - 'z-index: 20000;', /* Arbitrary, but some apps depend on it... */ - '}', - - /* Copied from: goog/css/menuitem.css */ - /* - * Copyright 2009 The Closure Library Authors. All Rights Reserved. - * - * Use of this source code is governed by the Apache License, Version 2.0. - * See the COPYING file for details. - */ - - /** - * Standard styling for menus created by goog.ui.MenuItemRenderer. - * - * @author attila@google.com (Attila Bodis) - */ - - /** - * State: resting. - * - * NOTE(mleibman,chrishenry): - * The RTL support in Closure is provided via two mechanisms -- "rtl" CSS - * classes and BiDi flipping done by the CSS compiler. Closure supports RTL - * with or without the use of the CSS compiler. In order for them not - * to conflict with each other, the "rtl" CSS classes need to have the #noflip - * annotation. The non-rtl counterparts should ideally have them as well, but, - * since .goog-menuitem existed without .goog-menuitem-rtl for so long before - * being added, there is a risk of people having templates where they are not - * rendering the .goog-menuitem-rtl class when in RTL and instead rely solely - * on the BiDi flipping by the CSS compiler. That's why we're not adding the - * #noflip to .goog-menuitem. - */ - '.blocklyWidgetDiv .goog-menuitem {', - 'color: #000;', - 'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', - 'list-style: none;', - 'margin: 0;', - /* 28px on the left for icon or checkbox; 7em on the right for shortcut. */ - 'padding: 4px 7em 4px 28px;', - 'white-space: nowrap;', - '}', - - '.blocklyDropDownDiv .goog-menuitem {', - 'color: #fff;', - 'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', - 'font-weight: bold;', - 'list-style: none;', - 'margin: 0;', - 'min-height: 24px;', - /* 28px on the left for icon or checkbox; 7em on the right for shortcut. */ - 'padding: 4px 7em 4px 28px;', - 'white-space: nowrap;', - '}', - - /* BiDi override for the resting state. */ - /* #noflip */ - '.blocklyWidgetDiv .goog-menuitem.goog-menuitem-rtl, ', - '.blocklyDropDownDiv .goog-menuitem.goog-menuitem-rtl {', - /* Flip left/right padding for BiDi. */ - 'padding-left: 7em;', - 'padding-right: 28px;', - '}', - - /* If a menu doesn't have checkable items or items with icons, remove padding. */ - '.blocklyWidgetDiv .goog-menu-nocheckbox .goog-menuitem,', - '.blocklyWidgetDiv .goog-menu-noicon .goog-menuitem, ', - '.blocklyDropDownDiv .goog-menu-nocheckbox .goog-menuitem,', - '.blocklyDropDownDiv .goog-menu-noicon .goog-menuitem { ', - 'padding-left: 12px;', - '}', - - /* - * If a menu doesn't have items with shortcuts, leave just enough room for - * submenu arrows, if they are rendered. - */ - '.blocklyWidgetDiv .goog-menu-noaccel .goog-menuitem, ', - '.blocklyDropDownDiv .goog-menu-noaccel .goog-menuitem {', - 'padding-right: 20px;', - '}', - - '.blocklyWidgetDiv .goog-menuitem-content ', - '.blocklyDropDownDiv .goog-menuitem-content {', - 'color: #000;', - 'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', - '}', - - /* State: disabled. */ - '.blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-accel,', - '.blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content, ', - '.blocklyDropDownDiv .goog-menuitem-disabled .goog-menuitem-accel,', - '.blocklyDropDownDiv .goog-menuitem-disabled .goog-menuitem-content {', - 'color: #ccc !important;', - '}', - - '.blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-icon, ', - '.blocklyDropDownDiv .goog-menuitem-disabled .goog-menuitem-icon {', - 'opacity: 0.3;', - '-moz-opacity: 0.3;', - 'filter: alpha(opacity=30);', - '}', - - /* State: hover. */ - '.blocklyWidgetDiv .goog-menuitem-highlight,', - '.blocklyWidgetDiv .goog-menuitem-hover {', - 'background-color: #d6e9f8;', - /* Use an explicit top and bottom border so that the selection is visible', - * in high contrast mode. */ - 'border-color: #d6e9f8;', - 'border-style: dotted;', - 'border-width: 1px 0;', - 'padding-bottom: 3px;', - 'padding-top: 3px;', - '}', - - '.blocklyDropDownDiv .goog-menuitem-highlight,', - '.blocklyDropDownDiv .goog-menuitem-hover {', - 'background-color: rgba(0, 0, 0, 0.2);', - '}', - - /* State: selected/checked. */ - '.blocklyWidgetDiv .goog-menuitem-checkbox,', - '.blocklyWidgetDiv .goog-menuitem-icon, ', - '.blocklyDropDownDiv .goog-menuitem-checkbox,', - '.blocklyDropDownDiv .goog-menuitem-icon {', - 'background-repeat: no-repeat;', - 'height: 16px;', - 'left: 6px;', - 'position: absolute;', - 'right: auto;', - 'vertical-align: middle;', - 'width: 16px;', - '}', - - '.blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,', - '.blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon,', - '.blocklyDropDownDiv .goog-option-selected .goog-menuitem-checkbox,', - '.blocklyDropDownDiv .goog-option-selected .goog-menuitem-icon {', - /* Client apps may override the URL at which they serve the sprite. */ - 'background: url(<<>>/sprites.png) no-repeat -48px -16px !important;', - 'position: static;', /* Scroll with the menu. */ - 'float: left;', - 'margin-left: -24px;', - '}', - - /* BiDi override for the selected/checked state. */ - /* #noflip */ - '.blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,', - '.blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon,', - '.blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-checkbox,', - '.blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-icon {', - /* Flip left/right positioning. */ - 'float: right;', - 'margin-right: -24px;', - '}', - - /* Keyboard shortcut ("accelerator") style. */ - '.blocklyWidgetDiv .goog-menuitem-accel, ', - '.blocklyDropDownDiv .goog-menuitem-accel {', - 'color: #999;', - /* Keyboard shortcuts are untranslated; always left-to-right. */ - /* #noflip */ - 'direction: ltr;', - 'left: auto;', - 'padding: 0 6px;', - 'position: absolute;', - 'right: 0;', - 'text-align: right;', - '}', - - /* BiDi override for shortcut style. */ - /* #noflip */ - '.blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-accel, ', - '.blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-accel {', - /* Flip left/right positioning and text alignment. */ - 'left: 0;', - 'right: auto;', - 'text-align: left;', - '}', - - /* Mnemonic styles. */ - '.blocklyWidgetDiv .goog-menuitem-mnemonic-hint, ', - '.blocklyDropDownDiv .goog-menuitem-mnemonic-hint {', - 'text-decoration: underline;', - '}', - - '.blocklyWidgetDiv .goog-menuitem-mnemonic-separator, ', - '.blocklyDropDownDiv .goog-menuitem-mnemonic-separator {', - 'color: #999;', - 'font-size: 12px;', - 'padding-left: 4px;', - '}', - - /* Copied from: goog/css/menuseparator.css */ - /* - * Copyright 2009 The Closure Library Authors. All Rights Reserved. - * - * Use of this source code is governed by the Apache License, Version 2.0. - * See the COPYING file for details. - */ - - /** - * Standard styling for menus created by goog.ui.MenuSeparatorRenderer. - * - * @author attila@google.com (Attila Bodis) - */ - - '.blocklyWidgetDiv .goog-menuseparator, ', - '.blocklyDropDownDiv .goog-menuseparator {', - 'border-top: 1px solid #ccc;', - 'margin: 4px 0;', - 'padding: 0;', - '}', - - '.blocklyFlyoutCheckbox {', - 'fill: white;', - 'stroke: #c8c8c8;', - '}', - - '.checked > .blocklyFlyoutCheckbox {', - 'fill: ' + Blockly.Colours.motion.primary + ';', - 'stroke: ' + Blockly.Colours.motion.tertiary + ';', - '}', - - '.blocklyFlyoutCheckboxPath {', - 'fill: transparent;', - 'stroke: white;', - 'stroke-width: 3;', - 'stroke-linecap: round;', - 'stroke-linejoin: round;', - '}', - - '.scratchCategoryMenu {', - 'width: 60px;', - 'background: $colour_toolbox;', - 'color: $colour_toolboxText;', - 'font-size: .7rem;', - 'user-select: none;', - '-webkit-user-select: none;', - '-moz-user-select: none;', - '-ms-user-select: none;', - '}', - - '.scratchCategoryMenuHorizontal {', - 'width: 100%;', - 'height: 50px;', - 'background: $colour_toolbox;', - 'color: $colour_toolboxText;', - 'font-size: .7em;', - 'user-select: none;', - '-webkit-user-select: none;', - '-moz-user-select: none;', - '-ms-user-select: none;', - '}', - - '.scratchCategoryMenuHorizontal .scratchCategoryMenuRow {', - 'float: left;', - 'margin: 3px;', - '}', - - '.scratchCategoryMenuRow {', - '}', - - '.scratchCategoryMenuItem {', - 'padding: 0.375rem 0px;', - 'cursor: pointer;', - 'text-align: center;', - '}', - - '.scratchCategoryMenuHorizontal .scratchCategoryMenuItem {', - 'padding: 6px 5px;', - '}', - - '.scratchCategoryMenuItem.categorySelected {', - 'background: $colour_toolboxSelected;', - '}', - - '.scratchCategoryItemBubble {', - 'width: 1.25rem;', - 'height: 1.25rem;', - 'border: 1px solid;', - 'border-radius: 100%;', - 'margin: 0 auto 0.125rem;', - '}', - - '.scratchCategoryItemIcon {', - 'width: 1.25rem;', - 'height: 1.25rem;', - 'margin: 0 auto 0.125rem;', - 'background-size: 100%;', - '}', - - '.scratchCategoryMenuItem:hover {', - 'color: $colour_toolboxHover !important;', - '}', - '' -]; diff --git a/packages/scratch-blocks/core/data_category.js b/packages/scratch-blocks/core/data_category.js deleted file mode 100644 index aa1a0ebd1..000000000 --- a/packages/scratch-blocks/core/data_category.js +++ /dev/null @@ -1,490 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Data Flyout components including variable and list blocks. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -/** - * @name Blockly.DataCategory - * @namespace - **/ -goog.provide('Blockly.DataCategory'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.VariableModel'); -goog.require('Blockly.Variables'); -goog.require('Blockly.Workspace'); - -/** - * Construct the blocks required by the flyout for the variable category. - * @param {!Blockly.Workspace} workspace The workspace containing variables. - * @return {!Array.} Array of XML block elements. - */ -Blockly.DataCategory = function(workspace) { - var variableModelList = workspace.getVariablesOfType(''); - variableModelList.sort(Blockly.VariableModel.compareByName); - var xmlList = []; - - Blockly.DataCategory.addCreateButton(xmlList, workspace, 'VARIABLE'); - - for (var i = 0; i < variableModelList.length; i++) { - Blockly.DataCategory.addDataVariable(xmlList, variableModelList[i]); - } - - if (variableModelList.length > 0) { - xmlList[xmlList.length - 1].setAttribute('gap', 24); - var firstVariable = variableModelList[0]; - - Blockly.DataCategory.addSetVariableTo(xmlList, firstVariable); - Blockly.DataCategory.addChangeVariableBy(xmlList, firstVariable); - Blockly.DataCategory.addShowVariable(xmlList, firstVariable); - Blockly.DataCategory.addHideVariable(xmlList, firstVariable); - } - - // Now add list variables to the flyout - Blockly.DataCategory.addCreateButton(xmlList, workspace, 'LIST'); - variableModelList = workspace.getVariablesOfType(Blockly.LIST_VARIABLE_TYPE); - variableModelList.sort(Blockly.VariableModel.compareByName); - for (var i = 0; i < variableModelList.length; i++) { - Blockly.DataCategory.addDataList(xmlList, variableModelList[i]); - } - - if (variableModelList.length > 0) { - xmlList[xmlList.length - 1].setAttribute('gap', 24); - var firstVariable = variableModelList[0]; - - Blockly.DataCategory.addAddToList(xmlList, firstVariable); - Blockly.DataCategory.addSep(xmlList); - Blockly.DataCategory.addDeleteOfList(xmlList, firstVariable); - Blockly.DataCategory.addDeleteAllOfList(xmlList, firstVariable); - Blockly.DataCategory.addInsertAtList(xmlList, firstVariable); - Blockly.DataCategory.addReplaceItemOfList(xmlList, firstVariable); - Blockly.DataCategory.addSep(xmlList); - Blockly.DataCategory.addItemOfList(xmlList, firstVariable); - Blockly.DataCategory.addItemNumberOfList(xmlList, firstVariable); - Blockly.DataCategory.addLengthOfList(xmlList, firstVariable); - Blockly.DataCategory.addListContainsItem(xmlList, firstVariable); - Blockly.DataCategory.addSep(xmlList); - Blockly.DataCategory.addShowList(xmlList, firstVariable); - Blockly.DataCategory.addHideList(xmlList, firstVariable); - } - - return xmlList; -}; - -/** - * Construct and add a data_variable block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addDataVariable = function(xmlList, variable) { - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_variable', 'VARIABLE'); - // In the flyout, this ID must match variable ID for monitor syncing reasons - xmlList[xmlList.length - 1].setAttribute('id', variable.getId()); -}; - -/** - * Construct and add a data_setvariableto block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addSetVariableTo = function(xmlList, variable) { - // - // - // - // - // - // - // 0 - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_setvariableto', - 'VARIABLE', ['VALUE', 'text', 0]); -}; - -/** - * Construct and add a data_changevariableby block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addChangeVariableBy = function(xmlList, variable) { - // - // - // - // - // - // - // 1 - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_changevariableby', - 'VARIABLE', ['VALUE', 'math_number', 1]); -}; - -/** - * Construct and add a data_showVariable block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addShowVariable = function(xmlList, variable) { - // - // - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_showvariable', - 'VARIABLE'); -}; - -/** - * Construct and add a data_hideVariable block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addHideVariable = function(xmlList, variable) { - // - // - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_hidevariable', - 'VARIABLE'); -}; - -/** - * Construct and add a data_listcontents block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addDataList = function(xmlList, variable) { - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_listcontents', 'LIST'); - // In the flyout, this ID must match variable ID for monitor syncing reasons - xmlList[xmlList.length - 1].setAttribute('id', variable.getId()); -}; - -/** - * Construct and add a data_addtolist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addAddToList = function(xmlList, variable) { - // - // variablename - // - // - // thing - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_addtolist', 'LIST', - ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]); -}; - -/** - * Construct and add a data_deleteoflist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addDeleteOfList = function(xmlList, variable) { - // - // variablename - // - // - // 1 - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_deleteoflist', 'LIST', - ['INDEX', 'math_integer', 1]); -}; - -/** - * Construct and add a data_deleteoflist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addDeleteAllOfList = function(xmlList, variable) { - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_deletealloflist', - 'LIST'); -}; - -/** - * Construct and add a data_insertatlist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addInsertAtList = function(xmlList, variable) { - // - // variablename - // - // - // 1 - // - // - // - // - // thing - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_insertatlist', 'LIST', - ['INDEX', 'math_integer', 1], ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]); -}; - -/** - * Construct and add a data_replaceitemoflist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addReplaceItemOfList = function(xmlList, variable) { - // - // variablename - // - // - // 1 - // - // - // - // - // thing - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_replaceitemoflist', - 'LIST', ['INDEX', 'math_integer', 1], ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]); -}; - -/** - * Construct and add a data_itemoflist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addItemOfList = function(xmlList, variable) { - // - // variablename - // - // - // 1 - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_itemoflist', 'LIST', - ['INDEX', 'math_integer', 1]); -}; - -/** Construct and add a data_itemnumoflist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addItemNumberOfList = function(xmlList, variable) { - // - // - // - // thing - // - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_itemnumoflist', - 'LIST', ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]); -}; - -/** - * Construct and add a data_lengthoflist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addLengthOfList = function(xmlList, variable) { - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_lengthoflist', 'LIST'); -}; - -/** - * Construct and add a data_listcontainsitem block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addListContainsItem = function(xmlList, variable) { - // - // variablename - // - // - // thing - // - // - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_listcontainsitem', - 'LIST', ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]); -}; - -/** - * Construct and add a data_showlist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addShowList = function(xmlList, variable) { - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_showlist', 'LIST'); -}; - -/** - * Construct and add a data_hidelist block to xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - */ -Blockly.DataCategory.addHideList = function(xmlList, variable) { - // - // variablename - // - Blockly.DataCategory.addBlock(xmlList, variable, 'data_hidelist', 'LIST'); -}; - -/** - * Construct a create variable button and push it to the xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {Blockly.Workspace} workspace Workspace to register callback to. - * @param {string} type Type of variable this is for. For example, 'LIST' or - * 'VARIABLE'. - */ -Blockly.DataCategory.addCreateButton = function(xmlList, workspace, type) { - var button = goog.dom.createDom('button'); - // Set default msg, callbackKey, and callback values for type 'VARIABLE' - var msg = Blockly.Msg.NEW_VARIABLE; - var callbackKey = 'CREATE_VARIABLE'; - var callback = function(button) { - Blockly.Variables.createVariable(button.getTargetWorkspace(), null, '');}; - - if (type === 'LIST') { - msg = Blockly.Msg.NEW_LIST; - callbackKey = 'CREATE_LIST'; - callback = function(button) { - Blockly.Variables.createVariable(button.getTargetWorkspace(), null, - Blockly.LIST_VARIABLE_TYPE);}; - } - button.setAttribute('text', msg); - button.setAttribute('callbackKey', callbackKey); - workspace.registerButtonCallback(callbackKey, callback); - xmlList.push(button); -}; - -/** - * Construct a variable block with the given variable, blockType, and optional - * value tags. Add the variable block to the given xmlList. - * @param {!Array.} xmlList Array of XML block elements. - * @param {?Blockly.VariableModel} variable Variable to select in the field. - * @param {string} blockType Type of block. For example, 'data_hidelist' or - * data_showlist'. - * @param {string} fieldName Name of field in block. For example: 'VARIABLE' or - * 'LIST'. - * @param {?Array.} opt_value Optional array containing the value name - * and shadow type of value tags. - * @param {?Array.} opt_secondValue Optional array containing the value - * name and shadow type of a second pair of value tags. - */ -Blockly.DataCategory.addBlock = function(xmlList, variable, blockType, - fieldName, opt_value, opt_secondValue) { - if (Blockly.Blocks[blockType]) { - var firstValueField; - var secondValueField; - if (opt_value) { - firstValueField = Blockly.DataCategory.createValue(opt_value[0], - opt_value[1], opt_value[2]); - } - if (opt_secondValue) { - secondValueField = Blockly.DataCategory.createValue(opt_secondValue[0], - opt_secondValue[1], opt_secondValue[2]); - } - - var gap = 8; - var blockText = '' + - '' + - Blockly.Variables.generateVariableFieldXml_(variable, fieldName) + - firstValueField + secondValueField + - '' + - ''; - var block = Blockly.Xml.textToDom(blockText).firstChild; - xmlList.push(block); - } -}; - -/** - * Create the text representation of a value dom element with a shadow of the - * indicated type inside. - * @param {string} valueName Name of the value tags. - * @param {string} type The type of the shadow tags. - * @param {string|number} value The default shadow value. - * @return {string} The generated dom element in text. - */ -Blockly.DataCategory.createValue = function(valueName, type, value) { - var fieldName; - switch (valueName) { - case 'ITEM': - fieldName = 'TEXT'; - break; - case 'INDEX': - fieldName = 'NUM'; - break; - case 'VALUE': - if (type === 'math_number') { - fieldName = 'NUM'; - } else { - fieldName = 'TEXT'; - } - break; - } - var valueField = - '' + - '' + - '' + value + '' + - '' + - ''; - return valueField; -}; - -/** - * Construct a block separator. Add the separator to the given xmlList. - * @param {!Array.} xmlList Array of XML block elements. - */ -Blockly.DataCategory.addSep = function(xmlList) { - var gap = 36; - var sepText = '' + - '' + - ''; - var sep = Blockly.Xml.textToDom(sepText).firstChild; - xmlList.push(sep); -}; diff --git a/packages/scratch-blocks/core/dragged_connection_manager.js b/packages/scratch-blocks/core/dragged_connection_manager.js deleted file mode 100644 index 50d0a1590..000000000 --- a/packages/scratch-blocks/core/dragged_connection_manager.js +++ /dev/null @@ -1,250 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Class that controls updates to connections during drags. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.DraggedConnectionManager'); - -goog.require('Blockly.BlockAnimations'); -goog.require('Blockly.RenderedConnection'); - -goog.require('goog.math.Coordinate'); - - -/** - * Class that controls updates to connections during drags. It is primarily - * responsible for finding the closest eligible connection and highlighting or - * unhiglighting it as needed during a drag. - * @param {!Blockly.BlockSvg} block The top block in the stack being dragged. - * @constructor - */ -Blockly.DraggedConnectionManager = function(block) { - Blockly.selected = block; - - /** - * The top block in the stack being dragged. - * Does not change during a drag. - * @type {!Blockly.Block} - * @private - */ - this.topBlock_ = block; - - /** - * The workspace on which these connections are being dragged. - * Does not change during a drag. - * @type {!Blockly.WorkspaceSvg} - * @private - */ - this.workspace_ = block.workspace; - - /** - * The connections on the dragging blocks that are available to connect to - * other blocks. This includes all open connections on the top block, as well - * as the last connection on the block stack. - * Does not change during a drag. - * @type {!Array.} - * @private - */ - this.availableConnections_ = this.initAvailableConnections_(); - - /** - * The connection that this block would connect to if released immediately. - * Updated on every mouse move. - * @type {Blockly.RenderedConnection} - * @private - */ - this.closestConnection_ = null; - - /** - * The connection that would connect to this.closestConnection_ if this block - * were released immediately. - * Updated on every mouse move. - * @type {Blockly.RenderedConnection} - * @private - */ - this.localConnection_ = null; - - /** - * The distance between this.closestConnection_ and this.localConnection_, - * in workspace units. - * Updated on every mouse move. - * @type {number} - * @private - */ - this.radiusConnection_ = 0; - - /** - * Whether the block would be deleted if it were dropped immediately. - * Updated on every mouse move. - * @type {boolean} - * @private - */ - this.wouldDeleteBlock_ = false; -}; - -/** - * Sever all links from this object. - * @package - */ -Blockly.DraggedConnectionManager.prototype.dispose = function() { - this.topBlock_ = null; - this.workspace_ = null; - this.availableConnections_.length = 0; - this.closestConnection_ = null; - this.localConnection_ = null; -}; - -/** - * Return whether the block would be deleted if dropped immediately, based on - * information from the most recent move event. - * @return {boolean} true if the block would be deleted if dropped immediately. - * @package - */ -Blockly.DraggedConnectionManager.prototype.wouldDeleteBlock = function() { - return this.wouldDeleteBlock_; -}; - -/** - * Connect to the closest connection and render the results. - * This should be called at the end of a drag. - * @package - */ -Blockly.DraggedConnectionManager.prototype.applyConnections = function() { - if (this.closestConnection_) { - // Connect two blocks together. - this.localConnection_.connect(this.closestConnection_); - if (this.topBlock_.rendered) { - // Trigger a connection animation. - // Determine which connection is inferior (lower in the source stack). - var inferiorConnection = this.localConnection_.isSuperior() ? - this.closestConnection_ : this.localConnection_; - Blockly.BlockAnimations.connectionUiEffect( - inferiorConnection.getSourceBlock()); - // Bring the just-edited stack to the front. - var rootBlock = this.topBlock_.getRootBlock(); - rootBlock.bringToFront(); - } - this.removeHighlighting_(); - } -}; - -/** - * Update highlighted connections based on the most recent move location. - * @param {!goog.math.Coordinate} dxy Position relative to drag start, - * in workspace units. - * @param {?number} deleteArea One of {@link Blockly.DELETE_AREA_TRASH}, - * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. - * @param {?boolean} isOutside True if the drag is going outside the blocks workspace - * @package - */ -Blockly.DraggedConnectionManager.prototype.update = function(dxy, deleteArea, isOutside) { - var oldClosestConnection; - var closestConnectionChanged; - // If dragged outside, don't connect, since the connections aren't visible. - if (!isOutside) { - oldClosestConnection = this.closestConnection_; - closestConnectionChanged = this.updateClosest_(dxy); - if (closestConnectionChanged && oldClosestConnection) { - oldClosestConnection.unhighlight(); - } - } else if (this.closestConnection_) { - this.closestConnection_.unhighlight(); - this.closestConnection_ = null; - } - - // Prefer connecting over dropping into the trash can, but prefer dragging to - // the toolbox over connecting to other blocks. - var wouldConnect = !!this.closestConnection_ && - deleteArea != Blockly.DELETE_AREA_TOOLBOX; - var wouldDelete = !!deleteArea && !this.topBlock_.getParent() && - this.topBlock_.isDeletable(); - this.wouldDeleteBlock_ = wouldDelete && !wouldConnect; - - if (!this.wouldDeleteBlock_ && closestConnectionChanged && - this.closestConnection_) { - this.addHighlighting_(); - } -}; - -/** - * Remove highlighting from the currently highlighted connection, if it exists. - * @private - */ -Blockly.DraggedConnectionManager.prototype.removeHighlighting_ = function() { - if (this.closestConnection_) { - this.closestConnection_.unhighlight(); - } -}; - -/** - * Add highlighting to the closest connection, if it exists. - * @private - */ -Blockly.DraggedConnectionManager.prototype.addHighlighting_ = function() { - if (this.closestConnection_) { - this.closestConnection_.highlight(); - } -}; - -/** - * Populate the list of available connections on this block stack. This should - * only be called once, at the beginning of a drag. - * @return {!Array.} a list of available - * connections. - * @private - */ -Blockly.DraggedConnectionManager.prototype.initAvailableConnections_ = function() { - var available = this.topBlock_.getConnections_(false); - // Also check the last connection on this stack - var lastOnStack = this.topBlock_.lastConnectionInStack(); - if (lastOnStack && lastOnStack != this.topBlock_.nextConnection) { - available.push(lastOnStack); - } - return available; -}; - -/** - * Find the new closest connection, and update internal state in response. - * @param {!goog.math.Coordinate} dxy Position relative to the drag start, - * in workspace units. - * @return {boolean} Whether the closest connection has changed. - * @private - */ -Blockly.DraggedConnectionManager.prototype.updateClosest_ = function(dxy) { - var oldClosestConnection = this.closestConnection_; - - this.closestConnection_ = null; - this.localConnection_ = null; - this.radiusConnection_ = Blockly.SNAP_RADIUS; - for (var i = 0; i < this.availableConnections_.length; i++) { - var myConnection = this.availableConnections_[i]; - var neighbour = myConnection.closest(this.radiusConnection_, dxy); - if (neighbour.connection) { - this.closestConnection_ = neighbour.connection; - this.localConnection_ = myConnection; - this.radiusConnection_ = neighbour.radius; - } - } - return oldClosestConnection != this.closestConnection_; -}; diff --git a/packages/scratch-blocks/core/dropdowndiv.js b/packages/scratch-blocks/core/dropdowndiv.js deleted file mode 100644 index ea64b77ce..000000000 --- a/packages/scratch-blocks/core/dropdowndiv.js +++ /dev/null @@ -1,408 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview A div that floats on top of the workspace, for drop-down menus. - * The drop-down can be kept inside the workspace, animate in/out, etc. - * @author tmickel@mit.edu (Tim Mickel) - */ - -'use strict'; - -goog.provide('Blockly.DropDownDiv'); - -goog.require('goog.dom'); -goog.require('goog.style'); - -/** - * Class for drop-down div. - * @constructor - */ -Blockly.DropDownDiv = function() { -}; - -/** - * The div element. Set once by Blockly.DropDownDiv.createDom. - * @type {Element} - * @private - */ -Blockly.DropDownDiv.DIV_ = null; - -/** - * Drop-downs will appear within the bounds of this element if possible. - * Set in Blockly.DropDownDiv.setBoundsElement. - * @type {Element} - * @private - */ -Blockly.DropDownDiv.boundsElement_ = null; - -/** - * The object currently using the drop-down. - * @type {Object} - * @private - */ -Blockly.DropDownDiv.owner_ = null; - -/** - * Arrow size in px. Should match the value in CSS (need to position pre-render). - * @type {number} - * @const - */ -Blockly.DropDownDiv.ARROW_SIZE = 16; - -/** - * Drop-down border size in px. Should match the value in CSS (need to position the arrow). - * @type {number} - * @const - */ -Blockly.DropDownDiv.BORDER_SIZE = 1; - -/** - * Amount the arrow must be kept away from the edges of the main drop-down div, in px. - * @type {number} - * @const - */ -Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING = 12; - -/** - * Amount drop-downs should be padded away from the source, in px. - * @type {number} - * @const - */ -Blockly.DropDownDiv.PADDING_Y = 20; - -/** - * Length of animations in seconds. - * @type {number} - * @const - */ -Blockly.DropDownDiv.ANIMATION_TIME = 0.25; - -/** - * Timer for animation out, to be cleared if we need to immediately hide - * without disrupting new shows. - * @type {number} - */ -Blockly.DropDownDiv.animateOutTimer_ = null; - -/** - * Callback for when the drop-down is hidden. - * @type {Function} - */ -Blockly.DropDownDiv.onHide_ = 0; - -/** - * Create and insert the DOM element for this div. - * @param {Element} container Element that the div should be contained in. - */ -Blockly.DropDownDiv.createDom = function() { - if (Blockly.DropDownDiv.DIV_) { - return; // Already created. - } - Blockly.DropDownDiv.DIV_ = goog.dom.createDom('div', 'blocklyDropDownDiv'); - document.body.appendChild(Blockly.DropDownDiv.DIV_); - Blockly.DropDownDiv.content_ = goog.dom.createDom('div', 'blocklyDropDownContent'); - Blockly.DropDownDiv.DIV_.appendChild(Blockly.DropDownDiv.content_); - Blockly.DropDownDiv.arrow_ = goog.dom.createDom('div', 'blocklyDropDownArrow'); - Blockly.DropDownDiv.DIV_.appendChild(Blockly.DropDownDiv.arrow_); - - // Transition animation for transform: translate() and opacity. - Blockly.DropDownDiv.DIV_.style.transition = 'transform ' + - Blockly.DropDownDiv.ANIMATION_TIME + 's, ' + - 'opacity ' + Blockly.DropDownDiv.ANIMATION_TIME + 's'; -}; - -/** - * Set an element to maintain bounds within. Drop-downs will appear - * within the box of this element if possible. - * @param {Element} boundsElement Element to bound drop-down to. - */ -Blockly.DropDownDiv.setBoundsElement = function(boundsElement) { - Blockly.DropDownDiv.boundsElement_ = boundsElement; -}; - -/** - * Provide the div for inserting content into the drop-down. - * @return {Element} Div to populate with content - */ -Blockly.DropDownDiv.getContentDiv = function() { - return Blockly.DropDownDiv.content_; -}; - -/** - * Clear the content of the drop-down. - */ -Blockly.DropDownDiv.clearContent = function() { - Blockly.DropDownDiv.content_.innerHTML = ''; - Blockly.DropDownDiv.content_.style.width = ''; -}; - -/** - * Set the colour for the drop-down. - * @param {string} backgroundColour Any CSS color for the background - * @param {string} borderColour Any CSS color for the border - */ -Blockly.DropDownDiv.setColour = function(backgroundColour, borderColour) { - Blockly.DropDownDiv.DIV_.style.backgroundColor = backgroundColour; - Blockly.DropDownDiv.DIV_.style.borderColor = borderColour; -}; - -/** - * Set the category for the drop-down. - * @param {string} category The new category for the drop-down. - */ -Blockly.DropDownDiv.setCategory = function(category) { - Blockly.DropDownDiv.DIV_.setAttribute('data-category', category); -}; - -/** - * Shortcut to show and place the drop-down with positioning determined - * by a particular block. The primary position will be below the block, - * and the secondary position above the block. Drop-down will be - * constrained to the block's workspace. - * @param {Object} owner The object showing the drop-down - * @param {!Blockly.Block} block Block to position the drop-down around. - * @param {Function=} opt_onHide Optional callback for when the drop-down is hidden. - * @param {Number} opt_secondaryYOffset Optional Y offset for above-block positioning. - * @return {boolean} True if the menu rendered below block; false if above. - */ -Blockly.DropDownDiv.showPositionedByBlock = function(owner, block, - opt_onHide, opt_secondaryYOffset) { - var scale = block.workspace.scale; - var bBox = {width: block.width, height: block.height}; - bBox.width *= scale; - bBox.height *= scale; - var position = block.getSvgRoot().getBoundingClientRect(); - // If we can fit it, render below the block. - var primaryX = position.left + bBox.width / 2; - var primaryY = position.top + bBox.height; - // If we can't fit it, render above the entire parent block. - var secondaryX = primaryX; - var secondaryY = position.top; - if (opt_secondaryYOffset) { - secondaryY += opt_secondaryYOffset; - } - // Set bounds to workspace; show the drop-down. - Blockly.DropDownDiv.setBoundsElement(block.workspace.getParentSvg().parentNode); - return Blockly.DropDownDiv.show(this, primaryX, primaryY, secondaryX, secondaryY, opt_onHide); -}; - -/** - * Show and place the drop-down. - * The drop-down is placed with an absolute "origin point" (x, y) - i.e., - * the arrow will point at this origin and box will positioned below or above it. - * If we can maintain the container bounds at the primary point, the arrow will - * point there, and the container will be positioned below it. - * If we can't maintain the container bounds at the primary point, fall-back to the - * secondary point and position above. - * @param {Object} owner The object showing the drop-down - * @param {number} primaryX Desired origin point x, in absolute px - * @param {number} primaryY Desired origin point y, in absolute px - * @param {number} secondaryX Secondary/alternative origin point x, in absolute px - * @param {number} secondaryY Secondary/alternative origin point y, in absolute px - * @param {Function=} opt_onHide Optional callback for when the drop-down is hidden - * @return {boolean} True if the menu rendered at the primary origin point. - */ -Blockly.DropDownDiv.show = function(owner, primaryX, primaryY, secondaryX, secondaryY, opt_onHide) { - Blockly.DropDownDiv.owner_ = owner; - Blockly.DropDownDiv.onHide_ = opt_onHide; - var div = Blockly.DropDownDiv.DIV_; - var metrics = Blockly.DropDownDiv.getPositionMetrics(primaryX, primaryY, secondaryX, secondaryY); - // Update arrow CSS - Blockly.DropDownDiv.arrow_.style.transform = 'translate(' + - metrics.arrowX + 'px,' + metrics.arrowY + 'px) rotate(45deg)'; - Blockly.DropDownDiv.arrow_.setAttribute('class', - metrics.arrowAtTop ? 'blocklyDropDownArrow arrowTop' : 'blocklyDropDownArrow arrowBottom'); - // Set direction based on owner's rtl - div.style.direction = owner.sourceBlock_ && owner.sourceBlock_.RTL ? 'rtl' : 'ltr'; - - // When we change `translate` multiple times in close succession, - // Chrome may choose to wait and apply them all at once. - // Since we want the translation to initial X, Y to be immediate, - // and the translation to final X, Y to be animated, - // we saw problems where both would be applied after animation was turned on, - // making the dropdown appear to fly in from (0, 0). - // Using both `left`, `top` for the initial translation and then `translate` - // for the animated transition to final X, Y is a workaround. - - // First apply initial translation. - div.style.left = metrics.initialX + 'px'; - div.style.top = metrics.initialY + 'px'; - // Show the div. - div.style.display = 'block'; - div.style.opacity = 1; - // Add final translate, animated through `transition`. - // Coordinates are relative to (initialX, initialY), - // where the drop-down is absolutely positioned. - var dx = (metrics.finalX - metrics.initialX); - var dy = (metrics.finalY - metrics.initialY); - div.style.transform = 'translate(' + dx + 'px,' + dy + 'px)'; - return metrics.arrowAtTop; -}; - -/** - * Helper to position the drop-down and the arrow, maintaining bounds. - * See explanation of origin points in Blockly.DropDownDiv.show. - * @param {number} primaryX Desired origin point x, in absolute px - * @param {number} primaryY Desired origin point y, in absolute px - * @param {number} secondaryX Secondary/alternative origin point x, in absolute px - * @param {number} secondaryY Secondary/alternative origin point y, in absolute px - * @returns {Object} Various final metrics, including rendered positions for drop-down and arrow. - */ -Blockly.DropDownDiv.getPositionMetrics = function(primaryX, primaryY, secondaryX, secondaryY) { - var div = Blockly.DropDownDiv.DIV_; - var boundPosition = Blockly.DropDownDiv.boundsElement_.getBoundingClientRect(); - - var boundSize = goog.style.getSize(Blockly.DropDownDiv.boundsElement_); - var divSize = goog.style.getSize(div); - - // First decide if we will render at primary or secondary position - // i.e., above or below - // renderX, renderY will eventually be the final rendered position of the box. - var renderX, renderY, renderedSecondary; - // Can the div fit inside the bounds if we render below the primary point? - if (primaryY + divSize.height > boundPosition.top + boundSize.height) { - // We can't fit below in terms of y. Can we fit above? - if (secondaryY - divSize.height < boundPosition.top) { - // We also can't fit above, so just render below anyway. - renderX = primaryX; - renderY = primaryY + Blockly.DropDownDiv.PADDING_Y; - renderedSecondary = false; - } else { - // We can fit above, render secondary - renderX = secondaryX; - renderY = secondaryY - divSize.height - Blockly.DropDownDiv.PADDING_Y; - renderedSecondary = true; - } - } else { - // We can fit below, render primary - renderX = primaryX; - renderY = primaryY + Blockly.DropDownDiv.PADDING_Y; - renderedSecondary = false; - } - // First calculate the absolute arrow X - // This needs to be done before positioning the div, since the arrow - // wants to be as close to the origin point as possible. - var arrowX = renderX - Blockly.DropDownDiv.ARROW_SIZE / 2; - // Keep in overall bounds - arrowX = Math.max(boundPosition.left, Math.min(arrowX, boundPosition.left + boundSize.width)); - - // Adjust the x-position of the drop-down so that the div is centered and within bounds. - var centerX = divSize.width / 2; - renderX -= centerX; - // Fit horizontally in the bounds. - renderX = Math.max( - boundPosition.left, - Math.min(renderX, boundPosition.left + boundSize.width - divSize.width) - ); - // After we've finished caclulating renderX, adjust the arrow to be relative to it. - arrowX -= renderX; - - // Pad the arrow by some pixels, primarily so that it doesn't render on top of a rounded border. - arrowX = Math.max( - Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING, - Math.min(arrowX, divSize.width - Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING - Blockly.DropDownDiv.ARROW_SIZE) - ); - - // Calculate arrow Y. If we rendered secondary, add on bottom. - // Extra pixels are added so that it covers the border of the div. - var arrowY = (renderedSecondary) ? divSize.height - Blockly.DropDownDiv.BORDER_SIZE : 0; - arrowY -= (Blockly.DropDownDiv.ARROW_SIZE / 2) + Blockly.DropDownDiv.BORDER_SIZE; - - // Initial position calculated without any padding to provide an animation point. - var initialX = renderX; // X position remains constant during animation. - var initialY; - if (renderedSecondary) { - initialY = secondaryY - divSize.height; // No padding on Y - } else { - initialY = primaryY; // No padding on Y - } - - return { - initialX: initialX, - initialY : initialY, - finalX: renderX, - finalY: renderY, - arrowX: arrowX, - arrowY: arrowY, - arrowAtTop: !renderedSecondary - }; -}; - -/** - * Is the container visible? - * @return {boolean} True if visible. - */ -Blockly.DropDownDiv.isVisible = function() { - return !!Blockly.DropDownDiv.owner_; -}; - -/** - * Hide the menu only if it is owned by the provided object. - * @param {Object} owner Object which must be owning the drop-down to hide - * @return {Boolean} True if hidden - */ -Blockly.DropDownDiv.hideIfOwner = function(owner) { - if (Blockly.DropDownDiv.owner_ === owner) { - Blockly.DropDownDiv.hide(); - return true; - } - return false; -}; - -/** - * Hide the menu, triggering animation. - */ -Blockly.DropDownDiv.hide = function() { - // Start the animation by setting the translation and fading out. - var div = Blockly.DropDownDiv.DIV_; - // Reset to (initialX, initialY) - i.e., no translation. - div.style.transform = 'translate(0px, 0px)'; - div.style.opacity = 0; - Blockly.DropDownDiv.animateOutTimer_ = setTimeout(function() { - // Finish animation - reset all values to default. - Blockly.DropDownDiv.hideWithoutAnimation(); - }, Blockly.DropDownDiv.ANIMATION_TIME * 1000); - if (Blockly.DropDownDiv.onHide_) { - Blockly.DropDownDiv.onHide_(); - Blockly.DropDownDiv.onHide_ = null; - } -}; - -/** - * Hide the menu, without animation. - */ -Blockly.DropDownDiv.hideWithoutAnimation = function() { - if (!Blockly.DropDownDiv.isVisible()) { - return; - } - var div = Blockly.DropDownDiv.DIV_; - Blockly.DropDownDiv.animateOutTimer_ && window.clearTimeout(Blockly.DropDownDiv.animateOutTimer_); - div.style.transform = ''; - div.style.top = ''; - div.style.left = ''; - div.style.display = 'none'; - Blockly.DropDownDiv.clearContent(); - Blockly.DropDownDiv.owner_ = null; - if (Blockly.DropDownDiv.onHide_) { - Blockly.DropDownDiv.onHide_(); - Blockly.DropDownDiv.onHide_ = null; - } -}; diff --git a/packages/scratch-blocks/core/events.js b/packages/scratch-blocks/core/events.js deleted file mode 100644 index 9598fa7c7..000000000 --- a/packages/scratch-blocks/core/events.js +++ /dev/null @@ -1,422 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Events fired as a result of actions in Blockly's editor. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * Events fired as a result of actions in Blockly's editor. - * @namespace Blockly.Events - */ -goog.provide('Blockly.Events'); - -goog.require('goog.array'); -goog.require('goog.math.Coordinate'); - - -/** - * Group ID for new events. Grouped events are indivisible. - * @type {string} - * @private - */ -Blockly.Events.group_ = ''; - -/** - * Sets whether events should be added to the undo stack. - * @type {boolean} - */ -Blockly.Events.recordUndo = true; - -/** - * Allow change events to be created and fired. - * @type {number} - * @private - */ -Blockly.Events.disabled_ = 0; - -/** - * Name of event that creates a block. Will be deprecated for BLOCK_CREATE. - * @const - */ -Blockly.Events.CREATE = 'create'; - -/** - * Name of event that creates a block. - * @const - */ -Blockly.Events.BLOCK_CREATE = Blockly.Events.CREATE; - -/** - * Name of event that deletes a block. Will be deprecated for BLOCK_DELETE. - * @const - */ -Blockly.Events.DELETE = 'delete'; - -/** - * Name of event that deletes a block. - * @const - */ -Blockly.Events.BLOCK_DELETE = Blockly.Events.DELETE; - -/** - * Name of event that changes a block. Will be deprecated for BLOCK_CHANGE. - * @const - */ -Blockly.Events.CHANGE = 'change'; - -/** - * Name of event that changes a block. - * @const - */ -Blockly.Events.BLOCK_CHANGE = Blockly.Events.CHANGE; - -/** - * Name of event that moves a block. Will be deprecated for BLOCK_MOVE. - * @const - */ -Blockly.Events.MOVE = 'move'; - -/** - * Name of event that drags a block outside of or into the blocks workspace - * @const - */ -Blockly.Events.DRAG_OUTSIDE = 'dragOutside'; - -/** - * Name of event that ends a block drag - * @const - */ -Blockly.Events.END_DRAG = 'endDrag'; - -/** - * Name of event that moves a block. - * @const - */ -Blockly.Events.BLOCK_MOVE = Blockly.Events.MOVE; - -/** - * Name of event that creates a variable. - * @const - */ -Blockly.Events.VAR_CREATE = 'var_create'; - -/** - * Name of event that deletes a variable. - * @const - */ -Blockly.Events.VAR_DELETE = 'var_delete'; - -/** - * Name of event that renames a variable. - * @const - */ -Blockly.Events.VAR_RENAME = 'var_rename'; - -/** - * Name of event that creates a comment. - * @const - */ -Blockly.Events.COMMENT_CREATE = 'comment_create'; - -/** - * Name of event that moves a comment. - * @const - */ -Blockly.Events.COMMENT_MOVE = 'comment_move'; - -/** - * Name of event that changes a comment's property - * (text content, size, or minimized state). - * @const - */ -Blockly.Events.COMMENT_CHANGE = 'comment_change'; - -/** - * Name of event that deletes a comment. - * @const - */ -Blockly.Events.COMMENT_DELETE = 'comment_delete'; - -/** - * Name of event that records a UI change. - * @const - */ -Blockly.Events.UI = 'ui'; - -/** - * List of events queued for firing. - * @private - */ -Blockly.Events.FIRE_QUEUE_ = []; - -/** - * Create a custom event and fire it. - * @param {!Blockly.Events.Abstract} event Custom data for event. - */ -Blockly.Events.fire = function(event) { - if (!Blockly.Events.isEnabled()) { - return; - } - if (!Blockly.Events.FIRE_QUEUE_.length) { - // First event added; schedule a firing of the event queue. - setTimeout(Blockly.Events.fireNow_, 0); - } - Blockly.Events.FIRE_QUEUE_.push(event); -}; - -/** - * Fire all queued events. - * @private - */ -Blockly.Events.fireNow_ = function() { - var queue = Blockly.Events.filter(Blockly.Events.FIRE_QUEUE_, true); - Blockly.Events.FIRE_QUEUE_.length = 0; - for (var i = 0, event; event = queue[i]; i++) { - var workspace = Blockly.Workspace.getById(event.workspaceId); - if (workspace) { - workspace.fireChangeListener(event); - } - } -}; - -/** - * Filter the queued events and merge duplicates. - * @param {!Array.} queueIn Array of events. - * @param {boolean} forward True if forward (redo), false if backward (undo). - * @return {!Array.} Array of filtered events. - */ -Blockly.Events.filter = function(queueIn, forward) { - var queue = goog.array.clone(queueIn); - if (!forward) { - // Undo is merged in reverse order. - queue.reverse(); - } - var mergedQueue = []; - var hash = Object.create(null); - // Merge duplicates. - for (var i = 0, event; event = queue[i]; i++) { - if (!event.isNull()) { - var key = [event.type, event.blockId, event.workspaceId].join(' '); - var lastEvent = hash[key]; - if (!lastEvent) { - hash[key] = event; - mergedQueue.push(event); - } else if (event.type == Blockly.Events.MOVE) { - // Merge move events. - lastEvent.newParentId = event.newParentId; - lastEvent.newInputName = event.newInputName; - lastEvent.newCoordinate = event.newCoordinate; - } else if (event.type == Blockly.Events.CHANGE && - event.element == lastEvent.element && - event.name == lastEvent.name) { - // Merge change events. - lastEvent.newValue = event.newValue; - } else if (event.type == Blockly.Events.UI && - event.element == 'click' && - (lastEvent.element == 'commentOpen' || - lastEvent.element == 'mutatorOpen' || - lastEvent.element == 'warningOpen')) { - // Merge click events. - lastEvent.newValue = event.newValue; - } else { - // Collision: newer events should merge into this event to maintain order - hash[key] = event; - mergedQueue.push(event); - } - } - } - // Filter out any events that have become null due to merging. - queue = mergedQueue.filter(function(e) { return !e.isNull(); }); - if (!forward) { - // Restore undo order. - queue.reverse(); - } - // Move mutation events to the top of the queue. - // Intentionally skip first event. - for (var i = 1, event; event = queue[i]; i++) { - if (event.type == Blockly.Events.CHANGE && - event.element == 'mutation') { - queue.unshift(queue.splice(i, 1)[0]); - } - } - return queue; -}; - -/** - * Modify pending undo events so that when they are fired they don't land - * in the undo stack. Called by Blockly.Workspace.clearUndo. - */ -Blockly.Events.clearPendingUndo = function() { - for (var i = 0, event; event = Blockly.Events.FIRE_QUEUE_[i]; i++) { - event.recordUndo = false; - } -}; - -/** - * Stop sending events. Every call to this function MUST also call enable. - */ -Blockly.Events.disable = function() { - Blockly.Events.disabled_++; -}; - -/** - * Start sending events. Unless events were already disabled when the - * corresponding call to disable was made. - */ -Blockly.Events.enable = function() { - Blockly.Events.disabled_--; -}; - -/** - * Returns whether events may be fired or not. - * @return {boolean} True if enabled. - */ -Blockly.Events.isEnabled = function() { - return Blockly.Events.disabled_ == 0; -}; - -/** - * Current group. - * @return {string} ID string. - */ -Blockly.Events.getGroup = function() { - return Blockly.Events.group_; -}; - -/** - * Start or stop a group. - * @param {boolean|string} state True to start new group, false to end group. - * String to set group explicitly. - */ -Blockly.Events.setGroup = function(state) { - if (typeof state == 'boolean') { - Blockly.Events.group_ = state ? Blockly.utils.genUid() : ''; - } else { - Blockly.Events.group_ = state; - } -}; - -/** - * Compute a list of the IDs of the specified block and all its descendants. - * @param {!Blockly.Block} block The root block. - * @return {!Array.} List of block IDs. - * @private - */ -Blockly.Events.getDescendantIds_ = function(block) { - var ids = []; - var descendants = block.getDescendants(false); - for (var i = 0, descendant; descendant = descendants[i]; i++) { - ids[i] = descendant.id; - } - return ids; -}; - -/** - * Decode the JSON into an event. - * @param {!Object} json JSON representation. - * @param {!Blockly.Workspace} workspace Target workspace for event. - * @return {!Blockly.Events.Abstract} The event represented by the JSON. - */ -Blockly.Events.fromJson = function(json, workspace) { - var event; - switch (json.type) { - case Blockly.Events.CREATE: - event = new Blockly.Events.Create(null); - break; - case Blockly.Events.DELETE: - event = new Blockly.Events.Delete(null); - break; - case Blockly.Events.CHANGE: - event = new Blockly.Events.Change(null); - break; - case Blockly.Events.MOVE: - event = new Blockly.Events.Move(null); - break; - case Blockly.Events.VAR_CREATE: - event = new Blockly.Events.VarCreate(null); - break; - case Blockly.Events.VAR_DELETE: - event = new Blockly.Events.VarDelete(null); - break; - case Blockly.Events.VAR_RENAME: - event = new Blockly.Events.VarRename(null); - break; - case Blockly.Events.COMMENT_CREATE: - event = new Blockly.Events.CommentCreate(null); - break; - case Blockly.Events.COMMENT_CHANGE: - event = new Blockly.Events.CommentChange(null); - break; - case Blockly.Events.COMMENT_MOVE: - event = new Blockly.Events.CommentMove(null); - break; - case Blockly.Events.COMMENT_DELETE: - event = new Blockly.Events.CommentDelete(null); - break; - case Blockly.Events.UI: - event = new Blockly.Events.Ui(null); - break; - case Blockly.Events.DRAG_OUTSIDE: - event = new Blockly.Events.DragBlockOutside(null); - break; - case Blockly.Events.END_DRAG: - event = new Blockly.Events.EndBlockDrag(null, false); - break; - default: - throw 'Unknown event type.'; - } - event.fromJson(json); - event.workspaceId = workspace.id; - return event; -}; - -/** - * Enable/disable a block depending on whether it is properly connected. - * Use this on applications where all blocks should be connected to a top block. - * Recommend setting the 'disable' option to 'false' in the config so that - * users don't try to reenable disabled orphan blocks. - * @param {!Blockly.Events.Abstract} event Custom data for event. - */ -Blockly.Events.disableOrphans = function(event) { - if (event.type == Blockly.Events.MOVE || - event.type == Blockly.Events.CREATE) { - Blockly.Events.disable(); - var workspace = Blockly.Workspace.getById(event.workspaceId); - var block = workspace.getBlockById(event.blockId); - if (block) { - if (block.getParent() && !block.getParent().disabled) { - var children = block.getDescendants(false); - for (var i = 0, child; child = children[i]; i++) { - child.setDisabled(false); - } - } else if ((block.outputConnection || block.previousConnection) && - !workspace.isDragging()) { - do { - block.setDisabled(true); - block = block.getNextBlock(); - } while (block); - } - } - Blockly.Events.enable(); - } -}; diff --git a/packages/scratch-blocks/core/events_abstract.js b/packages/scratch-blocks/core/events_abstract.js deleted file mode 100644 index 2af78c3fc..000000000 --- a/packages/scratch-blocks/core/events_abstract.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Abstract class for events fired as a result of actions in - * Blockly's editor. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Events.Abstract'); - -goog.require('Blockly.Events'); -goog.require('goog.array'); -goog.require('goog.math.Coordinate'); - -/** - * Abstract class for an event. - * @constructor - */ -Blockly.Events.Abstract = function() { - /** - * The workspace identifier for this event. - * @type {string|undefined} - */ - this.workspaceId = undefined; - - /** - * The event group id for the group this event belongs to. Groups define - * events that should be treated as an single action from the user's - * perspective, and should be undone together. - * @type {string} - */ - this.group = Blockly.Events.group_; - - /** - * Sets whether the event should be added to the undo stack. - * @type {boolean} - */ - this.recordUndo = Blockly.Events.recordUndo; -}; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.Abstract.prototype.toJson = function() { - var json = { - 'type': this.type - }; - if (this.group) { - json['group'] = this.group; - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.Abstract.prototype.fromJson = function(json) { - this.group = json['group']; -}; - -/** - * Does this event record any change of state? - * By default we assume events are non-null. Subclasses may override to - * indicate that they do not change state. - * @return {boolean} False if something changed. - */ -Blockly.Events.Abstract.prototype.isNull = function() { - return false; -}; - -/** - * Run an event. - * @param {boolean} _forward True if run forward, false if run backward (undo). - */ -Blockly.Events.Abstract.prototype.run = function(_forward) { - // Defined by subclasses. -}; - -/** - * Get workspace the event belongs to. - * @return {Blockly.Workspace} The workspace the event belongs to. - * @throws {Error} if workspace is null. - * @protected - */ -Blockly.Events.Abstract.prototype.getEventWorkspace_ = function() { - var workspace = Blockly.Workspace.getById(this.workspaceId); - if (!workspace) { - throw Error('Workspace is null. Event must have been generated from real' + - ' Blockly events.'); - } - return workspace; -}; diff --git a/packages/scratch-blocks/core/extensions.js b/packages/scratch-blocks/core/extensions.js deleted file mode 100644 index 1aabed1be..000000000 --- a/packages/scratch-blocks/core/extensions.js +++ /dev/null @@ -1,450 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Extensions are functions that help initialize blocks, usually - * adding dynamic behavior such as onchange handlers and mutators. These - * are applied using Block.applyExtension(), or the JSON "extensions" - * array attribute. - * @author Anm@anm.me (Andrew n marshall) - */ -'use strict'; - -/** - * @name Blockly.Extensions - * @namespace - **/ -goog.provide('Blockly.Extensions'); - -goog.require('Blockly.Mutator'); -goog.require('Blockly.utils'); - -goog.require('goog.string'); - - -/** - * The set of all registered extensions, keyed by extension name/id. - * @private - */ -Blockly.Extensions.ALL_ = {}; - -/** - * Registers a new extension function. Extensions are functions that help - * initialize blocks, usually adding dynamic behavior such as onchange - * handlers and mutators. These are applied using Block.applyExtension(), or - * the JSON "extensions" array attribute. - * @param {string} name The name of this extension. - * @param {Function} initFn The function to initialize an extended block. - * @throws {Error} if the extension name is empty, the extension is already - * registered, or extensionFn is not a function. - */ -Blockly.Extensions.register = function(name, initFn) { - if (!goog.isString(name) || goog.string.isEmptyOrWhitespace(name)) { - throw new Error('Error: Invalid extension name "' + name + '"'); - } - if (Blockly.Extensions.ALL_[name]) { - throw new Error('Error: Extension "' + name + '" is already registered.'); - } - if (!goog.isFunction(initFn)) { - throw new Error('Error: Extension "' + name + '" must be a function'); - } - Blockly.Extensions.ALL_[name] = initFn; -}; - -/** - * Registers a new extension function that adds all key/value of mixinObj. - * @param {string} name The name of this extension. - * @param {!Object} mixinObj The values to mix in. - * @throws {Error} if the extension name is empty or the extension is already - * registered. - */ -Blockly.Extensions.registerMixin = function(name, mixinObj) { - if (!goog.isObject(mixinObj)){ - throw new Error('Error: Mixin "' + name + '" must be a object'); - } - Blockly.Extensions.register(name, function() { - this.mixin(mixinObj); - }); -}; - -/** - * Registers a new extension function that adds a mutator to the block. - * At register time this performs some basic sanity checks on the mutator. - * The wrapper may also add a mutator dialog to the block, if both compose and - * decompose are defined on the mixin. - * @param {string} name The name of this mutator extension. - * @param {!Object} mixinObj The values to mix in. - * @param {(function())=} opt_helperFn An optional function to apply after - * mixing in the object. - * @param {Array.=} opt_blockList A list of blocks to appear in the - * flyout of the mutator dialog. - * @throws {Error} if the mutation is invalid or can't be applied to the block. - */ -Blockly.Extensions.registerMutator = function(name, mixinObj, opt_helperFn, - opt_blockList) { - var errorPrefix = 'Error when registering mutator "' + name + '": '; - - // Sanity check the mixin object before registering it. - Blockly.Extensions.checkHasFunction_( - errorPrefix, mixinObj.domToMutation, 'domToMutation'); - Blockly.Extensions.checkHasFunction_( - errorPrefix, mixinObj.mutationToDom, 'mutationToDom'); - - var hasMutatorDialog = - Blockly.Extensions.checkMutatorDialog_(mixinObj, errorPrefix); - - if (opt_helperFn && !goog.isFunction(opt_helperFn)) { - throw new Error('Extension "' + name + '" is not a function'); - } - - // Sanity checks passed. - Blockly.Extensions.register(name, function() { - if (hasMutatorDialog) { - this.setMutator(new Blockly.Mutator(opt_blockList)); - } - // Mixin the object. - this.mixin(mixinObj); - - if (opt_helperFn) { - opt_helperFn.apply(this); - } - }); -}; - -/** - * Applies an extension method to a block. This should only be called during - * block construction. - * @param {string} name The name of the extension. - * @param {!Blockly.Block} block The block to apply the named extension to. - * @param {boolean} isMutator True if this extension defines a mutator. - * @throws {Error} if the extension is not found. - */ -Blockly.Extensions.apply = function(name, block, isMutator) { - var extensionFn = Blockly.Extensions.ALL_[name]; - if (!goog.isFunction(extensionFn)) { - throw new Error('Error: Extension "' + name + '" not found.'); - } - if (isMutator) { - // Fail early if the block already has mutation properties. - Blockly.Extensions.checkNoMutatorProperties_(name, block); - } else { - // Record the old properties so we can make sure they don't change after - // applying the extension. - var mutatorProperties = Blockly.Extensions.getMutatorProperties_(block); - } - extensionFn.apply(block); - - if (isMutator) { - var errorPrefix = 'Error after applying mutator "' + name + '": '; - Blockly.Extensions.checkBlockHasMutatorProperties_(errorPrefix, block); - } else { - if (!Blockly.Extensions.mutatorPropertiesMatch_(mutatorProperties, block)) { - throw new Error('Error when applying extension "' + name + '": ' + - 'mutation properties changed when applying a non-mutator extension.'); - } - } -}; - -/** - * Check that the given value is a function. - * @param {string} errorPrefix The string to prepend to any error message. - * @param {*} func Function to check. - * @param {string} propertyName Which property to check. - * @throws {Error} if the property does not exist or is not a function. - * @private - */ -Blockly.Extensions.checkHasFunction_ = function(errorPrefix, func, - propertyName) { - if (!func) { - throw new Error(errorPrefix + - 'missing required property "' + propertyName + '"'); - } else if (typeof func != 'function') { - throw new Error(errorPrefix + - '" required property "' + propertyName + '" must be a function'); - } -}; - -/** - * Check that the given block does not have any of the four mutator properties - * defined on it. This function should be called before applying a mutator - * extension to a block, to make sure we are not overwriting properties. - * @param {string} mutationName The name of the mutation to reference in error - * messages. - * @param {!Blockly.Block} block The block to check. - * @throws {Error} if any of the properties already exist on the block. - * @private - */ -Blockly.Extensions.checkNoMutatorProperties_ = function(mutationName, block) { - var properties = Blockly.Extensions.getMutatorProperties_(block); - if (properties.length) { - throw new Error('Error: tried to apply mutation "' + mutationName + - '" to a block that already has mutator functions.' + - ' Block id: ' + block.id); - } -}; - -/** - * Check that the given object has both or neither of the functions required - * to have a mutator dialog. - * These functions are 'compose' and 'decompose'. If a block has one, it must - * have both. - * @param {!Object} object The object to check. - * @param {string} errorPrefix The string to prepend to any error message. - * @return {boolean} True if the object has both functions. False if it has - * neither function. - * @throws {Error} if the object has only one of the functions. - * @private - */ -Blockly.Extensions.checkMutatorDialog_ = function(object, errorPrefix) { - var hasCompose = object.compose !== undefined; - var hasDecompose = object.decompose !== undefined; - - if (hasCompose && hasDecompose) { - if (typeof object.compose != 'function') { - throw new Error(errorPrefix + 'compose must be a function.'); - } else if (typeof object.decompose != 'function') { - throw new Error(errorPrefix + 'decompose must be a function.'); - } - return true; - } else if (!hasCompose && !hasDecompose) { - return false; - } else { - throw new Error(errorPrefix + - 'Must have both or neither of "compose" and "decompose"'); - } -}; - -/** - * Check that a block has required mutator properties. This should be called - * after applying a mutation extension. - * @param {string} errorPrefix The string to prepend to any error message. - * @param {!Blockly.Block} block The block to inspect. - * @private - */ -Blockly.Extensions.checkBlockHasMutatorProperties_ = function(errorPrefix, - block) { - if (typeof block.domToMutation !== 'function') { - throw new Error(errorPrefix + 'Applying a mutator didn\'t add "domToMutation"'); - } - if (typeof block.mutationToDom != 'function') { - throw new Error(errorPrefix + - 'Applying a mutator didn\'t add "mutationToDom"'); - } - - // A block with a mutator isn't required to have a mutation dialog, but - // it should still have both or neither of compose and decompose. - Blockly.Extensions.checkMutatorDialog_(block, errorPrefix); -}; - -/** - * Get a list of values of mutator properties on the given block. - * @param {!Blockly.Block} block The block to inspect. - * @return {!Array.} a list with all of the defined properties, which - * should be functions, but may be anything other than undefined. - * @private - */ -Blockly.Extensions.getMutatorProperties_ = function(block) { - var result = []; - // List each function explicitly by reference to allow for renaming - // during compilation. - if (block.domToMutation !== undefined) { - result.push(block.domToMutation); - } - if (block.mutationToDom !== undefined) { - result.push(block.mutationToDom); - } - if (block.compose !== undefined) { - result.push(block.compose); - } - if (block.decompose !== undefined) { - result.push(block.decompose); - } - return result; -}; - -/** - * Check that the current mutator properties match a list of old mutator - * properties. This should be called after applying a non-mutator extension, - * to verify that the extension didn't change properties it shouldn't. - * @param {!Array.} oldProperties The old values to compare to. - * @param {!Blockly.Block} block The block to inspect for new values. - * @return {boolean} True if the property lists match. - * @private - */ -Blockly.Extensions.mutatorPropertiesMatch_ = function(oldProperties, block) { - var newProperties = Blockly.Extensions.getMutatorProperties_(block); - if (newProperties.length != oldProperties.length) { - return false; - } - for (var i = 0; i < newProperties.length; i++) { - if (oldProperties[i] != newProperties[i]) { - return false; - } - } - return true; -}; - -/** - * Builds an extension function that will map a dropdown value to a tooltip - * string. - * - * This method includes multiple checks to ensure tooltips, dropdown options, - * and message references are aligned. This aims to catch errors as early as - * possible, without requiring developers to manually test tooltips under each - * option. After the page is loaded, each tooltip text string will be checked - * for matching message keys in the internationalized string table. Deferring - * this until the page is loaded decouples loading dependencies. Later, upon - * loading the first block of any given type, the extension will validate every - * dropdown option has a matching tooltip in the lookupTable. Errors are - * reported as warnings in the console, and are never fatal. - * @param {string} dropdownName The name of the field whose value is the key - * to the lookup table. - * @param {!Object.} lookupTable The table of field values to - * tooltip text. - * @return {Function} The extension function. - */ -Blockly.Extensions.buildTooltipForDropdown = function(dropdownName, - lookupTable) { - // List of block types already validated, to minimize duplicate warnings. - var blockTypesChecked = []; - - // Check the tooltip string messages for invalid references. - // Wait for load, in case Blockly.Msg is not yet populated. - // runAfterPageLoad() does not run in a Node.js environment due to lack of - // document object, in which case skip the validation. - if (document) { // Relies on document.readyState - Blockly.utils.runAfterPageLoad(function() { - for (var key in lookupTable) { - // Will print warnings is reference is missing. - Blockly.utils.checkMessageReferences(lookupTable[key]); - } - }); - } - - /** - * The actual extension. - * @this {Blockly.Block} - */ - var extensionFn = function() { - if (this.type && blockTypesChecked.indexOf(this.type) === -1) { - Blockly.Extensions.checkDropdownOptionsInTable_( - this, dropdownName, lookupTable); - blockTypesChecked.push(this.type); - } - - this.setTooltip(function() { - var value = this.getFieldValue(dropdownName); - var tooltip = lookupTable[value]; - if (tooltip == null) { - if (blockTypesChecked.indexOf(this.type) === -1) { - // Warn for missing values on generated tooltips. - var warning = 'No tooltip mapping for value ' + value + - ' of field ' + dropdownName; - if (this.type != null) { - warning += (' of block type ' + this.type); - } - console.warn(warning + '.'); - } - } else { - tooltip = Blockly.utils.replaceMessageReferences(tooltip); - } - return tooltip; - }.bind(this)); - }; - return extensionFn; -}; - -/** - * Checks all options keys are present in the provided string lookup table. - * Emits console warnings when they are not. - * @param {!Blockly.Block} block The block containing the dropdown - * @param {string} dropdownName The name of the dropdown - * @param {!Object.} lookupTable The string lookup table - * @private - */ -Blockly.Extensions.checkDropdownOptionsInTable_ = function(block, dropdownName, - lookupTable) { - // Validate all dropdown options have values. - var dropdown = block.getField(dropdownName); - if (!dropdown.isOptionListDynamic()) { - var options = dropdown.getOptions(); - for (var i = 0; i < options.length; ++i) { - var optionKey = options[i][1]; // label, then value - if (lookupTable[optionKey] == null) { - console.warn('No tooltip mapping for value ' + optionKey + - ' of field ' + dropdownName + ' of block type ' + block.type); - } - } - } -}; - -/** - * Builds an extension function that will install a dynamic tooltip. The - * tooltip message should include the string '%1' and that string will be - * replaced with the value of the named field. - * @param {string} msgTemplate The template form to of the message text, with - * %1 placeholder. - * @param {string} fieldName The field with the replacement value. - * @returns {Function} The extension function. - */ -Blockly.Extensions.buildTooltipWithFieldValue = - function(msgTemplate, fieldName) { - // Check the tooltip string messages for invalid references. - // Wait for load, in case Blockly.Msg is not yet populated. - // runAfterPageLoad() does not run in a Node.js environment due to lack of - // document object, in which case skip the validation. - if (document) { // Relies on document.readyState - Blockly.utils.runAfterPageLoad(function() { - // Will print warnings is reference is missing. - Blockly.utils.checkMessageReferences(msgTemplate); - }); - } - - /** - * The actual extension. - * @this {Blockly.Block} - */ - var extensionFn = function() { - this.setTooltip(function() { - return Blockly.utils.replaceMessageReferences(msgTemplate) - .replace('%1', this.getFieldValue(fieldName)); - }.bind(this)); - }; - return extensionFn; - }; - -/** - * Configures the tooltip to mimic the parent block when connected. Otherwise, - * uses the tooltip text at the time this extension is initialized. This takes - * advantage of the fact that all other values from JSON are initialized before - * extensions. - * @this {Blockly.Block} - * @private - */ -Blockly.Extensions.extensionParentTooltip_ = function() { - this.tooltipWhenNotConnected_ = this.tooltip; - this.setTooltip(function() { - var parent = this.getParent(); - return (parent && parent.getInputsInline() && parent.tooltip) || - this.tooltipWhenNotConnected_; - }.bind(this)); -}; -Blockly.Extensions.register('parent_tooltip_when_inline', - Blockly.Extensions.extensionParentTooltip_); diff --git a/packages/scratch-blocks/core/field.js b/packages/scratch-blocks/core/field.js deleted file mode 100644 index 692caa96a..000000000 --- a/packages/scratch-blocks/core/field.js +++ /dev/null @@ -1,807 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Field. Used for editable titles, variables, etc. - * This is an abstract class that defines the UI on the block. Actual - * instances would be Blockly.FieldTextInput, Blockly.FieldDropdown, etc. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Field'); - -goog.require('Blockly.Events.BlockChange'); -goog.require('Blockly.Gesture'); - -goog.require('goog.asserts'); -goog.require('goog.dom'); -goog.require('goog.math.Size'); -goog.require('goog.style'); -goog.require('goog.userAgent'); - - -/** - * Abstract class for an editable field. - * @param {string} text The initial content of the field. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns either the accepted text, a replacement - * text, or null to abort the change. - * @constructor - */ -Blockly.Field = function(text, opt_validator) { - this.size_ = new goog.math.Size( - Blockly.BlockSvg.FIELD_WIDTH, - Blockly.BlockSvg.FIELD_HEIGHT); - this.setValue(text); - this.setValidator(opt_validator); - - /** - * Maximum characters of text to display before adding an ellipsis. - * Same for strings and numbers. - * @type {number} - */ - this.maxDisplayLength = Blockly.BlockSvg.MAX_DISPLAY_LENGTH; -}; - - -/** - * The set of all registered fields, keyed by field type as used in the JSON - * definition of a block. - * @type {!Object} - * @private - */ -Blockly.Field.TYPE_MAP_ = {}; - -/** - * Registers a field type. May also override an existing field type. - * Blockly.Field.fromJson uses this registry to find the appropriate field. - * @param {!string} type The field type name as used in the JSON definition. - * @param {!{fromJson: Function}} fieldClass The field class containing a - * fromJson function that can construct an instance of the field. - * @throws {Error} if the type name is empty, or the fieldClass is not an - * object containing a fromJson function. - */ -Blockly.Field.register = function(type, fieldClass) { - if (!goog.isString(type) || goog.string.isEmptyOrWhitespace(type)) { - throw new Error('Invalid field type "' + type + '"'); - } - if (!goog.isObject(fieldClass) || !goog.isFunction(fieldClass.fromJson)) { - throw new Error('Field "' + fieldClass + - '" must have a fromJson function'); - } - Blockly.Field.TYPE_MAP_[type] = fieldClass; -}; - -/** - * Construct a Field from a JSON arg object. - * Finds the appropriate registered field by the type name as registered using - * Blockly.Field.register. - * @param {!Object} options A JSON object with a type and options specific - * to the field type. - * @returns {?Blockly.Field} The new field instance or null if a field wasn't - * found with the given type name - * @package - */ -Blockly.Field.fromJson = function(options) { - var fieldClass = Blockly.Field.TYPE_MAP_[options['type']]; - if (fieldClass) { - return fieldClass.fromJson(options); - } - return null; -}; - -/** - * Temporary cache of text widths. - * @type {Object} - * @private - */ -Blockly.Field.cacheWidths_ = null; - -/** - * Number of current references to cache. - * @type {number} - * @private - */ -Blockly.Field.cacheReference_ = 0; - - -/** - * Name of field. Unique within each block. - * Static labels are usually unnamed. - * @type {string|undefined} - */ -Blockly.Field.prototype.name = undefined; - -/** - * CSS class name for the text element. - * @type {string} - * @package - */ -Blockly.Field.prototype.className_ = 'blocklyText'; - -/** - * Visible text to display. - * @type {string} - * @private - */ -Blockly.Field.prototype.text_ = ''; - -/** - * Block this field is attached to. Starts as null, then in set in init. - * @type {Blockly.Block} - * @private - */ -Blockly.Field.prototype.sourceBlock_ = null; - -/** - * Is the field visible, or hidden due to the block being collapsed? - * @type {boolean} - * @private - */ -Blockly.Field.prototype.visible_ = true; - -/** - * Null, or an array of the field's argTypes (for styling). - * @type {Array} - * @private - */ -Blockly.Field.prototype.argType_ = null; - -/** - * Validation function called when user edits an editable field. - * @type {Function} - * @private - */ -Blockly.Field.prototype.validator_ = null; - -/** - * Whether to assume user is using a touch device for interactions. - * Used to show different UI for touch interactions, e.g. - * @type {boolean} - * @private - */ -Blockly.Field.prototype.useTouchInteraction_ = false; - -/** - * Non-breaking space. - * @const - */ -Blockly.Field.NBSP = '\u00A0'; - -/** - * Text offset used for IE/Edge. - * @const - */ -Blockly.Field.IE_TEXT_OFFSET = '0.3em'; - -/** - * Editable fields usually show some sort of UI for the user to change them. - * @type {boolean} - * @public - */ -Blockly.Field.prototype.EDITABLE = true; - -/** - * Serializable fields are saved by the XML renderer, non-serializable fields - * are not. Editable fields should be serialized. - * @type {boolean} - * @public - */ -Blockly.Field.prototype.SERIALIZABLE = true; - -/** - * Attach this field to a block. - * @param {!Blockly.Block} block The block containing this field. - */ -Blockly.Field.prototype.setSourceBlock = function(block) { - goog.asserts.assert(!this.sourceBlock_, 'Field already bound to a block.'); - this.sourceBlock_ = block; -}; - -/** - * Install this field on a block. - */ -Blockly.Field.prototype.init = function() { - if (this.fieldGroup_) { - // Field has already been initialized once. - return; - } - // Build the DOM. - this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null); - if (!this.visible_) { - this.fieldGroup_.style.display = 'none'; - } - // Add an attribute to cassify the type of field. - if (this.getArgTypes() !== null) { - if (this.sourceBlock_.isShadow()) { - this.sourceBlock_.svgGroup_.setAttribute('data-argument-type', - this.getArgTypes()); - } else { - // Fields without a shadow wrapper, like square dropdowns. - this.fieldGroup_.setAttribute('data-argument-type', this.getArgTypes()); - } - } - // Adjust X to be flipped for RTL. Position is relative to horizontal start of source block. - var size = this.getSize(); - var fieldX = (this.sourceBlock_.RTL) ? -size.width / 2 : size.width / 2; - /** @type {!Element} */ - this.textElement_ = Blockly.utils.createSvgElement('text', - { - 'class': this.className_, - 'x': fieldX, - 'y': size.height / 2 + Blockly.BlockSvg.FIELD_TOP_PADDING, - 'dominant-baseline': 'middle', - 'dy': goog.userAgent.EDGE_OR_IE ? Blockly.Field.IE_TEXT_OFFSET : '0', - 'text-anchor': 'middle' - }, this.fieldGroup_); - - this.updateEditable(); - this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); - // Force a render. - this.render_(); - this.size_.width = 0; - this.mouseDownWrapper_ = Blockly.bindEventWithChecks_( - this.getClickTarget_(), 'mousedown', this, this.onMouseDown_); -}; - -/** - * Initializes the model of the field after it has been installed on a block. - * No-op by default. - */ -Blockly.Field.prototype.initModel = function() { -}; - -/** - * Dispose of all DOM objects belonging to this editable field. - */ -Blockly.Field.prototype.dispose = function() { - if (this.mouseDownWrapper_) { - Blockly.unbindEvent_(this.mouseDownWrapper_); - this.mouseDownWrapper_ = null; - } - this.sourceBlock_ = null; - goog.dom.removeNode(this.fieldGroup_); - this.fieldGroup_ = null; - this.textElement_ = null; - this.validator_ = null; -}; - -/** - * Add or remove the UI indicating if this field is editable or not. - */ -Blockly.Field.prototype.updateEditable = function() { - var group = this.fieldGroup_; - if (!this.EDITABLE || !group) { - return; - } - if (this.sourceBlock_.isEditable()) { - Blockly.utils.addClass(group, 'blocklyEditableText'); - Blockly.utils.removeClass(group, 'blocklyNonEditableText'); - this.fieldGroup_.style.cursor = this.CURSOR; - } else { - Blockly.utils.addClass(group, 'blocklyNonEditableText'); - Blockly.utils.removeClass(group, 'blocklyEditableText'); - this.fieldGroup_.style.cursor = ''; - } -}; - -/** - * Check whether this field is currently editable. Some fields are never - * editable (e.g. text labels). Those fields are not serialized to XML. Other - * fields may be editable, and therefore serialized, but may exist on - * non-editable blocks. - * @return {boolean} whether this field is editable and on an editable block - */ -Blockly.Field.prototype.isCurrentlyEditable = function() { - return this.EDITABLE && !!this.sourceBlock_ && this.sourceBlock_.isEditable(); -}; - -/** - * Gets whether this editable field is visible or not. - * @return {boolean} True if visible. - */ -Blockly.Field.prototype.isVisible = function() { - return this.visible_; -}; - -/** - * Sets whether this editable field is visible or not. - * @param {boolean} visible True if visible. - */ -Blockly.Field.prototype.setVisible = function(visible) { - if (this.visible_ == visible) { - return; - } - this.visible_ = visible; - var root = this.getSvgRoot(); - if (root) { - root.style.display = visible ? 'block' : 'none'; - this.render_(); - } -}; - -/** - * Adds a string to the field's array of argTypes (used for styling). - * @param {string} argType New argType. - */ -Blockly.Field.prototype.addArgType = function(argType) { - if (this.argType_ == null) { - this.argType_ = []; - } - this.argType_.push(argType); -}; - -/** - * Gets the field's argTypes joined as a string, or returns null (used for styling). - * @return {string} argType string, or null. - */ -Blockly.Field.prototype.getArgTypes = function() { - if (this.argType_ === null || this.argType_.length === 0) { - return null; - } else { - return this.argType_.join(' '); - } -}; - -/** - * Sets a new validation function for editable fields. - * @param {Function} handler New validation function, or null. - */ -Blockly.Field.prototype.setValidator = function(handler) { - this.validator_ = handler; -}; - -/** - * Gets the validation function for editable fields. - * @return {Function} Validation function, or null. - */ -Blockly.Field.prototype.getValidator = function() { - return this.validator_; -}; - -/** - * Validates a change. Does nothing. Subclasses may override this. - * @param {string} text The user's text. - * @return {string} No change needed. - */ -Blockly.Field.prototype.classValidator = function(text) { - return text; -}; - -/** - * Calls the validation function for this field, as well as all the validation - * function for the field's class and its parents. - * @param {string} text Proposed text. - * @return {?string} Revised text, or null if invalid. - */ -Blockly.Field.prototype.callValidator = function(text) { - var classResult = this.classValidator(text); - if (classResult === null) { - // Class validator rejects value. Game over. - return null; - } else if (classResult !== undefined) { - text = classResult; - } - var userValidator = this.getValidator(); - if (userValidator) { - var userResult = userValidator.call(this, text); - if (userResult === null) { - // User validator rejects value. Game over. - return null; - } else if (userResult !== undefined) { - text = userResult; - } - } - return text; -}; - -/** - * Gets the group element for this editable field. - * Used for measuring the size and for positioning. - * @return {!Element} The group element. - */ -Blockly.Field.prototype.getSvgRoot = function() { - return /** @type {!Element} */ (this.fieldGroup_); -}; - -/** - * Draws the border with the correct width. - * Saves the computed width in a property. - * @private - */ -Blockly.Field.prototype.render_ = function() { - if (this.visible_ && this.textElement_) { - // Replace the text. - this.textElement_.textContent = this.getDisplayText_(); - this.updateWidth(); - - // Update text centering, based on newly calculated width. - var centerTextX = (this.size_.width - this.arrowWidth_) / 2; - if (this.sourceBlock_.RTL) { - centerTextX += this.arrowWidth_; - } - - // In a text-editing shadow block's field, - // if half the text length is not at least center of - // visible field (FIELD_WIDTH), center it there instead, - // unless there is a drop-down arrow. - if (this.sourceBlock_.isShadow() && !this.positionArrow) { - var minOffset = Blockly.BlockSvg.FIELD_WIDTH / 2; - if (this.sourceBlock_.RTL) { - // X position starts at the left edge of the block, in both RTL and LTR. - // First offset by the width of the block to move to the right edge, - // and then subtract to move to the same position as LTR. - var minCenter = this.size_.width - minOffset; - centerTextX = Math.min(minCenter, centerTextX); - } else { - // (width / 2) should exceed Blockly.BlockSvg.FIELD_WIDTH / 2 - // if the text is longer. - centerTextX = Math.max(minOffset, centerTextX); - } - } - - // Apply new text element x position. - this.textElement_.setAttribute('x', centerTextX); - } - - // Update any drawn box to the correct width and height. - if (this.box_) { - this.box_.setAttribute('width', this.size_.width); - this.box_.setAttribute('height', this.size_.height); - } -}; - -/** - * Updates the width of the field. This calls getCachedWidth which won't cache - * the approximated width on IE/Edge when `getComputedTextLength` fails. Once - * it eventually does succeed, the result will be cached. - **/ -Blockly.Field.prototype.updateWidth = function() { - // Calculate width of field - var width = Blockly.Field.getCachedWidth(this.textElement_); - - // Add padding to left and right of text. - if (this.EDITABLE) { - width += Blockly.BlockSvg.EDITABLE_FIELD_PADDING; - } - - // Adjust width for drop-down arrows. - this.arrowWidth_ = 0; - if (this.positionArrow) { - this.arrowWidth_ = this.positionArrow(width); - width += this.arrowWidth_; - } - - // Add padding to any drawn box. - if (this.box_) { - width += 2 * Blockly.BlockSvg.BOX_FIELD_PADDING; - } - - // Set width of the field. - this.size_.width = width; -}; - -/** - * Gets the width of a text element, caching it in the process. - * @param {!Element} textElement An SVG 'text' element. - * @return {number} Width of element. - */ -Blockly.Field.getCachedWidth = function(textElement) { - var key = textElement.textContent + '\n' + textElement.className.baseVal; - var width; - - // Return the cached width if it exists. - if (Blockly.Field.cacheWidths_) { - width = Blockly.Field.cacheWidths_[key]; - if (width) { - return width; - } - } - - // Attempt to compute fetch the width of the SVG text element. - try { - if (goog.userAgent.IE || goog.userAgent.EDGE) { - width = textElement.getBBox().width; - } else { - width = textElement.getComputedTextLength(); - } - } catch (e) { - // In other cases where we fail to geth the computed text. Instead, use an - // approximation and do not cache the result. At some later point in time - // when the block is inserted into the visible DOM, this method will be - // called again and, at that point in time, will not throw an exception. - return textElement.textContent.length * 8; - } - - // Cache the computed width and return. - if (Blockly.Field.cacheWidths_) { - Blockly.Field.cacheWidths_[key] = width; - } - return width; -}; - -/** - * Start caching field widths. Every call to this function MUST also call - * stopCache. Caches must not survive between execution threads. - */ -Blockly.Field.startCache = function() { - Blockly.Field.cacheReference_++; - if (!Blockly.Field.cacheWidths_) { - Blockly.Field.cacheWidths_ = {}; - } -}; - -/** - * Stop caching field widths. Unless caching was already on when the - * corresponding call to startCache was made. - */ -Blockly.Field.stopCache = function() { - Blockly.Field.cacheReference_--; - if (!Blockly.Field.cacheReference_) { - Blockly.Field.cacheWidths_ = null; - } -}; - -/** - * Returns the height and width of the field. - * @return {!goog.math.Size} Height and width. - */ -Blockly.Field.prototype.getSize = function() { - if (!this.size_.width) { - this.render_(); - } - return this.size_; -}; - -/** - * Returns the bounding box of the rendered field, accounting for workspace - * scaling. - * @return {!Object} An object with top, bottom, left, and right in pixels - * relative to the top left corner of the page (window coordinates). - * @private - */ -Blockly.Field.prototype.getScaledBBox_ = function() { - var size = this.getSize(); - var scaledHeight = size.height * this.sourceBlock_.workspace.scale; - var scaledWidth = size.width * this.sourceBlock_.workspace.scale; - var xy = this.getAbsoluteXY_(); - return { - top: xy.y, - bottom: xy.y + scaledHeight, - left: xy.x, - right: xy.x + scaledWidth - }; -}; - -/** - * Get the text from this field as displayed on screen. May differ from getText - * due to ellipsis, and other formatting. - * @return {string} Currently displayed text. - * @private - */ -Blockly.Field.prototype.getDisplayText_ = function() { - var text = this.text_; - if (!text) { - // Prevent the field from disappearing if empty. - return Blockly.Field.NBSP; - } - if (text.length > this.maxDisplayLength) { - // Truncate displayed string and add an ellipsis ('...'). - text = text.substring(0, this.maxDisplayLength - 2) + '\u2026'; - } - // Replace whitespace with non-breaking spaces so the text doesn't collapse. - text = text.replace(/\s/g, Blockly.Field.NBSP); - if (this.sourceBlock_.RTL) { - // The SVG is LTR, force text to be RTL unless a number. - if (this.sourceBlock_.editable_ && this.sourceBlock_.type === 'math_number') { - text = '\u202A' + text + '\u202C'; - } else { - text = '\u202B' + text + '\u202C'; - } - } - return text; -}; - -/** - * Get the text from this field. - * @return {string} Current text. - */ -Blockly.Field.prototype.getText = function() { - return this.text_; -}; - -/** - * Set the text in this field. Trigger a rerender of the source block. - * @param {*} newText New text. - */ -Blockly.Field.prototype.setText = function(newText) { - if (newText === null) { - // No change if null. - return; - } - newText = String(newText); - if (newText === this.text_) { - // No change. - return; - } - this.text_ = newText; - this.forceRerender(); -}; - -/** - * Force a rerender of the block that this field is installed on, which will - * rerender this field and adjust for any sizing changes. - * Other fields on the same block will not rerender, because their sizes have - * already been recorded. - * @package - */ -Blockly.Field.prototype.forceRerender = function() { - // Set width to 0 to force a rerender of this field. - this.size_.width = 0; - - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - this.sourceBlock_.bumpNeighbours_(); - } -}; - -/** - * Update the text node of this field to display the current text. - * @private - */ -Blockly.Field.prototype.updateTextNode_ = function() { - if (!this.textElement_) { - // Not rendered yet. - return; - } - var text = this.text_; - if (text.length > this.maxDisplayLength) { - // Truncate displayed string and add an ellipsis ('...'). - text = text.substring(0, this.maxDisplayLength - 2) + '\u2026'; - // Add special class for sizing font when truncated - this.textElement_.setAttribute('class', this.className_ + ' blocklyTextTruncated'); - } else { - this.textElement_.setAttribute('class', this.className_); - } - // Empty the text element. - goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_)); - // Replace whitespace with non-breaking spaces so the text doesn't collapse. - text = text.replace(/\s/g, Blockly.Field.NBSP); - if (this.sourceBlock_.RTL && text) { - // The SVG is LTR, force text to be RTL. - if (this.sourceBlock_.editable_ && this.sourceBlock_.type === 'math_number') { - text = '\u202A' + text + '\u202C'; - } else { - text = '\u202B' + text + '\u202C'; - } - } - if (!text) { - // Prevent the field from disappearing if empty. - text = Blockly.Field.NBSP; - } - var textNode = document.createTextNode(text); - this.textElement_.appendChild(textNode); - - // Cached width is obsolete. Clear it. - this.size_.width = 0; -}; - -/** - * By default there is no difference between the human-readable text and - * the language-neutral values. Subclasses (such as dropdown) may define this. - * @return {string} Current value. - */ -Blockly.Field.prototype.getValue = function() { - return this.getText(); -}; - -/** - * By default there is no difference between the human-readable text and - * the language-neutral values. Subclasses (such as dropdown) may define this. - * @param {string} newValue New value. - */ -Blockly.Field.prototype.setValue = function(newValue) { - if (newValue === null) { - // No change if null. - return; - } - var oldValue = this.getValue(); - if (oldValue == newValue) { - return; - } - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, oldValue, newValue)); - } - this.setText(newValue); -}; - -/** - * Handle a mouse down event on a field. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Field.prototype.onMouseDown_ = function(e) { - if (!this.sourceBlock_ || !this.sourceBlock_.workspace) { - return; - } - var gesture = this.sourceBlock_.workspace.getGesture(e); - if (gesture) { - gesture.setStartField(this); - } - this.useTouchInteraction_ = Blockly.Touch.getTouchIdentifierFromEvent(event) !== 'mouse'; -}; - -/** - * Change the tooltip text for this field. - * @param {string|!Element} _newTip Text for tooltip or a parent element to - * link to for its tooltip. - * @abstract - */ -Blockly.Field.prototype.setTooltip = function(_newTip) { - // Non-abstract sub-classes may wish to implement this. See FieldLabel. -}; - -/** - * Select the element to bind the click handler to. When this element is - * clicked on an editable field, the editor will open. - * - * If the block has only one field and no output connection, we handle clicks - * over the whole block. Otherwise, handle clicks over the the group containing - * the field. - * - * @return {!Element} Element to bind click handler to. - * @private - */ -Blockly.Field.prototype.getClickTarget_ = function() { - var nFields = 0; - - for (var i = 0, input; input = this.sourceBlock_.inputList[i]; i++) { - nFields += input.fieldRow.length; - } - if (nFields <= 1 && this.sourceBlock_.outputConnection) { - return this.sourceBlock_.getSvgRoot(); - } else { - return this.getSvgRoot(); - } -}; - -/** - * Return the absolute coordinates of the top-left corner of this field. - * The origin (0,0) is the top-left corner of the page body. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - * @private - */ -Blockly.Field.prototype.getAbsoluteXY_ = function() { - return goog.style.getPageOffset(this.getClickTarget_()); -}; - -/** - * Whether this field references any Blockly variables. If true it may need to - * be handled differently during serialization and deserialization. Subclasses - * may override this. - * @return {boolean} True if this field has any variable references. - * @package - */ -Blockly.Field.prototype.referencesVariables = function() { - return false; -}; diff --git a/packages/scratch-blocks/core/field_angle.js b/packages/scratch-blocks/core/field_angle.js deleted file mode 100644 index f178a2a74..000000000 --- a/packages/scratch-blocks/core/field_angle.js +++ /dev/null @@ -1,398 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Angle input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldAngle'); - -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.FieldTextInput'); -goog.require('goog.math'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable angle field. - * @param {(string|number)=} opt_value The initial content of the field. The - * value should cast to a number, and if it does not, '0' will be used. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns the accepted text or null to abort - * the change. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldAngle = function(opt_value, opt_validator) { - // Add degree symbol: '360°' (LTR) or '°360' (RTL) - this.symbol_ = Blockly.utils.createSvgElement('tspan', {}, null); - this.symbol_.appendChild(document.createTextNode('\u00B0')); - - var numRestrictor = new RegExp("[\\d]|[\\.]|[-]|[eE]"); - - opt_value = (opt_value && !isNaN(opt_value)) ? String(opt_value) : '0'; - Blockly.FieldAngle.superClass_.constructor.call( - this, opt_value, opt_validator, numRestrictor); - this.addArgType('angle'); -}; -goog.inherits(Blockly.FieldAngle, Blockly.FieldTextInput); - -/** - * Construct a FieldAngle from a JSON arg object. - * @param {!Object} options A JSON object with options (angle). - * @returns {!Blockly.FieldAngle} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldAngle.fromJson = function(options) { - return new Blockly.FieldAngle(options['angle']); -}; - -/** - * Round angles to the nearest 15 degrees when using mouse. - * Set to 0 to disable rounding. - */ -Blockly.FieldAngle.ROUND = 15; - -/** - * Half the width of protractor image. - */ -Blockly.FieldAngle.HALF = 120 / 2; - -/* The following two settings work together to set the behaviour of the angle - * picker. While many combinations are possible, two modes are typical: - * Math mode. - * 0 deg is right, 90 is up. This is the style used by protractors. - * Blockly.FieldAngle.CLOCKWISE = false; - * Blockly.FieldAngle.OFFSET = 0; - * Compass mode. - * 0 deg is up, 90 is right. This is the style used by maps. - * Blockly.FieldAngle.CLOCKWISE = true; - * Blockly.FieldAngle.OFFSET = 90; - */ - -/** - * Angle increases clockwise (true) or counterclockwise (false). - */ -Blockly.FieldAngle.CLOCKWISE = true; - -/** - * Offset the location of 0 degrees (and all angles) by a constant. - * Usually either 0 (0 = right) or 90 (0 = up). - */ -Blockly.FieldAngle.OFFSET = 90; - -/** - * Maximum allowed angle before wrapping. - * Usually either 360 (for 0 to 359.9) or 180 (for -179.9 to 180). - */ -Blockly.FieldAngle.WRAP = 180; - -/** - * Radius of drag handle - */ -Blockly.FieldAngle.HANDLE_RADIUS = 10; - -/** - * Width of drag handle arrow - */ -Blockly.FieldAngle.ARROW_WIDTH = Blockly.FieldAngle.HANDLE_RADIUS; - -/** - * Half the stroke-width used for the "glow" around the drag handle, rounded up to nearest whole pixel - */ - -Blockly.FieldAngle.HANDLE_GLOW_WIDTH = 3; - -/** - * Radius of protractor circle. Slightly smaller than protractor size since - * otherwise SVG crops off half the border at the edges. - */ -Blockly.FieldAngle.RADIUS = Blockly.FieldAngle.HALF - - Blockly.FieldAngle.HANDLE_RADIUS - Blockly.FieldAngle.HANDLE_GLOW_WIDTH; - -/** - * Radius of central dot circle. - */ -Blockly.FieldAngle.CENTER_RADIUS = 2; - -/** - * Path to the arrow svg icon. - */ -Blockly.FieldAngle.ARROW_SVG_PATH = 'icons/arrow.svg'; - -/** - * Clean up this FieldAngle, as well as the inherited FieldTextInput. - * @return {!Function} Closure to call on destruction of the WidgetDiv. - * @private - */ -Blockly.FieldAngle.prototype.dispose_ = function() { - var thisField = this; - return function() { - Blockly.FieldAngle.superClass_.dispose_.call(thisField)(); - thisField.gauge_ = null; - if (thisField.mouseDownWrapper_) { - Blockly.unbindEvent_(thisField.mouseDownWrapper_); - } - if (thisField.mouseUpWrapper_) { - Blockly.unbindEvent_(thisField.mouseUpWrapper_); - } - if (thisField.mouseMoveWrapper_) { - Blockly.unbindEvent_(thisField.mouseMoveWrapper_); - } - }; -}; - -/** - * Show the inline free-text editor on top of the text. - * @private - */ -Blockly.FieldAngle.prototype.showEditor_ = function() { - // Mobile browsers have issues with in-line textareas (focus & keyboards). - Blockly.FieldAngle.superClass_.showEditor_.call(this, this.useTouchInteraction_); - // If there is an existing drop-down someone else owns, hide it immediately and clear it. - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - var div = Blockly.DropDownDiv.getContentDiv(); - // Build the SVG DOM. - var svg = Blockly.utils.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'height': (Blockly.FieldAngle.HALF * 2) + 'px', - 'width': (Blockly.FieldAngle.HALF * 2) + 'px' - }, div); - Blockly.utils.createSvgElement('circle', { - 'cx': Blockly.FieldAngle.HALF, 'cy': Blockly.FieldAngle.HALF, - 'r': Blockly.FieldAngle.RADIUS, - 'class': 'blocklyAngleCircle' - }, svg); - this.gauge_ = Blockly.utils.createSvgElement('path', - {'class': 'blocklyAngleGauge'}, svg); - // The moving line, x2 and y2 are set in updateGraph_ - this.line_ = Blockly.utils.createSvgElement('line',{ - 'x1': Blockly.FieldAngle.HALF, - 'y1': Blockly.FieldAngle.HALF, - 'class': 'blocklyAngleLine' - }, svg); - // The fixed vertical line at the offset - var offsetRadians = Math.PI * Blockly.FieldAngle.OFFSET / 180; - Blockly.utils.createSvgElement('line', { - 'x1': Blockly.FieldAngle.HALF, - 'y1': Blockly.FieldAngle.HALF, - 'x2': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS * Math.cos(offsetRadians), - 'y2': Blockly.FieldAngle.HALF - Blockly.FieldAngle.RADIUS * Math.sin(offsetRadians), - 'class': 'blocklyAngleLine' - }, svg); - // Draw markers around the edge. - for (var angle = 0; angle < 360; angle += 15) { - Blockly.utils.createSvgElement('line', { - 'x1': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS - 13, - 'y1': Blockly.FieldAngle.HALF, - 'x2': Blockly.FieldAngle.HALF + Blockly.FieldAngle.RADIUS - 7, - 'y2': Blockly.FieldAngle.HALF, - 'class': 'blocklyAngleMarks', - 'transform': 'rotate(' + angle + ',' + - Blockly.FieldAngle.HALF + ',' + Blockly.FieldAngle.HALF + ')' - }, svg); - } - // Center point - Blockly.utils.createSvgElement('circle', { - 'cx': Blockly.FieldAngle.HALF, 'cy': Blockly.FieldAngle.HALF, - 'r': Blockly.FieldAngle.CENTER_RADIUS, - 'class': 'blocklyAngleCenterPoint' - }, svg); - // Handle group: a circle and the arrow image - this.handle_ = Blockly.utils.createSvgElement('g', {}, svg); - Blockly.utils.createSvgElement('circle', { - 'cx': 0, - 'cy': 0, - 'r': Blockly.FieldAngle.HANDLE_RADIUS, - 'class': 'blocklyAngleDragHandle' - }, this.handle_); - this.arrowSvg_ = Blockly.utils.createSvgElement('image', - { - 'width': Blockly.FieldAngle.ARROW_WIDTH, - 'height': Blockly.FieldAngle.ARROW_WIDTH, - 'x': -Blockly.FieldAngle.ARROW_WIDTH / 2, - 'y': -Blockly.FieldAngle.ARROW_WIDTH / 2, - 'class': 'blocklyAngleDragArrow' - }, - this.handle_); - this.arrowSvg_.setAttributeNS( - 'http://www.w3.org/1999/xlink', - 'xlink:href', - Blockly.mainWorkspace.options.pathToMedia + Blockly.FieldAngle.ARROW_SVG_PATH - ); - - Blockly.DropDownDiv.setColour(this.sourceBlock_.parentBlock_.getColour(), - this.sourceBlock_.getColourTertiary()); - Blockly.DropDownDiv.setCategory(this.sourceBlock_.parentBlock_.getCategory()); - Blockly.DropDownDiv.showPositionedByBlock(this, this.sourceBlock_); - - this.mouseDownWrapper_ = - Blockly.bindEvent_(this.handle_, 'mousedown', this, this.onMouseDown); - - this.updateGraph_(); -}; -/** - * Set the angle to match the mouse's position. - * @param {!Event} e Mouse move event. - */ -Blockly.FieldAngle.prototype.onMouseDown = function() { - this.mouseMoveWrapper_ = Blockly.bindEvent_(document.body, 'mousemove', this, this.onMouseMove); - this.mouseUpWrapper_ = Blockly.bindEvent_(document.body, 'mouseup', this, this.onMouseUp); -}; - -/** - * Set the angle to match the mouse's position. - * @param {!Event} e Mouse move event. - */ -Blockly.FieldAngle.prototype.onMouseUp = function() { - Blockly.unbindEvent_(this.mouseMoveWrapper_); - Blockly.unbindEvent_(this.mouseUpWrapper_); -}; - -/** - * Set the angle to match the mouse's position. - * @param {!Event} e Mouse move event. - */ -Blockly.FieldAngle.prototype.onMouseMove = function(e) { - e.preventDefault(); - var bBox = this.gauge_.ownerSVGElement.getBoundingClientRect(); - var dx = e.clientX - bBox.left - Blockly.FieldAngle.HALF; - var dy = e.clientY - bBox.top - Blockly.FieldAngle.HALF; - var angle = Math.atan(-dy / dx); - if (isNaN(angle)) { - // This shouldn't happen, but let's not let this error propagate further. - return; - } - angle = goog.math.toDegrees(angle); - // 0: East, 90: North, 180: West, 270: South. - if (dx < 0) { - angle += 180; - } else if (dy > 0) { - angle += 360; - } - if (Blockly.FieldAngle.CLOCKWISE) { - angle = Blockly.FieldAngle.OFFSET + 360 - angle; - } else { - angle -= Blockly.FieldAngle.OFFSET; - } - if (Blockly.FieldAngle.ROUND) { - angle = Math.round(angle / Blockly.FieldAngle.ROUND) * - Blockly.FieldAngle.ROUND; - } - angle = this.callValidator(angle); - Blockly.FieldTextInput.htmlInput_.value = angle; - this.setValue(angle); - this.validate_(); - this.resizeEditor_(); -}; - -/** - * Insert a degree symbol. - * @param {?string} text New text. - */ -Blockly.FieldAngle.prototype.setText = function(text) { - Blockly.FieldAngle.superClass_.setText.call(this, text); - if (!this.textElement_) { - // Not rendered yet. - return; - } - this.updateGraph_(); - // Cached width is obsolete. Clear it. - this.size_.width = 0; -}; - -/** - * Redraw the graph with the current angle. - * @private - */ -Blockly.FieldAngle.prototype.updateGraph_ = function() { - if (!this.gauge_) { - return; - } - var angleDegrees = Number(this.getText()) % 360 + Blockly.FieldAngle.OFFSET; - var angleRadians = goog.math.toRadians(angleDegrees); - var path = ['M ', Blockly.FieldAngle.HALF, ',', Blockly.FieldAngle.HALF]; - var x2 = Blockly.FieldAngle.HALF; - var y2 = Blockly.FieldAngle.HALF; - if (!isNaN(angleRadians)) { - var angle1 = goog.math.toRadians(Blockly.FieldAngle.OFFSET); - var x1 = Math.cos(angle1) * Blockly.FieldAngle.RADIUS; - var y1 = Math.sin(angle1) * -Blockly.FieldAngle.RADIUS; - if (Blockly.FieldAngle.CLOCKWISE) { - angleRadians = 2 * angle1 - angleRadians; - } - x2 += Math.cos(angleRadians) * Blockly.FieldAngle.RADIUS; - y2 -= Math.sin(angleRadians) * Blockly.FieldAngle.RADIUS; - // Use large arc only if input value is greater than wrap - var largeFlag = Math.abs(angleDegrees - Blockly.FieldAngle.OFFSET) > 180 ? 1 : 0; - var sweepFlag = Number(Blockly.FieldAngle.CLOCKWISE); - if (angleDegrees < Blockly.FieldAngle.OFFSET) { - sweepFlag = 1 - sweepFlag; // Sweep opposite direction if less than the offset - } - path.push(' l ', x1, ',', y1, - ' A ', Blockly.FieldAngle.RADIUS, ',', Blockly.FieldAngle.RADIUS, - ' 0 ', largeFlag, ' ', sweepFlag, ' ', x2, ',', y2, ' z'); - - // Image rotation needs to be set in degrees - if (Blockly.FieldAngle.CLOCKWISE) { - var imageRotation = angleDegrees + 2 * Blockly.FieldAngle.OFFSET; - } else { - var imageRotation = -angleDegrees; - } - this.arrowSvg_.setAttribute('transform', 'rotate(' + (imageRotation) + ')'); - } - this.gauge_.setAttribute('d', path.join('')); - this.line_.setAttribute('x2', x2); - this.line_.setAttribute('y2', y2); - this.handle_.setAttribute('transform', 'translate(' + x2 + ',' + y2 + ')'); -}; - -/** - * Ensure that only an angle may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid angle, or null if invalid. - */ -Blockly.FieldAngle.prototype.classValidator = function(text) { - if (text === null) { - return null; - } - var n = parseFloat(text || 0); - if (isNaN(n)) { - return null; - } - n = n % 360; - if (n < 0) { - n += 360; - } - if (n > Blockly.FieldAngle.WRAP) { - n -= 360; - } - return String(n); -}; - -Blockly.Field.register('field_angle', Blockly.FieldAngle); diff --git a/packages/scratch-blocks/core/field_checkbox.js b/packages/scratch-blocks/core/field_checkbox.js deleted file mode 100644 index a20b4b16a..000000000 --- a/packages/scratch-blocks/core/field_checkbox.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Checkbox field. Checked or not checked. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldCheckbox'); - -goog.require('Blockly.Field'); - - -/** - * Class for a checkbox field. - * @param {string} state The initial state of the field ('TRUE' or 'FALSE'). - * @param {Function=} opt_validator A function that is executed when a new - * option is selected. Its sole argument is the new checkbox state. If - * it returns a value, this becomes the new checkbox state, unless the - * value is null, in which case the change is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldCheckbox = function(state, opt_validator) { - Blockly.FieldCheckbox.superClass_.constructor.call(this, '', opt_validator); - // Set the initial state. - this.setValue(state); - this.addArgType('checkbox'); -}; -goog.inherits(Blockly.FieldCheckbox, Blockly.Field); - -/** - * Construct a FieldCheckbox from a JSON arg object. - * @param {!Object} options A JSON object with options (checked). - * @returns {!Blockly.FieldCheckbox} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldCheckbox.fromJson = function(options) { - return new Blockly.FieldCheckbox(options['checked'] ? 'TRUE' : 'FALSE'); -}; - -/** - * Character for the checkmark. - */ -Blockly.FieldCheckbox.CHECK_CHAR = '\u2713'; - -/** - * Mouse cursor style when over the hotspot that initiates editability. - */ -Blockly.FieldCheckbox.prototype.CURSOR = 'default'; - -/** - * Install this checkbox on a block. - */ -Blockly.FieldCheckbox.prototype.init = function() { - if (this.fieldGroup_) { - // Checkbox has already been initialized once. - return; - } - Blockly.FieldCheckbox.superClass_.init.call(this); - // The checkbox doesn't use the inherited text element. - // Instead it uses a custom checkmark element that is either visible or not. - this.checkElement_ = Blockly.utils.createSvgElement('text', - {'class': 'blocklyText blocklyCheckbox', 'x': -3, 'y': 14}, - this.fieldGroup_); - var textNode = document.createTextNode(Blockly.FieldCheckbox.CHECK_CHAR); - this.checkElement_.appendChild(textNode); - this.checkElement_.style.display = this.state_ ? 'block' : 'none'; -}; - -/** - * Return 'TRUE' if the checkbox is checked, 'FALSE' otherwise. - * @return {string} Current state. - */ -Blockly.FieldCheckbox.prototype.getValue = function() { - return String(this.state_).toUpperCase(); -}; - -/** - * Set the checkbox to be checked if newBool is 'TRUE' or true, - * unchecks otherwise. - * @param {string|boolean} newBool New state. - */ -Blockly.FieldCheckbox.prototype.setValue = function(newBool) { - var newState = (typeof newBool == 'string') ? - (newBool.toUpperCase() == 'TRUE') : !!newBool; - if (this.state_ !== newState) { - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, this.state_, newState)); - } - this.state_ = newState; - if (this.checkElement_) { - this.checkElement_.style.display = newState ? 'block' : 'none'; - } - } -}; - -/** - * Toggle the state of the checkbox. - * @private - */ -Blockly.FieldCheckbox.prototype.showEditor_ = function() { - var newState = !this.state_; - if (this.sourceBlock_) { - // Call any validation function, and allow it to override. - newState = this.callValidator(newState); - } - if (newState !== null) { - this.setValue(String(newState).toUpperCase()); - } -}; - -Blockly.Field.register('field_checkbox', Blockly.FieldCheckbox); diff --git a/packages/scratch-blocks/core/field_colour.js b/packages/scratch-blocks/core/field_colour.js deleted file mode 100644 index 58afad242..000000000 --- a/packages/scratch-blocks/core/field_colour.js +++ /dev/null @@ -1,253 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Colour input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldColour'); - -goog.require('Blockly.Field'); -goog.require('Blockly.utils'); - -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.style'); -goog.require('goog.ui.ColorPicker'); - - -/** - * Class for a colour input field. - * @param {string} colour The initial colour in '#rrggbb' format. - * @param {Function=} opt_validator A function that is executed when a new - * colour is selected. Its sole argument is the new colour value. Its - * return value becomes the selected colour, unless it is undefined, in - * which case the new colour stands, or it is null, in which case the change - * is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldColour = function(colour, opt_validator) { - Blockly.FieldColour.superClass_.constructor.call(this, colour, opt_validator); - this.addArgType('colour'); -}; -goog.inherits(Blockly.FieldColour, Blockly.Field); - -/** - * Construct a FieldColour from a JSON arg object. - * @param {!Object} options A JSON object with options (colour). - * @returns {!Blockly.FieldColour} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldColour.fromJson = function(options) { - return new Blockly.FieldColour(options['colour']); -}; - -/** - * By default use the global constants for colours. - * @type {Array.} - * @private - */ -Blockly.FieldColour.prototype.colours_ = null; - -/** - * By default use the global constants for columns. - * @type {number} - * @private - */ -Blockly.FieldColour.prototype.columns_ = 0; - -/** - * Install this field on a block. - * @param {!Blockly.Block} block The block containing this field. - */ -Blockly.FieldColour.prototype.init = function(block) { - if (this.fieldGroup_) { - // Colour field has already been initialized once. - return; - } - Blockly.FieldColour.superClass_.init.call(this, block); - this.setValue(this.getValue()); -}; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - */ -Blockly.FieldColour.prototype.CURSOR = 'default'; - -/** - * Close the colour picker if this input is being deleted. - */ -Blockly.FieldColour.prototype.dispose = function() { - Blockly.WidgetDiv.hideIfOwner(this); - Blockly.FieldColour.superClass_.dispose.call(this); -}; - -/** - * Return the current colour. - * @return {string} Current colour in '#rrggbb' format. - */ -Blockly.FieldColour.prototype.getValue = function() { - return this.colour_; -}; - -/** - * Set the colour. - * @param {string} colour The new colour in '#rrggbb' format. - */ -Blockly.FieldColour.prototype.setValue = function(colour) { - if (this.sourceBlock_ && Blockly.Events.isEnabled() && - this.colour_ != colour) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, this.colour_, colour)); - } - this.colour_ = colour; - if (this.sourceBlock_) { - // Set the primary, secondary and tertiary colour to this value. - // The renderer expects to be able to use the secondary color as the fill for a shadow. - this.sourceBlock_.setColour(colour, colour, colour); - } -}; - -/** - * Get the text from this field. Used when the block is collapsed. - * @return {string} Current text. - */ -Blockly.FieldColour.prototype.getText = function() { - var colour = this.colour_; - // Try to use #rgb format if possible, rather than #rrggbb. - var m = colour.match(/^#(.)\1(.)\2(.)\3$/); - if (m) { - colour = '#' + m[1] + m[2] + m[3]; - } - return colour; -}; - -/** - * Returns the fixed height and width. - * @return {!goog.math.Size} Height and width. - */ -Blockly.FieldColour.prototype.getSize = function() { - return new goog.math.Size(Blockly.BlockSvg.FIELD_WIDTH, Blockly.BlockSvg.FIELD_HEIGHT); -}; - -/** - * An array of colour strings for the palette. - * See bottom of this page for the default: - * http://docs.closure-library.googlecode.com/git/closure_goog_ui_colorpicker.js.source.html - * @type {!Array.} - */ -Blockly.FieldColour.COLOURS = goog.ui.ColorPicker.SIMPLE_GRID_COLORS; - -/** - * Number of columns in the palette. - */ -Blockly.FieldColour.COLUMNS = 7; - -/** - * Set a custom colour grid for this field. - * @param {Array.} colours Array of colours for this block, - * or null to use default (Blockly.FieldColour.COLOURS). - * @return {!Blockly.FieldColour} Returns itself (for method chaining). - */ -Blockly.FieldColour.prototype.setColours = function(colours) { - this.colours_ = colours; - return this; -}; - -/** - * Set a custom grid size for this field. - * @param {number} columns Number of columns for this block, - * or 0 to use default (Blockly.FieldColour.COLUMNS). - * @return {!Blockly.FieldColour} Returns itself (for method chaining). - */ -Blockly.FieldColour.prototype.setColumns = function(columns) { - this.columns_ = columns; - return this; -}; - -/** - * Create a palette under the colour field. - * @private - */ -Blockly.FieldColour.prototype.showEditor_ = function() { - Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, - Blockly.FieldColour.widgetDispose_); - - // Record viewport dimensions before adding the widget. - var viewportBBox = Blockly.utils.getViewportBBox(); - var anchorBBox = this.getScaledBBox_(); - - // Create and add the colour picker, then record the size. - var picker = this.createWidget_(); - var paletteSize = goog.style.getSize(picker.getElement()); - - // Position the picker to line up with the field. - Blockly.WidgetDiv.positionWithAnchor(viewportBBox, anchorBBox, paletteSize, - this.sourceBlock_.RTL); - - // Configure event handler. - var thisField = this; - Blockly.FieldColour.changeEventKey_ = goog.events.listen(picker, - goog.ui.ColorPicker.EventType.CHANGE, - function(event) { - var colour = event.target.getSelectedColor() || '#000000'; - Blockly.WidgetDiv.hide(); - if (thisField.sourceBlock_) { - // Call any validation function, and allow it to override. - colour = thisField.callValidator(colour); - } - if (colour !== null) { - thisField.setValue(colour); - } - }); -}; - -/** - * Create a color picker widget and render it inside the widget div. - * @return {!goog.ui.ColorPicker} The newly created color picker. - * @private - */ -Blockly.FieldColour.prototype.createWidget_ = function() { - // Create the palette using Closure. - var picker = new goog.ui.ColorPicker(); - picker.setSize(this.columns_ || Blockly.FieldColour.COLUMNS); - picker.setColors(this.colours_ || Blockly.FieldColour.COLOURS); - var div = Blockly.WidgetDiv.DIV; - picker.render(div); - picker.setSelectedColor(this.getValue()); - return picker; -}; - -/** - * Hide the colour palette. - * @private - */ -Blockly.FieldColour.widgetDispose_ = function() { - if (Blockly.FieldColour.changeEventKey_) { - goog.events.unlistenByKey(Blockly.FieldColour.changeEventKey_); - } - Blockly.Events.setGroup(false); -}; - -Blockly.Field.register('field_colour', Blockly.FieldColour); diff --git a/packages/scratch-blocks/core/field_colour_slider.js b/packages/scratch-blocks/core/field_colour_slider.js deleted file mode 100644 index 615ac9d8d..000000000 --- a/packages/scratch-blocks/core/field_colour_slider.js +++ /dev/null @@ -1,387 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Colour input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldColourSlider'); - -goog.require('Blockly.Field'); -goog.require('Blockly.DropDownDiv'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.style'); -goog.require('goog.color'); -goog.require('goog.ui.Slider'); - -/** - * Class for a slider-based colour input field. - * @param {string} colour The initial colour in '#rrggbb' format. - * @param {Function=} opt_validator A function that is executed when a new - * colour is selected. Its sole argument is the new colour value. Its - * return value becomes the selected colour, unless it is undefined, in - * which case the new colour stands, or it is null, in which case the change - * is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldColourSlider = function(colour, opt_validator) { - Blockly.FieldColourSlider.superClass_.constructor.call(this, colour, opt_validator); - this.addArgType('colour'); - - // Flag to track whether or not the slider callbacks should execute - this.sliderCallbacksEnabled_ = false; -}; -goog.inherits(Blockly.FieldColourSlider, Blockly.Field); - -/** - * Construct a FieldColourSlider from a JSON arg object. - * @param {!Object} options A JSON object with options (colour). - * @returns {!Blockly.FieldColourSlider} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldColourSlider.fromJson = function(options) { - return new Blockly.FieldColourSlider(options['colour']); -}; - -/** - * Function to be called if eyedropper can be activated. - * If defined, an eyedropper button will be added to the color picker. - * The button calls this function with a callback to update the field value. - * BEWARE: This is not a stable API, so it is being marked as private. It may change. - * @private - */ -Blockly.FieldColourSlider.activateEyedropper_ = null; - -/** - * Path to the eyedropper svg icon. - */ -Blockly.FieldColourSlider.EYEDROPPER_PATH = 'eyedropper.svg'; - -/** - * Install this field on a block. - * @param {!Blockly.Block} block The block containing this field. - */ -Blockly.FieldColourSlider.prototype.init = function(block) { - if (this.fieldGroup_) { - // Colour slider has already been initialized once. - return; - } - Blockly.FieldColourSlider.superClass_.init.call(this, block); - this.setValue(this.getValue()); -}; - -/** - * Return the current colour. - * @return {string} Current colour in '#rrggbb' format. - */ -Blockly.FieldColourSlider.prototype.getValue = function() { - return this.colour_; -}; - -/** - * Set the colour. - * @param {string} colour The new colour in '#rrggbb' format. - */ -Blockly.FieldColourSlider.prototype.setValue = function(colour) { - if (this.sourceBlock_ && Blockly.Events.isEnabled() && - this.colour_ != colour) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, this.colour_, colour)); - } - this.colour_ = colour; - if (this.sourceBlock_) { - // Set the primary, secondary and tertiary colour to this value. - // The renderer expects to be able to use the secondary colour as the fill for a shadow. - this.sourceBlock_.setColour(colour, colour, this.sourceBlock_.getColourTertiary()); - } - this.updateSliderHandles_(); - this.updateDom_(); -}; - -/** - * Create the hue, saturation or value CSS gradient for the slide backgrounds. - * @param {string} channel – Either "hue", "saturation" or "value". - * @return {string} Array colour hex colour stops for the given channel - * @private - */ -Blockly.FieldColourSlider.prototype.createColourStops_ = function(channel) { - var stops = []; - for(var n = 0; n <= 360; n += 20) { - switch (channel) { - case 'hue': - stops.push(goog.color.hsvToHex(n, this.saturation_, this.brightness_)); - break; - case 'saturation': - stops.push(goog.color.hsvToHex(this.hue_, n / 360, this.brightness_)); - break; - case 'brightness': - stops.push(goog.color.hsvToHex(this.hue_, this.saturation_, 255 * n / 360)); - break; - default: - throw new Error("Unknown channel for colour sliders: " + channel); - } - } - return stops; -}; - -/** - * Set the gradient CSS properties for the given node and channel - * @param {Node} node - The DOM node the gradient will be set on. - * @param {string} channel – Either "hue", "saturation" or "value". - * @private - */ -Blockly.FieldColourSlider.prototype.setGradient_ = function(node, channel) { - var gradient = this.createColourStops_(channel).join(','); - goog.style.setStyle(node, 'background', - '-moz-linear-gradient(left, ' + gradient + ')'); - goog.style.setStyle(node, 'background', - '-webkit-linear-gradient(left, ' + gradient + ')'); - goog.style.setStyle(node, 'background', - '-o-linear-gradient(left, ' + gradient + ')'); - goog.style.setStyle(node, 'background', - '-ms-linear-gradient(left, ' + gradient + ')'); - goog.style.setStyle(node, 'background', - 'linear-gradient(left, ' + gradient + ')'); -}; - -/** - * Update the readouts and slider backgrounds after value has changed. - * @private - */ -Blockly.FieldColourSlider.prototype.updateDom_ = function() { - if (this.hueSlider_) { - // Update the slider backgrounds - this.setGradient_(this.hueSlider_.getElement(), 'hue'); - this.setGradient_(this.saturationSlider_.getElement(), 'saturation'); - this.setGradient_(this.brightnessSlider_.getElement(), 'brightness'); - - // Update the readouts - this.hueReadout_.textContent = Math.floor(100 * this.hue_ / 360).toFixed(0); - this.saturationReadout_.textContent = Math.floor(100 * this.saturation_).toFixed(0); - this.brightnessReadout_.textContent = Math.floor(100 * this.brightness_ / 255).toFixed(0); - } -}; - -/** - * Update the slider handle positions from the current field value. - * @private - */ -Blockly.FieldColourSlider.prototype.updateSliderHandles_ = function() { - if (this.hueSlider_) { - // Don't let the following calls to setValue for each of the sliders - // trigger the slider callbacks (which then call setValue on this field again - // unnecessarily) - this.sliderCallbacksEnabled_ = false; - this.hueSlider_.setValue(this.hue_); - this.saturationSlider_.setValue(this.saturation_); - this.brightnessSlider_.setValue(this.brightness_); - this.sliderCallbacksEnabled_ = true; - } -}; - -/** - * Get the text from this field. Used when the block is collapsed. - * @return {string} Current text. - */ -Blockly.FieldColourSlider.prototype.getText = function() { - var colour = this.colour_; - // Try to use #rgb format if possible, rather than #rrggbb. - var m = colour.match(/^#(.)\1(.)\2(.)\3$/); - if (m) { - colour = '#' + m[1] + m[2] + m[3]; - } - return colour; -}; - -/** - * Create label and readout DOM elements, returning the readout - * @param {string} labelText - Text for the label - * @return {Array} The container node and the readout node. - * @private - */ -Blockly.FieldColourSlider.prototype.createLabelDom_ = function(labelText) { - var labelContainer = document.createElement('div'); - labelContainer.setAttribute('class', 'scratchColourPickerLabel'); - var readout = document.createElement('span'); - readout.setAttribute('class', 'scratchColourPickerReadout'); - var label = document.createElement('span'); - label.setAttribute('class', 'scratchColourPickerLabelText'); - label.textContent = labelText; - labelContainer.appendChild(label); - labelContainer.appendChild(readout); - return [labelContainer, readout]; -}; - -/** - * Factory for creating the different slider callbacks - * @param {string} channel - One of "hue", "saturation" or "brightness" - * @return {function} the callback for slider update - * @private - */ -Blockly.FieldColourSlider.prototype.sliderCallbackFactory_ = function(channel) { - var thisField = this; - return function(event) { - if (!thisField.sliderCallbacksEnabled_) return; - var channelValue = event.target.getValue(); - var hsv = goog.color.hexToHsv(thisField.getValue()); - switch (channel) { - case 'hue': - hsv[0] = thisField.hue_ = channelValue; - break; - case 'saturation': - hsv[1] = thisField.saturation_ = channelValue; - break; - case 'brightness': - hsv[2] = thisField.brightness_ = channelValue; - break; - } - var colour = goog.color.hsvToHex(hsv[0], hsv[1], hsv[2]); - if (thisField.sourceBlock_) { - // Call any validation function, and allow it to override. - colour = thisField.callValidator(colour); - } - if (colour !== null) { - thisField.setValue(colour, true); - } - }; -}; - -/** - * Activate the eyedropper, passing in a callback for setting the field value. - * @private - */ -Blockly.FieldColourSlider.prototype.activateEyedropperInternal_ = function() { - var thisField = this; - Blockly.FieldColourSlider.activateEyedropper_(function(value) { - // Update the internal hue/saturation/brightness values so sliders update. - var hsv = goog.color.hexToHsv(value); - thisField.hue_ = hsv[0]; - thisField.saturation_ = hsv[1]; - thisField.brightness_ = hsv[2]; - thisField.setValue(value); - }); -}; - -/** - * Create hue, saturation and brightness sliders under the colour field. - * @private - */ -Blockly.FieldColourSlider.prototype.showEditor_ = function() { - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - var div = Blockly.DropDownDiv.getContentDiv(); - - // Init color component values that are used while the editor is open - // in order to keep the slider values stable. - var hsv = goog.color.hexToHsv(this.getValue()); - this.hue_ = hsv[0]; - this.saturation_ = hsv[1]; - this.brightness_ = hsv[2]; - - var hueElements = this.createLabelDom_(Blockly.Msg.COLOUR_HUE_LABEL); - div.appendChild(hueElements[0]); - this.hueReadout_ = hueElements[1]; - this.hueSlider_ = new goog.ui.Slider(); - this.hueSlider_.setUnitIncrement(5); - this.hueSlider_.setMinimum(0); - this.hueSlider_.setMaximum(360); - this.hueSlider_.setMoveToPointEnabled(true); - this.hueSlider_.render(div); - - var saturationElements = - this.createLabelDom_(Blockly.Msg.COLOUR_SATURATION_LABEL); - div.appendChild(saturationElements[0]); - this.saturationReadout_ = saturationElements[1]; - this.saturationSlider_ = new goog.ui.Slider(); - this.saturationSlider_.setMoveToPointEnabled(true); - this.saturationSlider_.setUnitIncrement(0.01); - this.saturationSlider_.setStep(0.001); - this.saturationSlider_.setMinimum(0); - this.saturationSlider_.setMaximum(1.0); - this.saturationSlider_.render(div); - - var brightnessElements = - this.createLabelDom_(Blockly.Msg.COLOUR_BRIGHTNESS_LABEL); - div.appendChild(brightnessElements[0]); - this.brightnessReadout_ = brightnessElements[1]; - this.brightnessSlider_ = new goog.ui.Slider(); - this.brightnessSlider_.setUnitIncrement(2); - this.brightnessSlider_.setMinimum(0); - this.brightnessSlider_.setMaximum(255); - this.brightnessSlider_.setMoveToPointEnabled(true); - this.brightnessSlider_.render(div); - - if (Blockly.FieldColourSlider.activateEyedropper_) { - var button = document.createElement('button'); - button.setAttribute('class', 'scratchEyedropper'); - var image = document.createElement('img'); - image.src = Blockly.mainWorkspace.options.pathToMedia + Blockly.FieldColourSlider.EYEDROPPER_PATH; - button.appendChild(image); - div.appendChild(button); - Blockly.FieldColourSlider.eyedropperEventData_ = - Blockly.bindEventWithChecks_(button, 'click', this, - this.activateEyedropperInternal_); - } - - Blockly.DropDownDiv.setColour('#ffffff', '#dddddd'); - Blockly.DropDownDiv.setCategory(this.sourceBlock_.parentBlock_.getCategory()); - Blockly.DropDownDiv.showPositionedByBlock(this, this.sourceBlock_); - - // Set value updates the slider positions - // Do this before attaching callbacks to avoid extra events from initial set - this.setValue(this.getValue()); - - // Enable callbacks for the sliders - this.sliderCallbacksEnabled_ = true; - - Blockly.FieldColourSlider.hueChangeEventKey_ = goog.events.listen(this.hueSlider_, - goog.ui.Component.EventType.CHANGE, - this.sliderCallbackFactory_('hue')); - Blockly.FieldColourSlider.saturationChangeEventKey_ = goog.events.listen(this.saturationSlider_, - goog.ui.Component.EventType.CHANGE, - this.sliderCallbackFactory_('saturation')); - Blockly.FieldColourSlider.brightnessChangeEventKey_ = goog.events.listen(this.brightnessSlider_, - goog.ui.Component.EventType.CHANGE, - this.sliderCallbackFactory_('brightness')); -}; - -Blockly.FieldColourSlider.prototype.dispose = function() { - if (Blockly.FieldColourSlider.hueChangeEventKey_) { - goog.events.unlistenByKey(Blockly.FieldColourSlider.hueChangeEventKey_); - } - if (Blockly.FieldColourSlider.saturationChangeEventKey_) { - goog.events.unlistenByKey(Blockly.FieldColourSlider.saturationChangeEventKey_); - } - if (Blockly.FieldColourSlider.brightnessChangeEventKey_) { - goog.events.unlistenByKey(Blockly.FieldColourSlider.brightnessChangeEventKey_); - } - if (Blockly.FieldColourSlider.eyedropperEventData_) { - Blockly.unbindEvent_(Blockly.FieldColourSlider.eyedropperEventData_); - } - Blockly.Events.setGroup(false); - Blockly.FieldColourSlider.superClass_.dispose.call(this); -}; - -Blockly.Field.register('field_colour_slider', Blockly.FieldColourSlider); diff --git a/packages/scratch-blocks/core/field_date.js b/packages/scratch-blocks/core/field_date.js deleted file mode 100644 index 253cbb4b8..000000000 --- a/packages/scratch-blocks/core/field_date.js +++ /dev/null @@ -1,353 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Date input field. - * @author pkendall64@gmail.com (Paul Kendall) - */ -'use strict'; - -goog.provide('Blockly.FieldDate'); - -goog.require('Blockly.Field'); -goog.require('Blockly.utils'); - -goog.require('goog.date'); -goog.require('goog.date.DateTime'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.i18n.DateTimeSymbols'); -goog.require('goog.i18n.DateTimeSymbols_he'); -goog.require('goog.style'); -goog.require('goog.ui.DatePicker'); - - -/** - * Class for a date input field. - * @param {string} date The initial date. - * @param {Function=} opt_validator A function that is executed when a new - * date is selected. Its sole argument is the new date value. Its - * return value becomes the selected date, unless it is undefined, in - * which case the new date stands, or it is null, in which case the change - * is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldDate = function(date, opt_validator) { - if (!date) { - date = new goog.date.Date().toIsoString(true); - } - Blockly.FieldDate.superClass_.constructor.call(this, date, opt_validator); - this.setValue(date); - this.addArgType('date'); -}; -goog.inherits(Blockly.FieldDate, Blockly.Field); - -/** - * Construct a FieldDate from a JSON arg object. - * @param {!Object} options A JSON object with options (date). - * @returns {!Blockly.FieldDate} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldDate.fromJson = function(options) { - return new Blockly.FieldDate(options['date']); -}; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - */ -Blockly.FieldDate.prototype.CURSOR = 'text'; - -/** - * Close the colour picker if this input is being deleted. - */ -Blockly.FieldDate.prototype.dispose = function() { - Blockly.WidgetDiv.hideIfOwner(this); - Blockly.FieldDate.superClass_.dispose.call(this); -}; - -/** - * Return the current date. - * @return {string} Current date. - */ -Blockly.FieldDate.prototype.getValue = function() { - return this.date_; -}; - -/** - * Set the date. - * @param {string} date The new date. - */ -Blockly.FieldDate.prototype.setValue = function(date) { - if (this.sourceBlock_) { - var validated = this.callValidator(date); - // If the new date is invalid, validation returns null. - // In this case we still want to display the illegal result. - if (validated !== null) { - date = validated; - } - } - this.date_ = date; - Blockly.Field.prototype.setText.call(this, date); -}; - -/** - * Create a date picker under the date field. - * @private - */ -Blockly.FieldDate.prototype.showEditor_ = function() { - Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, - Blockly.FieldDate.widgetDispose_); - - // Record viewport dimensions before adding the picker. - var viewportBBox = Blockly.utils.getViewportBBox(); - var anchorBBox = this.getScaledBBox_(); - - // Create and add the date picker, then record the size. - var picker = this.createWidget_(); - var pickerSize = goog.style.getSize(picker.getElement()); - - // Position the picker to line up with the field. - Blockly.WidgetDiv.positionWithAnchor(viewportBBox, anchorBBox, pickerSize, - this.sourceBlock_.RTL); - - // Configure event handler. - var thisField = this; - Blockly.FieldDate.changeEventKey_ = goog.events.listen(picker, - goog.ui.DatePicker.Events.CHANGE, - function(event) { - var date = event.date ? event.date.toIsoString(true) : ''; - Blockly.WidgetDiv.hide(); - if (thisField.sourceBlock_) { - // Call any validation function, and allow it to override. - date = thisField.callValidator(date); - } - thisField.setValue(date); - }); -}; - -/** - * Create a date picker widget and render it inside the widget div. - * @return {!goog.ui.DatePicker} The newly created date picker. - * @private - */ -Blockly.FieldDate.prototype.createWidget_ = function() { - // Create the date picker using Closure. - Blockly.FieldDate.loadLanguage_(); - var picker = new goog.ui.DatePicker(); - picker.setAllowNone(false); - picker.setShowWeekNum(false); - var div = Blockly.WidgetDiv.DIV; - picker.render(div); - picker.setDate(goog.date.DateTime.fromIsoString(this.getValue())); - return picker; -}; - -/** - * Hide the date picker. - * @private - */ -Blockly.FieldDate.widgetDispose_ = function() { - if (Blockly.FieldDate.changeEventKey_) { - goog.events.unlistenByKey(Blockly.FieldDate.changeEventKey_); - } - Blockly.Events.setGroup(false); -}; - -/** - * Load the best language pack by scanning the Blockly.Msg object for a - * language that matches the available languages in Closure. - * @private - */ -Blockly.FieldDate.loadLanguage_ = function() { - var reg = /^DateTimeSymbols_(.+)$/; - for (var prop in goog.i18n) { - var m = prop.match(reg); - if (m) { - var lang = m[1].toLowerCase().replace('_', '.'); // E.g. 'pt.br' - if (goog.getObjectByName(lang, Blockly.Msg)) { - goog.i18n.DateTimeSymbols = goog.i18n[prop]; - } - } - } -}; - -/** - * CSS for date picker. See css.js for use. - */ -Blockly.FieldDate.CSS = [ - /* Copied from: goog/css/datepicker.css */ - /** - * Copyright 2009 The Closure Library Authors. All Rights Reserved. - * - * Use of this source code is governed by the Apache License, Version 2.0. - * See the COPYING file for details. - */ - - /** - * Standard styling for a goog.ui.DatePicker. - * - * @author arv@google.com (Erik Arvidsson) - */ - - '.blocklyWidgetDiv .goog-date-picker,', - '.blocklyWidgetDiv .goog-date-picker th,', - '.blocklyWidgetDiv .goog-date-picker td {', - ' font: 13px Arial, sans-serif;', - '}', - - '.blocklyWidgetDiv .goog-date-picker {', - ' -moz-user-focus: normal;', - ' -moz-user-select: none;', - ' position: relative;', - ' border: 1px solid #000;', - ' float: left;', - ' padding: 2px;', - ' color: #000;', - ' background: #c3d9ff;', - ' cursor: default;', - '}', - - '.blocklyWidgetDiv .goog-date-picker th {', - ' text-align: center;', - '}', - - '.blocklyWidgetDiv .goog-date-picker td {', - ' text-align: center;', - ' vertical-align: middle;', - ' padding: 1px 3px;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-menu {', - ' position: absolute;', - ' background: threedface;', - ' border: 1px solid gray;', - ' -moz-user-focus: normal;', - ' z-index: 1;', - ' outline: none;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-menu ul {', - ' list-style: none;', - ' margin: 0px;', - ' padding: 0px;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-menu ul li {', - ' cursor: default;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-menu-selected {', - ' background: #ccf;', - '}', - - '.blocklyWidgetDiv .goog-date-picker th {', - ' font-size: .9em;', - '}', - - '.blocklyWidgetDiv .goog-date-picker td div {', - ' float: left;', - '}', - - '.blocklyWidgetDiv .goog-date-picker button {', - ' padding: 0px;', - ' margin: 1px 0;', - ' border: 0;', - ' color: #20c;', - ' font-weight: bold;', - ' background: transparent;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-date {', - ' background: #fff;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-week,', - '.blocklyWidgetDiv .goog-date-picker-wday {', - ' padding: 1px 3px;', - ' border: 0;', - ' border-color: #a2bbdd;', - ' border-style: solid;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-week {', - ' border-right-width: 1px;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-wday {', - ' border-bottom-width: 1px;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-head td {', - ' text-align: center;', - '}', - - /** Use td.className instead of !important */ - '.blocklyWidgetDiv td.goog-date-picker-today-cont {', - ' text-align: center;', - '}', - - /** Use td.className instead of !important */ - '.blocklyWidgetDiv td.goog-date-picker-none-cont {', - ' text-align: center;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-month {', - ' min-width: 11ex;', - ' white-space: nowrap;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-year {', - ' min-width: 6ex;', - ' white-space: nowrap;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-monthyear {', - ' white-space: nowrap;', - '}', - - '.blocklyWidgetDiv .goog-date-picker table {', - ' border-collapse: collapse;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-other-month {', - ' color: #888;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-wkend-start,', - '.blocklyWidgetDiv .goog-date-picker-wkend-end {', - ' background: #eee;', - '}', - - /** Use td.className instead of !important */ - '.blocklyWidgetDiv td.goog-date-picker-selected {', - ' background: #c3d9ff;', - '}', - - '.blocklyWidgetDiv .goog-date-picker-today {', - ' background: #9ab;', - ' font-weight: bold !important;', - ' border-color: #246 #9bd #9bd #246;', - ' color: #fff;', - '}' -]; - -Blockly.Field.register('field_date', Blockly.FieldDate); diff --git a/packages/scratch-blocks/core/field_dropdown.js b/packages/scratch-blocks/core/field_dropdown.js deleted file mode 100644 index 8d833c7fd..000000000 --- a/packages/scratch-blocks/core/field_dropdown.js +++ /dev/null @@ -1,483 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Dropdown input field. Used for editable titles and variables. - * In the interests of a consistent UI, the toolbox shares some functions and - * properties with the context menu. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldDropdown'); - -goog.require('Blockly.Field'); -goog.require('Blockly.DropDownDiv'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.style'); -goog.require('goog.ui.Menu'); -goog.require('goog.ui.MenuItem'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable dropdown field. - * @param {(!Array.|!Function)} menuGenerator An array of options - * for a dropdown list, or a function which generates these options. - * @param {Function=} opt_validator A function that is executed when a new - * option is selected, with the newly selected value as its sole argument. - * If it returns a value, that value (which must be one of the options) will - * become selected in place of the newly selected option, unless the return - * value is null, in which case the change is aborted. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldDropdown = function(menuGenerator, opt_validator) { - this.menuGenerator_ = menuGenerator; - this.trimOptions_(); - var firstTuple = this.getOptions()[0]; - - // Call parent's constructor. - Blockly.FieldDropdown.superClass_.constructor.call(this, firstTuple[1], - opt_validator); - this.addArgType('dropdown'); -}; -goog.inherits(Blockly.FieldDropdown, Blockly.Field); - -/** - * Construct a FieldDropdown from a JSON arg object. - * @param {!Object} element A JSON object with options. - * @returns {!Blockly.FieldDropdown} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldDropdown.fromJson = function(element) { - return new Blockly.FieldDropdown(element['options']); -}; - -/** - * Horizontal distance that a checkmark overhangs the dropdown. - */ -Blockly.FieldDropdown.CHECKMARK_OVERHANG = 25; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - */ -Blockly.FieldDropdown.prototype.CURSOR = 'default'; - -/** - * Closure menu item currently selected. - * @type {?goog.ui.MenuItem} - */ -Blockly.FieldDropdown.prototype.selectedItem = null; - -/** - * Language-neutral currently selected string or image object. - * @type {string|!Object} - * @private - */ -Blockly.FieldDropdown.prototype.value_ = ''; - -/** - * SVG image element if currently selected option is an image, or null. - * @type {SVGElement} - * @private - */ -Blockly.FieldDropdown.prototype.imageElement_ = null; - -/** - * Object with src, height, width, and alt attributes if currently selected - * option is an image, or null. - * @type {Object} - * @private - */ -Blockly.FieldDropdown.prototype.imageJson_ = null; - -/** - * Install this dropdown on a block. - */ -Blockly.FieldDropdown.prototype.init = function() { - if (this.fieldGroup_) { - // Dropdown has already been initialized once. - return; - } - // Add dropdown arrow: "option ▾" (LTR) or "▾ אופציה" (RTL) - // Positioned on render, after text size is calculated. - /** @type {Number} */ - this.arrowSize_ = 12; - /** @type {Number} */ - this.arrowX_ = 0; - /** @type {Number} */ - this.arrowY_ = 11; - this.arrow_ = Blockly.utils.createSvgElement('image', { - 'height': this.arrowSize_ + 'px', - 'width': this.arrowSize_ + 'px' - }); - this.arrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'dropdown-arrow.svg'); - this.className_ += ' blocklyDropdownText'; - - Blockly.FieldDropdown.superClass_.init.call(this); - // If not in a shadow block, draw a box. - if (!this.sourceBlock_.isShadow()) { - this.box_ = Blockly.utils.createSvgElement('rect', { - 'rx': Blockly.BlockSvg.CORNER_RADIUS, - 'ry': Blockly.BlockSvg.CORNER_RADIUS, - 'x': 0, - 'y': 0, - 'width': this.size_.width, - 'height': this.size_.height, - 'stroke': this.sourceBlock_.getColourTertiary(), - 'fill': this.sourceBlock_.getColour(), - 'class': 'blocklyBlockBackground', - 'fill-opacity': 1 - }, null); - this.fieldGroup_.insertBefore(this.box_, this.textElement_); - } - // Force a reset of the text to add the arrow. - var text = this.text_; - this.text_ = null; - this.setText(text); -}; - -/** - * Create a dropdown menu under the text. - * @private - */ -Blockly.FieldDropdown.prototype.showEditor_ = function() { - var options = this.getOptions(); - if (options.length == 0) return; - - this.dropDownOpen_ = true; - // If there is an existing drop-down someone else owns, hide it immediately and clear it. - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - - var contentDiv = Blockly.DropDownDiv.getContentDiv(); - - var thisField = this; - - function callback(e) { - var menu = this; - var menuItem = e.target; - if (menuItem) { - thisField.onItemSelected(menu, menuItem); - } - Blockly.DropDownDiv.hide(); - Blockly.Events.setGroup(false); - } - - var menu = new goog.ui.Menu(); - menu.setRightToLeft(this.sourceBlock_.RTL); - for (var i = 0; i < options.length; i++) { - var content = options[i][0]; // Human-readable text or image. - var value = options[i][1]; // Language-neutral value. - if (typeof content == 'object') { - // An image, not text. - var image = new Image(content['width'], content['height']); - image.src = content['src']; - image.alt = content['alt'] || ''; - content = image; - } - var menuItem = new goog.ui.MenuItem(content); - menuItem.setRightToLeft(this.sourceBlock_.RTL); - menuItem.setValue(value); - menuItem.setCheckable(true); - menu.addChild(menuItem, true); - var checked = (value == this.value_); - menuItem.setChecked(checked); - if (checked) { - this.selectedItem = menuItem; - } - } - // Listen for mouse/keyboard events. - goog.events.listen(menu, goog.ui.Component.EventType.ACTION, callback); - - // Record windowSize and scrollOffset before adding menu. - menu.render(contentDiv); - var menuDom = menu.getElement(); - Blockly.utils.addClass(menuDom, 'blocklyDropdownMenu'); - // Record menuSize after adding menu. - var menuSize = goog.style.getSize(menuDom); - // Recalculate height for the total content, not only box height. - menuSize.height = menuDom.scrollHeight; - - var primaryColour = (this.sourceBlock_.isShadow()) ? - this.sourceBlock_.parentBlock_.getColour() : this.sourceBlock_.getColour(); - - Blockly.DropDownDiv.setColour(primaryColour, this.sourceBlock_.getColourTertiary()); - - var category = (this.sourceBlock_.isShadow()) ? - this.sourceBlock_.parentBlock_.getCategory() : this.sourceBlock_.getCategory(); - Blockly.DropDownDiv.setCategory(category); - - // Calculate positioning based on the field position. - var scale = this.sourceBlock_.workspace.scale; - var bBox = {width: this.size_.width, height: this.size_.height}; - bBox.width *= scale; - bBox.height *= scale; - var position = this.fieldGroup_.getBoundingClientRect(); - var primaryX = position.left + bBox.width / 2; - var primaryY = position.top + bBox.height; - var secondaryX = primaryX; - var secondaryY = position.top; - // Set bounds to workspace; show the drop-down. - Blockly.DropDownDiv.setBoundsElement(this.sourceBlock_.workspace.getParentSvg().parentNode); - Blockly.DropDownDiv.show( - this, primaryX, primaryY, secondaryX, secondaryY, this.onHide.bind(this)); - - menu.setAllowAutoFocus(true); - menuDom.focus(); - - // Update colour to look selected. - if (!this.disableColourChange_) { - if (this.sourceBlock_.isShadow()) { - this.sourceBlock_.setShadowColour(this.sourceBlock_.getColourTertiary()); - } else if (this.box_) { - this.box_.setAttribute('fill', this.sourceBlock_.getColourTertiary()); - } - } -}; - -/** - * Callback for when the drop-down is hidden. - */ -Blockly.FieldDropdown.prototype.onHide = function() { - this.dropDownOpen_ = false; - // Update colour to look selected. - if (!this.disableColourChange_ && this.sourceBlock_) { - if (this.sourceBlock_.isShadow()) { - this.sourceBlock_.clearShadowColour(); - } else if (this.box_) { - this.box_.setAttribute('fill', this.sourceBlock_.getColour()); - } - } -}; - -/** - * Handle the selection of an item in the dropdown menu. - * @param {!goog.ui.Menu} menu The Menu component clicked. - * @param {!goog.ui.MenuItem} menuItem The MenuItem selected within menu. - */ -Blockly.FieldDropdown.prototype.onItemSelected = function(menu, menuItem) { - var value = menuItem.getValue(); - if (this.sourceBlock_) { - // Call any validation function, and allow it to override. - value = this.callValidator(value); - } - // If the value of the menu item is a function, call it and do not select it. - if (typeof value == 'function') { - value(); - return; - } - if (value !== null) { - this.setValue(value); - } -}; - -/** - * Factor out common words in statically defined options. - * Create prefix and/or suffix labels. - * @private - */ -Blockly.FieldDropdown.prototype.trimOptions_ = function() { - this.prefixField = null; - this.suffixField = null; - var options = this.menuGenerator_; - if (!goog.isArray(options)) { - return; - } - var hasImages = false; - - // Localize label text and image alt text. - for (var i = 0; i < options.length; i++) { - var label = options[i][0]; - if (typeof label == 'string') { - options[i][0] = Blockly.utils.replaceMessageReferences(label); - } else { - if (label.alt != null) { - options[i][0].alt = Blockly.utils.replaceMessageReferences(label.alt); - } - hasImages = true; - } - } - if (hasImages || options.length < 2) { - return; // Do nothing if too few items or at least one label is an image. - } - var strings = []; - for (var i = 0; i < options.length; i++) { - strings.push(options[i][0]); - } - var shortest = Blockly.utils.shortestStringLength(strings); - var prefixLength = Blockly.utils.commonWordPrefix(strings, shortest); - var suffixLength = Blockly.utils.commonWordSuffix(strings, shortest); - if (!prefixLength && !suffixLength) { - return; - } - if (shortest <= prefixLength + suffixLength) { - // One or more strings will entirely vanish if we proceed. Abort. - return; - } - if (prefixLength) { - this.prefixField = strings[0].substring(0, prefixLength - 1); - } - if (suffixLength) { - this.suffixField = strings[0].substr(1 - suffixLength); - } - // Remove the prefix and suffix from the options. - var newOptions = []; - for (var i = 0; i < options.length; i++) { - var text = options[i][0]; - var value = options[i][1]; - text = text.substring(prefixLength, text.length - suffixLength); - newOptions[i] = [text, value]; - } - this.menuGenerator_ = newOptions; -}; - -/** - * @return {boolean} True if the option list is generated by a function. - * Otherwise false. - */ -Blockly.FieldDropdown.prototype.isOptionListDynamic = function() { - return goog.isFunction(this.menuGenerator_); -}; - -/** - * Return a list of the options for this dropdown. - * @return {!Array.} Array of option tuples: - * (human-readable text or image, language-neutral name). - */ -Blockly.FieldDropdown.prototype.getOptions = function() { - if (goog.isFunction(this.menuGenerator_)) { - return this.menuGenerator_.call(this); - } - return /** @type {!Array.>} */ (this.menuGenerator_); -}; - -/** - * Get the language-neutral value from this dropdown menu. - * @return {string} Current text. - */ -Blockly.FieldDropdown.prototype.getValue = function() { - return this.value_; -}; - -/** - * Set the language-neutral value for this dropdown menu. - * @param {string} newValue New value to set. - */ -Blockly.FieldDropdown.prototype.setValue = function(newValue) { - if (newValue === null || newValue === this.value_) { - return; // No change if null. - } - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, this.value_, newValue)); - } - // Clear menu item for old value. - if (this.selectedItem) { - this.selectedItem.setChecked(false); - this.selectedItem = null; - } - this.value_ = newValue; - // Look up and display the human-readable text. - var options = this.getOptions(); - for (var i = 0; i < options.length; i++) { - // Options are tuples of human-readable text and language-neutral values. - if (options[i][1] == newValue) { - var content = options[i][0]; - if (typeof content == 'object') { - this.imageJson_ = content; - this.text_ = content.alt; - } else { - this.imageJson_ = null; - this.text_ = content; - } - // Always rerender if either the value or the text has changed. - this.forceRerender(); - return; - } - } - // Value not found. Add it, maybe it will become valid once set - // (like variable names). - this.text_ = newValue; - this.forceRerender(); -}; - -/** - * Sets the text in this field. Trigger a rerender of the source block. - * @param {?string} text New text. - */ -Blockly.FieldDropdown.prototype.setText = function(text) { - if (text === null || text === this.text_) { - // No change if null. - return; - } - this.text_ = text; - this.updateTextNode_(); - - if (this.textElement_) { - this.textElement_.parentNode.appendChild(this.arrow_); - } - if (this.sourceBlock_ && this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - this.sourceBlock_.bumpNeighbours_(); - } -}; - -/** - * Position a drop-down arrow at the appropriate location at render-time. - * @param {number} x X position the arrow is being rendered at, in px. - * @return {number} Amount of space the arrow is taking up, in px. - */ -Blockly.FieldDropdown.prototype.positionArrow = function(x) { - if (!this.arrow_) { - return 0; - } - - var addedWidth = 0; - if (this.sourceBlock_.RTL) { - this.arrowX_ = this.arrowSize_ - Blockly.BlockSvg.DROPDOWN_ARROW_PADDING; - addedWidth = this.arrowSize_ + Blockly.BlockSvg.DROPDOWN_ARROW_PADDING; - } else { - this.arrowX_ = x + Blockly.BlockSvg.DROPDOWN_ARROW_PADDING / 2; - addedWidth = this.arrowSize_ + Blockly.BlockSvg.DROPDOWN_ARROW_PADDING; - } - if (this.box_) { - // Bump positioning to the right for a box-type drop-down. - this.arrowX_ += Blockly.BlockSvg.BOX_FIELD_PADDING; - } - this.arrow_.setAttribute('transform', - 'translate(' + this.arrowX_ + ',' + this.arrowY_ + ')'); - return addedWidth; -}; - -/** - * Close the dropdown menu if this input is being deleted. - */ -Blockly.FieldDropdown.prototype.dispose = function() { - this.selectedItem = null; - Blockly.WidgetDiv.hideIfOwner(this); - Blockly.FieldDropdown.superClass_.dispose.call(this); -}; - -Blockly.Field.register('field_dropdown', Blockly.FieldDropdown); diff --git a/packages/scratch-blocks/core/field_iconmenu.js b/packages/scratch-blocks/core/field_iconmenu.js deleted file mode 100644 index 351f8891b..000000000 --- a/packages/scratch-blocks/core/field_iconmenu.js +++ /dev/null @@ -1,307 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Icon picker input field. - * This is primarily for use in Scratch Horizontal blocks. - * Pops open a drop-down with icons; when an icon is selected, it replaces - * the icon (image field) in the original block. - * @author tmickel@mit.edu (Tim Mickel) - */ -'use strict'; - -goog.provide('Blockly.FieldIconMenu'); - -goog.require('Blockly.DropDownDiv'); - -/** - * Class for an icon menu field. - * @param {Object} icons List of icons. These take the same options as an Image Field. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldIconMenu = function(icons) { - /** @type {object} */ - this.icons_ = icons; - // Example: - // [{src: '...', width: 20, height: 20, alt: '...', value: 'machine_value'}, ...] - // First icon provides the default values. - var defaultValue = icons[0].value; - Blockly.FieldIconMenu.superClass_.constructor.call(this, defaultValue); - this.addArgType('iconmenu'); -}; -goog.inherits(Blockly.FieldIconMenu, Blockly.Field); - -/** - * Construct a FieldIconMenu from a JSON arg object. - * @param {!Object} element A JSON object with options. - * @returns {!Blockly.FieldIconMenu} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldIconMenu.fromJson = function(element) { - return new Blockly.FieldIconMenu(element['options']); -}; - -/** - * Fixed width of the drop-down, in px. Icon buttons will flow inside this width. - * @type {number} - * @const - */ -Blockly.FieldIconMenu.DROPDOWN_WIDTH = 168; - -/** - * Save the primary colour of the source block while the menu is open, for reset. - * @type {number|string} - * @private - */ -Blockly.FieldIconMenu.savedPrimary_ = null; - -/** - * Called when the field is placed on a block. - * @param {Block} block The owning block. - */ -Blockly.FieldIconMenu.prototype.init = function(block) { - if (this.fieldGroup_) { - // Icon menu has already been initialized once. - return; - } - // Render the arrow icon - // Fixed sizes in px. Saved for creating the flip transform of the menu renders above the button. - var arrowSize = 12; - /** @type {Number} */ - this.arrowX_ = 18; - /** @type {Number} */ - this.arrowY_ = 10; - if (block.RTL) { - // In RTL, the icon position is flipped and rendered from the right (offset by width) - this.arrowX_ = -this.arrowX_ - arrowSize; - } - /** @type {Element} */ - this.arrowIcon_ = Blockly.utils.createSvgElement('image', { - 'height': arrowSize + 'px', - 'width': arrowSize + 'px', - 'transform': 'translate(' + this.arrowX_ + ',' + this.arrowY_ + ')' - }); - this.arrowIcon_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'dropdown-arrow.svg'); - block.getSvgRoot().appendChild(this.arrowIcon_); - Blockly.FieldIconMenu.superClass_.init.call(this, block); -}; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - * @const - */ -Blockly.FieldIconMenu.prototype.CURSOR = 'default'; - -/** -* Set the language-neutral value for this icon drop-down menu. - * @param {?string} newValue New value. - * @override - */ -Blockly.FieldIconMenu.prototype.setValue = function(newValue) { - if (newValue === null || newValue === this.value_) { - return; // No change - } - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.Change( - this.sourceBlock_, 'field', this.name, this.value_, newValue)); - } - this.value_ = newValue; - // Find the relevant icon in this.icons_ to get the image src. - this.setParentFieldImage(this.getSrcForValue(this.value_)); -}; - -/** -* Find the parent block's FieldImage and set its src. - * @param {?string} src New src for the parent block FieldImage. - * @private - */ -Blockly.FieldIconMenu.prototype.setParentFieldImage = function(src) { - // Only attempt if we have a set sourceBlock_ and parentBlock_ - // It's possible that this function could be called before - // a parent block is set; in that case, fail silently. - if (this.sourceBlock_ && this.sourceBlock_.parentBlock_) { - var parentBlock = this.sourceBlock_.parentBlock_; - // Loop through all inputs' fields to find the first FieldImage - for (var i = 0, input; input = parentBlock.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - if (field instanceof Blockly.FieldImage) { - // Src for a FieldImage is stored in its value. - field.setValue(src); - return; - } - } - } - } -}; - -/** - * Get the language-neutral value from this drop-down menu. - * @return {string} Current language-neutral value. - */ -Blockly.FieldIconMenu.prototype.getValue = function() { - return this.value_; -}; - -/** - * For a language-neutral value, get the src for the image that represents it. - * @param {string} value Language-neutral value to look up. - * @return {string} Src to image representing value - */ -Blockly.FieldIconMenu.prototype.getSrcForValue = function(value) { - for (var i = 0, icon; icon = this.icons_[i]; i++) { - if (icon.value === value) { - return icon.src; - } - } -}; - -/** - * Show the drop-down menu for editing this field. - * @private - */ -Blockly.FieldIconMenu.prototype.showEditor_ = function() { - // If there is an existing drop-down we own, this is a request to hide the drop-down. - if (Blockly.DropDownDiv.hideIfOwner(this)) { - return; - } - // If there is an existing drop-down someone else owns, hide it immediately and clear it. - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - // Populate the drop-down with the icons for this field. - var contentDiv = Blockly.DropDownDiv.getContentDiv(); - // Accessibility properties - contentDiv.setAttribute('role', 'menu'); - contentDiv.setAttribute('aria-haspopup', 'true'); - for (var i = 0, icon; icon = this.icons_[i]; i++) { - // Icons with the type property placeholder take up space but don't have any functionality - // Use for special-case layouts - if (icon.type == 'placeholder') { - var placeholder = document.createElement('span'); - placeholder.setAttribute('class', 'blocklyDropDownPlaceholder'); - placeholder.style.width = icon.width + 'px'; - placeholder.style.height = icon.height + 'px'; - contentDiv.appendChild(placeholder); - continue; - } - var button = document.createElement('button'); - button.setAttribute('id', ':' + i); // For aria-activedescendant - button.setAttribute('role', 'menuitem'); - button.setAttribute('class', 'blocklyDropDownButton'); - button.title = icon.alt; - button.style.width = icon.width + 'px'; - button.style.height = icon.height + 'px'; - var backgroundColor = this.sourceBlock_.getColour(); - if (icon.value == this.getValue()) { - // This icon is selected, show it in a different colour - backgroundColor = this.sourceBlock_.getColourTertiary(); - button.setAttribute('aria-selected', 'true'); - } - button.style.backgroundColor = backgroundColor; - button.style.borderColor = this.sourceBlock_.getColourTertiary(); - Blockly.bindEvent_(button, 'click', this, this.buttonClick_); - Blockly.bindEvent_(button, 'mouseup', this, this.buttonClick_); - // These are applied manually instead of using the :hover pseudoclass - // because Android has a bad long press "helper" menu and green highlight - // that we must prevent with ontouchstart preventDefault - Blockly.bindEvent_(button, 'mousedown', button, function(e) { - this.setAttribute('class', 'blocklyDropDownButton blocklyDropDownButtonHover'); - e.preventDefault(); - }); - Blockly.bindEvent_(button, 'mouseover', button, function() { - this.setAttribute('class', 'blocklyDropDownButton blocklyDropDownButtonHover'); - contentDiv.setAttribute('aria-activedescendant', this.id); - }); - Blockly.bindEvent_(button, 'mouseout', button, function() { - this.setAttribute('class', 'blocklyDropDownButton'); - contentDiv.removeAttribute('aria-activedescendant'); - }); - var buttonImg = document.createElement('img'); - buttonImg.src = icon.src; - //buttonImg.alt = icon.alt; - // Upon click/touch, we will be able to get the clicked element as e.target - // Store a data attribute on all possible click targets so we can match it to the icon. - button.setAttribute('data-value', icon.value); - buttonImg.setAttribute('data-value', icon.value); - button.appendChild(buttonImg); - contentDiv.appendChild(button); - } - contentDiv.style.width = Blockly.FieldIconMenu.DROPDOWN_WIDTH + 'px'; - - Blockly.DropDownDiv.setColour(this.sourceBlock_.getColour(), this.sourceBlock_.getColourTertiary()); - Blockly.DropDownDiv.setCategory(this.sourceBlock_.parentBlock_.getCategory()); - - // Update source block colour to look selected - this.savedPrimary_ = this.sourceBlock_.getColour(); - this.sourceBlock_.setColour(this.sourceBlock_.getColourSecondary(), - this.sourceBlock_.getColourSecondary(), - this.sourceBlock_.getColourTertiary()); - - var scale = this.sourceBlock_.workspace.scale; - // Offset for icon-type horizontal blocks. - var secondaryYOffset = ( - -(Blockly.BlockSvg.MIN_BLOCK_Y * scale) - (Blockly.BlockSvg.FIELD_Y_OFFSET * scale) - ); - var renderedPrimary = Blockly.DropDownDiv.showPositionedByBlock( - this, this.sourceBlock_, this.onHide_.bind(this), secondaryYOffset); - if (!renderedPrimary) { - // Adjust for rotation - var arrowX = this.arrowX_ + Blockly.DropDownDiv.ARROW_SIZE / 1.5 + 1; - var arrowY = this.arrowY_ + Blockly.DropDownDiv.ARROW_SIZE / 1.5; - // Flip the arrow on the button - this.arrowIcon_.setAttribute('transform', - 'translate(' + arrowX + ',' + arrowY + ') rotate(180)');} -}; - -/** - * Callback for when a button is clicked inside the drop-down. - * Should be bound to the FieldIconMenu. - * @param {Event} e DOM event for the click/touch - * @private - */ -Blockly.FieldIconMenu.prototype.buttonClick_ = function(e) { - var value = e.target.getAttribute('data-value'); - this.setValue(value); - Blockly.DropDownDiv.hide(); -}; - -/** - * Callback for when the drop-down is hidden. - */ -Blockly.FieldIconMenu.prototype.onHide_ = function() { - // Reset the button colour and clear accessibility properties - // Only attempt to do this reset if sourceBlock_ is not disposed. - // It could become disposed before an onHide_, for example, - // when a block is dragged from the flyout. - if (this.sourceBlock_) { - this.sourceBlock_.setColour(this.savedPrimary_, - this.sourceBlock_.getColourSecondary(), - this.sourceBlock_.getColourTertiary()); - } - Blockly.DropDownDiv.content_.removeAttribute('role'); - Blockly.DropDownDiv.content_.removeAttribute('aria-haspopup'); - Blockly.DropDownDiv.content_.removeAttribute('aria-activedescendant'); - // Unflip the arrow if appropriate - this.arrowIcon_.setAttribute('transform', 'translate(' + this.arrowX_ + ',' + this.arrowY_ + ')'); -}; - -Blockly.Field.register('field_iconmenu', Blockly.FieldIconMenu); diff --git a/packages/scratch-blocks/core/field_image.js b/packages/scratch-blocks/core/field_image.js deleted file mode 100644 index 57fcf30ef..000000000 --- a/packages/scratch-blocks/core/field_image.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Image field. Used for pictures, icons, etc. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldImage'); - -goog.require('Blockly.Field'); -goog.require('goog.dom'); -goog.require('goog.math.Size'); -goog.require('goog.userAgent'); - - -/** - * Class for an image on a block. - * @param {string} src The URL of the image. - * @param {number} width Width of the image. - * @param {number} height Height of the image. - * @param {string=} opt_alt Optional alt text for when block is collapsed. - * @param {boolean} flip_rtl Whether to flip the icon in RTL - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldImage = function(src, width, height, opt_alt, flip_rtl) { - this.sourceBlock_ = null; - - // Ensure height and width are numbers. Strings are bad at math. - this.height_ = Number(height); - this.width_ = Number(width); - this.size_ = new goog.math.Size(this.width_, this.height_); - this.text_ = opt_alt || ''; - this.flipRTL_ = flip_rtl; - this.setValue(src); -}; -goog.inherits(Blockly.FieldImage, Blockly.Field); - -/** - * Construct a FieldImage from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (src, width, height, alt, - * and flipRtl/flip_rtl). - * @returns {!Blockly.FieldImage} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldImage.fromJson = function(options) { - var src = Blockly.utils.replaceMessageReferences(options['src']); - var width = Number(Blockly.utils.replaceMessageReferences(options['width'])); - var height = - Number(Blockly.utils.replaceMessageReferences(options['height'])); - var alt = Blockly.utils.replaceMessageReferences(options['alt']); - var flip_rtl = !!options['flip_rtl'] || !!options['flipRtl']; - return new Blockly.FieldImage(src, width, height, alt, flip_rtl); -}; - -/** - * Editable fields are saved by the XML renderer, non-editable fields are not. - */ -Blockly.FieldImage.prototype.EDITABLE = false; - -/** - * Install this image on a block. - */ -Blockly.FieldImage.prototype.init = function() { - if (this.fieldGroup_) { - // Image has already been initialized once. - return; - } - // Build the DOM. - /** @type {SVGElement} */ - this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null); - if (!this.visible_) { - this.fieldGroup_.style.display = 'none'; - } - /** @type {SVGElement} */ - this.imageElement_ = Blockly.utils.createSvgElement( - 'image', - { - 'height': this.height_ + 'px', - 'width': this.width_ + 'px' - }, - this.fieldGroup_); - this.setValue(this.src_); - this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); - - // Configure the field to be transparent with respect to tooltips. - this.setTooltip(this.sourceBlock_); - Blockly.Tooltip.bindMouseEvents(this.imageElement_); -}; - -/** - * Dispose of all DOM objects belonging to this text. - */ -Blockly.FieldImage.prototype.dispose = function() { - goog.dom.removeNode(this.fieldGroup_); - this.fieldGroup_ = null; - this.imageElement_ = null; -}; - -/** - * Change the tooltip text for this field. - * @param {string|!Element} newTip Text for tooltip or a parent element to - * link to for its tooltip. - */ -Blockly.FieldImage.prototype.setTooltip = function(newTip) { - this.imageElement_.tooltip = newTip; -}; - -/** - * Get the source URL of this image. - * @return {string} Current text. - * @override - */ -Blockly.FieldImage.prototype.getValue = function() { - return this.src_; -}; - -/** - * Set the source URL of this image. - * @param {?string} src New source. - * @override - */ -Blockly.FieldImage.prototype.setValue = function(src) { - if (src === null) { - // No change if null. - return; - } - this.src_ = src; - if (this.imageElement_) { - this.imageElement_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', src || ''); - } -}; - -/** - * Get whether to flip this image in RTL - * @return {boolean} True if we should flip in RTL. - */ -Blockly.FieldImage.prototype.getFlipRTL = function() { - return this.flipRTL_; -}; - -/** - * Set the alt text of this image. - * @param {?string} alt New alt text. - * @override - */ -Blockly.FieldImage.prototype.setText = function(alt) { - if (alt === null) { - // No change if null. - return; - } - this.text_ = alt; -}; - -/** - * Images are fixed width, no need to render. - * @private - */ -Blockly.FieldImage.prototype.render_ = function() { - // NOP -}; - -/** - * Images are fixed width, no need to update. - * @private - */ -Blockly.FieldImage.prototype.updateWidth = function() { - // NOP -}; - -Blockly.Field.register('field_image', Blockly.FieldImage); diff --git a/packages/scratch-blocks/core/field_label.js b/packages/scratch-blocks/core/field_label.js deleted file mode 100644 index 1565b6636..000000000 --- a/packages/scratch-blocks/core/field_label.js +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Non-editable text field. Used for titles, labels, etc. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldLabel'); - -goog.require('Blockly.Field'); -goog.require('Blockly.Tooltip'); -goog.require('goog.dom'); -goog.require('goog.math.Size'); -goog.require('goog.userAgent'); - - -/** - * Class for a non-editable field. - * @param {string} text The initial content of the field. - * @param {string=} opt_class Optional CSS class for the field's text. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldLabel = function(text, opt_class) { - this.size_ = new goog.math.Size(0, 0); - this.class_ = opt_class; - this.setValue(text); -}; -goog.inherits(Blockly.FieldLabel, Blockly.Field); - -/** - * Construct a FieldLabel from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (text, and class). - * @returns {!Blockly.FieldLabel} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldLabel.fromJson = function(options) { - var text = Blockly.utils.replaceMessageReferences(options['text']); - return new Blockly.FieldLabel(text, options['class']); -}; - -/** - * Editable fields usually show some sort of UI for the user to change them. - * @type {boolean} - * @public - */ -Blockly.FieldLabel.prototype.EDITABLE = false; - -/** - * Serializable fields are saved by the XML renderer, non-serializable fields - * are not. Editable fields should be serialized. - * @type {boolean} - * @public - */ -Blockly.FieldLabel.prototype.SERIALIZABLE = false; - -/** - * Install this text on a block. - */ -Blockly.FieldLabel.prototype.init = function() { - if (this.textElement_) { - // Text has already been initialized once. - return; - } - // Build the DOM. - this.textElement_ = Blockly.utils.createSvgElement('text', - { - 'class': 'blocklyText', - 'y': Blockly.BlockSvg.FIELD_TOP_PADDING, - 'text-anchor': 'middle', - 'dominant-baseline': 'middle', - 'dy': goog.userAgent.EDGE_OR_IE ? Blockly.Field.IE_TEXT_OFFSET : '0' - }, null); - if (this.class_) { - Blockly.utils.addClass(this.textElement_, this.class_); - } - if (!this.visible_) { - this.textElement_.style.display = 'none'; - } - this.sourceBlock_.getSvgRoot().appendChild(this.textElement_); - - // Configure the field to be transparent with respect to tooltips. - this.textElement_.tooltip = this.sourceBlock_; - Blockly.Tooltip.bindMouseEvents(this.textElement_); - // Force a render. - this.render_(); -}; - -/** - * Dispose of all DOM objects belonging to this text. - */ -Blockly.FieldLabel.prototype.dispose = function() { - goog.dom.removeNode(this.textElement_); - this.textElement_ = null; -}; - -/** - * Gets the group element for this field. - * Used for measuring the size and for positioning. - * @return {!Element} The group element. - */ -Blockly.FieldLabel.prototype.getSvgRoot = function() { - return /** @type {!Element} */ (this.textElement_); -}; - -/** - * Change the tooltip text for this field. - * @param {string|!Element} newTip Text for tooltip or a parent element to - * link to for its tooltip. - */ -Blockly.FieldLabel.prototype.setTooltip = function(newTip) { - this.textElement_.tooltip = newTip; -}; - -Blockly.Field.register('field_label', Blockly.FieldLabel); diff --git a/packages/scratch-blocks/core/field_label_serializable.js b/packages/scratch-blocks/core/field_label_serializable.js deleted file mode 100644 index 3b468fd80..000000000 --- a/packages/scratch-blocks/core/field_label_serializable.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Serialized label field. Behaves like a normal label but is - * always serialized to XML. It may only be edited programmatically. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.FieldLabelSerializable'); - -goog.require('Blockly.FieldLabel'); - - -/** - * Class for a variable getter field. - * @param {string} text The initial content of the field. - * @param {string} opt_class Optional CSS class for the field's text. - * @extends {Blockly.FieldLabel} - * @constructor - * - */ -Blockly.FieldLabelSerializable = function(text, opt_class) { - Blockly.FieldLabelSerializable.superClass_.constructor.call(this, text, - opt_class); - // Used in base field rendering, but we don't need it. - this.arrowWidth_ = 0; -}; -goog.inherits(Blockly.FieldLabelSerializable, Blockly.FieldLabel); - -/** - * Construct a FieldLabelSerializable from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (text, and class). - * @returns {!Blockly.FieldLabelSerializable} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldLabelSerializable.fromJson = function(options) { - var text = Blockly.utils.replaceMessageReferences(options['text']); - return new Blockly.FieldLabelSerializable(text, options['class']); -}; - -/** - * Editable fields usually show some sort of UI for the user to change them. - * This field should be serialized, but only edited programmatically. - * @type {boolean} - * @public - */ -Blockly.FieldLabelSerializable.prototype.EDITABLE = false; - -/** - * Serializable fields are saved by the XML renderer, non-serializable fields - * are not. This field should be serialized, but only edited programmatically. - * @type {boolean} - * @public - */ -Blockly.FieldLabelSerializable.prototype.SERIALIZABLE = true; - -/** - * Updates the width of the field. This calls getCachedWidth which won't cache - * the approximated width on IE/Edge when `getComputedTextLength` fails. Once - * it eventually does succeed, the result will be cached. - **/ -Blockly.FieldLabelSerializable.prototype.updateWidth = function() { - // Set width of the field. - // Unlike the base Field class, this doesn't add space to editable fields. - this.size_.width = Blockly.Field.getCachedWidth(this.textElement_); -}; - -/** - * Draws the border with the correct width. - * Saves the computed width in a property. - * @private - */ -Blockly.FieldLabelSerializable.prototype.render_ = function() { - if (this.visible_ && this.textElement_) { - // Replace the text. - goog.dom.removeChildren(/** @type {!Element} */ (this.textElement_)); - var textNode = document.createTextNode(this.getDisplayText_()); - this.textElement_.appendChild(textNode); - this.updateWidth(); - - // Update text centering, based on newly calculated width. - var centerTextX = this.size_.width / 2; - - // If half the text length is not at least center of - // visible field (FIELD_WIDTH), center it there instead. - var minOffset = Blockly.BlockSvg.FIELD_WIDTH / 2; - if (this.sourceBlock_.RTL) { - // X position starts at the left edge of the block, in both RTL and LTR. - // First offset by the width of the block to move to the right edge, - // and then subtract to move to the same position as LTR. - var minCenter = this.size_.width - minOffset; - centerTextX = Math.min(minCenter, centerTextX); - } else { - // (width / 2) should exceed Blockly.BlockSvg.FIELD_WIDTH / 2 - // if the text is longer. - centerTextX = Math.max(minOffset, centerTextX); - } - // Apply new text element x position. - this.textElement_.setAttribute('x', centerTextX); - } -}; - -Blockly.Field.register( - 'field_label_serializable', Blockly.FieldLabelSerializable); diff --git a/packages/scratch-blocks/core/field_matrix.js b/packages/scratch-blocks/core/field_matrix.js deleted file mode 100644 index e8410e30b..000000000 --- a/packages/scratch-blocks/core/field_matrix.js +++ /dev/null @@ -1,566 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview 5x5 matrix input field. - * Displays an editable 5x5 matrix for controlling LED arrays. - * @author khanning@gmail.com (Kreg Hanning) - */ -'use strict'; - -goog.provide('Blockly.FieldMatrix'); - -goog.require('Blockly.DropDownDiv'); - -/** - * Class for a matrix field. - * @param {number} matrix The default matrix value represented by a 25-bit integer. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldMatrix = function(matrix) { - Blockly.FieldMatrix.superClass_.constructor.call(this, matrix); - this.addArgType('matrix'); - /** - * Array of SVGElement for matrix thumbnail image on block field. - * @type {!Array} - * @private - */ - this.ledThumbNodes_ = []; - /** - * Array of SVGElement for matrix editor in dropdown menu. - * @type {!Array} - * @private - */ - this.ledButtons_ = []; - /** - * String for storing current matrix value. - * @type {!String] - * @private - */ - this.matrix_ = ''; - /** - * SVGElement for LED matrix in editor. - * @type {?SVGElement} - * @private - */ - this.matrixStage_ = null; - /** - * SVG image for dropdown arrow. - * @type {?SVGElement} - * @private - */ - this.arrow_ = null; - /** - * String indicating matrix paint style. - * value can be [null, 'fill', 'clear']. - * @type {?String} - * @private - */ - this.paintStyle_ = null; - /** - * Touch event wrapper. - * Runs when the field is selected. - * @type {!Array} - * @private - */ - this.mouseDownWrapper_ = null; - /** - * Touch event wrapper. - * Runs when the clear button editor button is selected. - * @type {!Array} - * @private - */ - this.clearButtonWrapper_ = null; - /** - * Touch event wrapper. - * Runs when the fill button editor button is selected. - * @type {!Array} - * @private - */ - this.fillButtonWrapper_ = null; - /** - * Touch event wrapper. - * Runs when the matrix editor is touched. - * @type {!Array} - * @private - */ - this.matrixTouchWrapper_ = null; - /** - * Touch event wrapper. - * Runs when the matrix editor touch event moves. - * @type {!Array} - * @private - */ - this.matrixMoveWrapper_ = null; - /** - * Touch event wrapper. - * Runs when the matrix editor is released. - * @type {!Array} - * @private - */ - this.matrixReleaseWrapper_ = null; -}; -goog.inherits(Blockly.FieldMatrix, Blockly.Field); - -/** - * Construct a FieldMatrix from a JSON arg object. - * @param {!Object} options A JSON object with options (matrix). - * @returns {!Blockly.FieldMatrix} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldMatrix.fromJson = function(options) { - return new Blockly.FieldMatrix(options['matrix']); -}; - -/** - * Fixed size of the matrix thumbnail in the input field, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.THUMBNAIL_SIZE = 26; - -/** - * Fixed size of each matrix thumbnail node, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.THUMBNAIL_NODE_SIZE = 4; - -/** - * Fixed size of each matrix thumbnail node, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.THUMBNAIL_NODE_PAD = 1; - -/** - * Fixed size of arrow icon in drop down menu, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.ARROW_SIZE = 12; - -/** - * Fixed size of each button inside the 5x5 matrix, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.MATRIX_NODE_SIZE = 18; - -/** - * Fixed corner radius for 5x5 matrix buttons, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.MATRIX_NODE_RADIUS = 4; - -/** - * Fixed padding for 5x5 matrix buttons, in px. - * @type {number} - * @const - */ -Blockly.FieldMatrix.MATRIX_NODE_PAD = 5; - -/** - * String with 25 '0' chars. - * Used for clearing a matrix or filling an LED node array. - * @type {string} - * @const - */ -Blockly.FieldMatrix.ZEROS = '0000000000000000000000000'; - -/** - * String with 25 '1' chars. - * Used for filling a matrix. - * @type {string} - * @const - */ -Blockly.FieldMatrix.ONES = '1111111111111111111111111'; - -/** - * Called when the field is placed on a block. - * @param {Block} block The owning block. - */ -Blockly.FieldMatrix.prototype.init = function() { - if (this.fieldGroup_) { - // Matrix menu has already been initialized once. - return; - } - - // Build the DOM. - this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null); - this.size_.width = Blockly.FieldMatrix.THUMBNAIL_SIZE + - Blockly.FieldMatrix.ARROW_SIZE + (Blockly.BlockSvg.DROPDOWN_ARROW_PADDING * 1.5); - - this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); - - var thumbX = Blockly.BlockSvg.DROPDOWN_ARROW_PADDING / 2; - var thumbY = (this.size_.height - Blockly.FieldMatrix.THUMBNAIL_SIZE) / 2; - var thumbnail = Blockly.utils.createSvgElement('g', { - 'transform': 'translate(' + thumbX + ', ' + thumbY + ')', - 'pointer-events': 'bounding-box', 'cursor': 'pointer' - }, this.fieldGroup_); - this.ledThumbNodes_ = []; - var nodeSize = Blockly.FieldMatrix.THUMBNAIL_NODE_SIZE; - var nodePad = Blockly.FieldMatrix.THUMBNAIL_NODE_PAD; - for (var i = 0; i < 5; i++) { - for (var n = 0; n < 5; n++) { - var attr = { - 'x': ((nodeSize + nodePad) * n) + nodePad, - 'y': ((nodeSize + nodePad) * i) + nodePad, - 'width': nodeSize, 'height': nodeSize, - 'rx': nodePad, 'ry': nodePad - }; - this.ledThumbNodes_.push( - Blockly.utils.createSvgElement('rect', attr, thumbnail) - ); - } - thumbnail.style.cursor = 'default'; - this.updateMatrix_(); - } - - if (!this.arrow_) { - var arrowX = Blockly.FieldMatrix.THUMBNAIL_SIZE + - Blockly.BlockSvg.DROPDOWN_ARROW_PADDING * 1.5; - var arrowY = (this.size_.height - Blockly.FieldMatrix.ARROW_SIZE) / 2; - this.arrow_ = Blockly.utils.createSvgElement('image', { - 'height': Blockly.FieldMatrix.ARROW_SIZE + 'px', - 'width': Blockly.FieldMatrix.ARROW_SIZE + 'px', - 'transform': 'translate(' + arrowX + ', ' + arrowY + ')' - }, this.fieldGroup_); - this.arrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + - 'dropdown-arrow.svg'); - this.arrow_.style.cursor = 'default'; - } - - this.mouseDownWrapper_ = Blockly.bindEventWithChecks_( - this.getClickTarget_(), 'mousedown', this, this.onMouseDown_); -}; - -/** - * Set the value for this matrix menu. - * @param {string} matrix The new matrix value represented by a 25-bit integer. - * @override - */ -Blockly.FieldMatrix.prototype.setValue = function(matrix) { - if (!matrix || matrix === this.matrix_) { - return; // No change - } - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.Change( - this.sourceBlock_, 'field', this.name, this.matrix_, matrix)); - } - matrix = matrix + Blockly.FieldMatrix.ZEROS.substr(0, 25 - matrix.length); - this.matrix_ = matrix; - this.updateMatrix_(); -}; - -/** - * Get the value from this matrix menu. - * @return {string} Current matrix value. - */ -Blockly.FieldMatrix.prototype.getValue = function() { - return String(this.matrix_); -}; - -/** - * Show the drop-down menu for editing this field. - * @private - */ -Blockly.FieldMatrix.prototype.showEditor_ = function() { - // If there is an existing drop-down someone else owns, hide it immediately and clear it. - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - var div = Blockly.DropDownDiv.getContentDiv(); - // Build the SVG DOM. - var matrixSize = (Blockly.FieldMatrix.MATRIX_NODE_SIZE * 5) + - (Blockly.FieldMatrix.MATRIX_NODE_PAD * 6); - this.matrixStage_ = Blockly.utils.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'height': matrixSize + 'px', - 'width': matrixSize + 'px' - }, div); - // Create the 5x5 matrix - this.ledButtons_ = []; - for (var i = 0; i < 5; i++) { - for (var n = 0; n < 5; n++) { - var x = (Blockly.FieldMatrix.MATRIX_NODE_SIZE * n) + - (Blockly.FieldMatrix.MATRIX_NODE_PAD * (n + 1)); - var y = (Blockly.FieldMatrix.MATRIX_NODE_SIZE * i) + - (Blockly.FieldMatrix.MATRIX_NODE_PAD * (i + 1)); - var attr = { - 'x': x + 'px', 'y': y + 'px', - 'width': Blockly.FieldMatrix.MATRIX_NODE_SIZE, - 'height': Blockly.FieldMatrix.MATRIX_NODE_SIZE, - 'rx': Blockly.FieldMatrix.MATRIX_NODE_RADIUS, - 'ry': Blockly.FieldMatrix.MATRIX_NODE_RADIUS - }; - var led = Blockly.utils.createSvgElement('rect', attr, this.matrixStage_); - this.matrixStage_.appendChild(led); - this.ledButtons_.push(led); - } - } - // Div for lower button menu - var buttonDiv = document.createElement('div'); - // Button to clear matrix - var clearButtonDiv = document.createElement('div'); - clearButtonDiv.className = 'scratchMatrixButtonDiv'; - var clearButton = this.createButton_(this.sourceBlock_.colourSecondary_); - clearButtonDiv.appendChild(clearButton); - // Button to fill matrix - var fillButtonDiv = document.createElement('div'); - fillButtonDiv.className = 'scratchMatrixButtonDiv'; - var fillButton = this.createButton_('#FFFFFF'); - fillButtonDiv.appendChild(fillButton); - - buttonDiv.appendChild(clearButtonDiv); - buttonDiv.appendChild(fillButtonDiv); - div.appendChild(buttonDiv); - - Blockly.DropDownDiv.setColour(this.sourceBlock_.getColour(), - this.sourceBlock_.getColourTertiary()); - Blockly.DropDownDiv.setCategory(this.sourceBlock_.getCategory()); - Blockly.DropDownDiv.showPositionedByBlock(this, this.sourceBlock_); - - this.matrixTouchWrapper_ = - Blockly.bindEvent_(this.matrixStage_, 'mousedown', this, this.onMouseDown); - this.clearButtonWrapper_ = - Blockly.bindEvent_(clearButton, 'click', this, this.clearMatrix_); - this.fillButtonWrapper_ = - Blockly.bindEvent_(fillButton, 'click', this, this.fillMatrix_); - - // Update the matrix for the current value - this.updateMatrix_(); - -}; - -this.nodeCallback_ = function(e, num) { - console.log(num); -}; - -/** - * Make an svg object that resembles a 3x3 matrix to be used as a button. - * @param {string} fill The color to fill the matrix nodes. - * @return {SvgElement} The button svg element. - */ -Blockly.FieldMatrix.prototype.createButton_ = function(fill) { - var button = Blockly.utils.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'height': Blockly.FieldMatrix.MATRIX_NODE_SIZE + 'px', - 'width': Blockly.FieldMatrix.MATRIX_NODE_SIZE + 'px' - }); - var nodeSize = Blockly.FieldMatrix.MATRIX_NODE_SIZE / 4; - var nodePad = Blockly.FieldMatrix.MATRIX_NODE_SIZE / 16; - for (var i = 0; i < 3; i++) { - for (var n = 0; n < 3; n++) { - Blockly.utils.createSvgElement('rect', { - 'x': ((nodeSize + nodePad) * n) + nodePad, - 'y': ((nodeSize + nodePad) * i) + nodePad, - 'width': nodeSize, 'height': nodeSize, - 'rx': nodePad, 'ry': nodePad, - 'fill': fill - }, button); - } - } - return button; -}; - -/** - * Redraw the matrix with the current value. - * @private - */ -Blockly.FieldMatrix.prototype.updateMatrix_ = function() { - for (var i = 0; i < this.matrix_.length; i++) { - if (this.matrix_[i] === '0') { - this.fillMatrixNode_(this.ledButtons_, i, this.sourceBlock_.colourSecondary_); - this.fillMatrixNode_(this.ledThumbNodes_, i, this.sourceBlock_.colour_); - } else { - this.fillMatrixNode_(this.ledButtons_, i, '#FFFFFF'); - this.fillMatrixNode_(this.ledThumbNodes_, i, '#FFFFFF'); - } - } -}; - -/** - * Clear the matrix. - * @param {!Event} e Mouse event. - */ -Blockly.FieldMatrix.prototype.clearMatrix_ = function(e) { - if (e.button != 0) return; - this.setValue(Blockly.FieldMatrix.ZEROS); -}; - -/** - * Fill the matrix. - * @param {!Event} e Mouse event. - */ -Blockly.FieldMatrix.prototype.fillMatrix_ = function(e) { - if (e.button != 0) return; - this.setValue(Blockly.FieldMatrix.ONES); -}; - -/** - * Fill matrix node with specified colour. - * @param {!Array} node The array of matrix nodes. - * @param {!number} index The index of the matrix node. - * @param {!string} fill The fill colour in '#rrggbb' format. - */ -Blockly.FieldMatrix.prototype.fillMatrixNode_ = function(node, index, fill) { - if (!node || !node[index] || !fill) return; - node[index].setAttribute('fill', fill); -}; - -Blockly.FieldMatrix.prototype.setLEDNode_ = function(led, state) { - if (led < 0 || led > 24) return; - var matrix = this.matrix_.substr(0, led) + state + this.matrix_.substr(led + 1); - this.setValue(matrix); -}; - -Blockly.FieldMatrix.prototype.fillLEDNode_ = function(led) { - if (led < 0 || led > 24) return; - this.setLEDNode_(led, '1'); -}; - -Blockly.FieldMatrix.prototype.clearLEDNode_ = function(led) { - if (led < 0 || led > 24) return; - this.setLEDNode_(led, '0'); -}; - -Blockly.FieldMatrix.prototype.toggleLEDNode_ = function(led) { - if (led < 0 || led > 24) return; - if (this.matrix_.charAt(led) === '0') { - this.setLEDNode_(led, '1'); - } else { - this.setLEDNode_(led, '0'); - } -}; - -/** - * Toggle matrix nodes on and off. - * @param {!Event} e Mouse event. - */ -Blockly.FieldMatrix.prototype.onMouseDown = function(e) { - this.matrixMoveWrapper_ = - Blockly.bindEvent_(document.body, 'mousemove', this, this.onMouseMove); - this.matrixReleaseWrapper_ = - Blockly.bindEvent_(document.body, 'mouseup', this, this.onMouseUp); - var ledHit = this.checkForLED_(e); - if (ledHit > -1) { - if (this.matrix_.charAt(ledHit) === '0') { - this.paintStyle_ = 'fill'; - } else { - this.paintStyle_ = 'clear'; - } - this.toggleLEDNode_(ledHit); - this.updateMatrix_(); - } else { - this.paintStyle_ = null; - } -}; - -/** - * Unbind mouse move event and clear the paint style. - * @param {!Event} e Mouse move event. - */ -Blockly.FieldMatrix.prototype.onMouseUp = function() { - Blockly.unbindEvent_(this.matrixMoveWrapper_); - Blockly.unbindEvent_(this.matrixReleaseWrapper_); - this.paintStyle_ = null; -}; - -/** - * Toggle matrix nodes on and off by dragging mouse. - * @param {!Event} e Mouse move event. - */ -Blockly.FieldMatrix.prototype.onMouseMove = function(e) { - e.preventDefault(); - if (this.paintStyle_) { - var led = this.checkForLED_(e); - if (led < 0) return; - if (this.paintStyle_ === 'clear') { - this.clearLEDNode_(led); - } else if (this.paintStyle_ === 'fill') { - this.fillLEDNode_(led); - } - } -}; - -/** - * Check if mouse coordinates collide with a matrix node. - * @param {!Event} e Mouse move event. - * @return {number} The matching matrix node or -1 for none. - */ -Blockly.FieldMatrix.prototype.checkForLED_ = function(e) { - var bBox = this.matrixStage_.getBoundingClientRect(); - var nodeSize = Blockly.FieldMatrix.MATRIX_NODE_SIZE; - var nodePad = Blockly.FieldMatrix.MATRIX_NODE_PAD; - var dx = e.clientX - bBox.left; - var dy = e.clientY - bBox.top; - var min = nodePad / 2; - var max = bBox.width - (nodePad / 2); - if (dx < min || dx > max || dy < min || dy > max) { - return -1; - } - var xDiv = Math.trunc((dx - nodePad / 2) / (nodeSize + nodePad)); - var yDiv = Math.trunc((dy - nodePad / 2) / (nodeSize + nodePad)); - return xDiv + (yDiv * nodePad); -}; - -/** - * Clean up this FieldMatrix, as well as the inherited Field. - * @return {!Function} Closure to call on destruction of the WidgetDiv. - * @private - */ -Blockly.FieldMatrix.prototype.dispose_ = function() { - var thisField = this; - return function() { - Blockly.FieldMatrix.superClass_.dispose_.call(thisField)(); - thisField.matrixStage_ = null; - if (thisField.mouseDownWrapper_) { - Blockly.unbindEvent_(thisField.mouseDownWrapper_); - } - if (thisField.matrixTouchWrapper_) { - Blockly.unbindEvent_(thisField.matrixTouchWrapper_); - } - if (thisField.matrixReleaseWrapper_) { - Blockly.unbindEvent_(thisField.matrixReleaseWrapper_); - } - if (thisField.matrixMoveWrapper_) { - Blockly.unbindEvent_(thisField.matrixMoveWrapper_); - } - if (thisField.clearButtonWrapper_) { - Blockly.unbindEvent_(thisField.clearButtonWrapper_); - } - if (thisField.fillButtonWrapper_) { - Blockly.unbindEvent_(thisField.fillButtonWrapper_); - } - }; -}; - -Blockly.Field.register('field_matrix', Blockly.FieldMatrix); diff --git a/packages/scratch-blocks/core/field_note.js b/packages/scratch-blocks/core/field_note.js deleted file mode 100644 index c3928062d..000000000 --- a/packages/scratch-blocks/core/field_note.js +++ /dev/null @@ -1,850 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Note input field, for selecting a musical note on a piano. - * @author ericr@media.mit.edu (Eric Rosenbaum) - */ -'use strict'; - -goog.provide('Blockly.FieldNote'); - -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.FieldTextInput'); -goog.require('goog.math'); -goog.require('goog.userAgent'); - -/** - * Class for a note input field, for selecting a musical note on a piano. - * @param {(string|number)=} opt_value The initial content of the field. The - * value should cast to a number, and if it does not, '0' will be used. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns the accepted text or null to abort - * the change. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldNote = function(opt_value, opt_validator) { - opt_value = (opt_value && !isNaN(opt_value)) ? String(opt_value) : '0'; - Blockly.FieldNote.superClass_.constructor.call( - this, opt_value, opt_validator); - this.addArgType('note'); - - /** - * Width of the field. Computed when drawing it, and used for animation. - * @type {number} - * @private - */ - this.fieldEditorWidth_ = 0; - - /** - * Height of the field. Computed when drawing it. - * @type {number} - * @private - */ - this.fieldEditorHeight_ = 0; - - /** - * The piano SVG. - * @type {SVGElement} - * @private - */ - this.pianoSVG_ = null; - - /** - * Array of SVG elements representing the clickable piano keys. - * @type {!Array} - * @private - */ - this.keySVGs_ = []; - - /** - * Note name indicator at the top of the field. - * @type {SVGElement} - * @private - */ - this.noteNameText_ = null; - - /** - * Note name indicator on the low C key. - * @type {SVGElement} - * @private - */ - this.lowCText_ = null; - - /** - * Note name indicator on the low C key. - * @type {SVGElement} - * @private - */ - this.highCText_ = null; - - /** - * Octave number of the currently displayed range of keys. - * @type {number} - * @private - */ - this.displayedOctave_ = null; - - /** - * Current animation position of the piano SVG, as it shifts left or right to - * change octaves. - * @type {number} - * @private - */ - this.animationPos_ = 0; - - /** - * Target position for the animation as the piano SVG shifts left or right. - * @type {number} - * @private - */ - this.animationTarget_ = 0; - - /** - * A flag indicating that the mouse is currently down. Used in combination with - * mouse enter events to update the key selection while dragging. - * @type {boolean} - * @private - */ - this.mouseIsDown_ = false; - - /** - * An array of wrappers for mouse down events on piano keys. - * @type {!Array.} - * @private - */ - this.mouseDownWrappers_ = []; - - /** - * A wrapper for the mouse up event. - * @type {!Array.} - * @private - */ - this.mouseUpWrapper_ = null; - - /** - * An array of wrappers for mouse enter events on piano keys. - * @type {!Array.} - * @private - */ - this.mouseEnterWrappers_ = []; - - /** - * A wrapper for the mouse down event on the octave down button. - * @type {!Array.} - * @private - */ - this.octaveDownMouseDownWrapper_ = null; - - /** - * A wrapper for the mouse down event on the octave up button. - * @type {!Array.} - * @private - */ - this.octaveUpMouseDownWrapper_ = null; -}; -goog.inherits(Blockly.FieldNote, Blockly.FieldTextInput); - -/** - * Inset in pixels of content displayed in the field, caused by parent properties. - * The inset is actually determined by the CSS property blocklyDropDownDiv- it is - * the sum of the padding and border thickness. - */ -Blockly.FieldNote.INSET = 5; - -/** - * Height of the top area of the field, in px. - * @type {number} - * @const - */ -Blockly.FieldNote.TOP_MENU_HEIGHT = 32 - Blockly.FieldNote.INSET; - -/** - * Padding on the top and sides of the field, in px. - * @type {number} - * @const - */ -Blockly.FieldNote.EDGE_PADDING = 1; - -/** - * Height of the drop shadow on the piano, in px. - * @type {number} - * @const - */ -Blockly.FieldNote.SHADOW_HEIGHT = 4; - -/** - * Color for the shadow on the piano. - * @type {string} - * @const - */ -Blockly.FieldNote.SHADOW_COLOR = '#000'; - -/** - * Opacity for the shadow on the piano. - * @type {string} - * @const - */ -Blockly.FieldNote.SHADOW_OPACITY = .2; - -/** - * A color for the white piano keys. - * @type {string} - * @const - */ -Blockly.FieldNote.WHITE_KEY_COLOR = '#FFFFFF'; - -/** - * A color for the black piano keys. - * @type {string} - * @const - */ -Blockly.FieldNote.BLACK_KEY_COLOR = '#323133'; - -/** - * A color for stroke around black piano keys. - * @type {string} - * @const - */ -Blockly.FieldNote.BLACK_KEY_STROKE = '#555555'; - -/** - * A color for the selected state of a piano key. - * @type {string} - * @const - */ -Blockly.FieldNote.KEY_SELECTED_COLOR = '#b0d6ff'; - -/** - * The number of white keys in one octave on the piano. - * @type {number} - * @const - */ -Blockly.FieldNote.NUM_WHITE_KEYS = 8; - -/** - * Height of a white piano key, in px. - * @type {string} - * @const - */ -Blockly.FieldNote.WHITE_KEY_HEIGHT = 72; - -/** - * Width of a white piano key, in px. - * @type {string} - * @const - */ -Blockly.FieldNote.WHITE_KEY_WIDTH = 40; - -/** - * Height of a black piano key, in px. - * @type {string} - * @const - */ -Blockly.FieldNote.BLACK_KEY_HEIGHT = 40; - -/** - * Width of a black piano key, in px. - * @type {string} - * @const - */ -Blockly.FieldNote.BLACK_KEY_WIDTH = 32; - -/** - * Radius of the curved bottom corner of a piano key, in px. - * @type {string} - * @const - */ -Blockly.FieldNote.KEY_RADIUS = 6; - -/** - * Bottom padding for the labels on C keys. - * @type {string} - * @const - */ -Blockly.FieldNote.KEY_LABEL_PADDING = 8; - -/** - * An array of objects with data describing the keys on the piano. - * @type {Array.<{name: String, pitch: Number, isBlack: boolean}>} - * @const - */ -Blockly.FieldNote.KEY_INFO = [ - {name: 'C', pitch: 0}, - {name: 'C♯', pitch: 1, isBlack: true}, - {name: 'D', pitch: 2}, - {name: 'E♭', pitch: 3, isBlack: true}, - {name: 'E', pitch: 4}, - {name: 'F', pitch: 5}, - {name: 'F♯', pitch: 6, isBlack: true}, - {name: 'G', pitch: 7}, - {name: 'G♯', pitch: 8, isBlack: true}, - {name: 'A', pitch: 9}, - {name: 'B♭', pitch: 10, isBlack: true}, - {name: 'B', pitch: 11}, - {name: 'C', pitch: 12} -]; - -/** - * The MIDI note number of the highest note selectable on the piano. - * @type {number} - * @const - */ -Blockly.FieldNote.MAX_NOTE = 130; - -/** - * The fraction of the distance to the target location to move the piano at each - * step of the animation. - * @type {number} - * @const - */ -Blockly.FieldNote.ANIMATION_FRACTION = 0.2; - -/** - * Path to the arrow svg icon, used on the octave buttons. - * @type {string} - * @const - */ -Blockly.FieldNote.ARROW_SVG_PATH = 'icons/arrow_button.svg'; - -/** - * The size of the square octave buttons. - * @type {number} - * @const - */ -Blockly.FieldNote.OCTAVE_BUTTON_SIZE = 32; - -/** - * Construct a FieldNote from a JSON arg object. - * @param {!Object} options A JSON object with options. - * @returns {!Blockly.FieldNote} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldNote.fromJson = function(options) { - return new Blockly.FieldNote(options['note']); -}; - -/** - * Clean up this FieldNote, as well as the inherited FieldTextInput. - * @return {!Function} Closure to call on destruction of the WidgetDiv. - * @private - */ -Blockly.FieldNote.prototype.dispose_ = function() { - var thisField = this; - return function() { - Blockly.FieldNote.superClass_.dispose_.call(thisField)(); - thisField.mouseDownWrappers_.forEach(function(wrapper) { - Blockly.unbindEvent_(wrapper); - }); - thisField.mouseEnterWrappers_.forEach(function(wrapper) { - Blockly.unbindEvent_(wrapper); - }); - if (thisField.mouseUpWrapper_) { - Blockly.unbindEvent_(thisField.mouseUpWrapper_); - } - if (thisField.octaveDownMouseDownWrapper_) { - Blockly.unbindEvent_(thisField.octaveDownMouseDownWrapper_); - } - if (thisField.octaveUpMouseDownWrapper_) { - Blockly.unbindEvent_(thisField.octaveUpMouseDownWrapper_); - } - this.pianoSVG_ = null; - this.keySVGs_.length = 0; - this.noteNameText_ = null; - this.lowCText_ = null; - this.highCText_ = null; - }; -}; - -/** - * Show a field with piano keys. - * @private - */ -Blockly.FieldNote.prototype.showEditor_ = function() { - // Mobile browsers have issues with in-line textareas (focus & keyboards). - Blockly.FieldNote.superClass_.showEditor_.call(this, this.useTouchInteraction_); - - // If there is an existing drop-down someone else owns, hide it immediately and clear it. - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - - // Build the SVG DOM. - var div = Blockly.DropDownDiv.getContentDiv(); - - this.fieldEditorWidth_ = Blockly.FieldNote.NUM_WHITE_KEYS * Blockly.FieldNote.WHITE_KEY_WIDTH + - Blockly.FieldNote.EDGE_PADDING; - this.fieldEditorHeight_ = Blockly.FieldNote.TOP_MENU_HEIGHT + - Blockly.FieldNote.WHITE_KEY_HEIGHT + - Blockly.FieldNote.EDGE_PADDING; - - var svg = Blockly.utils.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'height': this.fieldEditorHeight_ + 'px', - 'width': this.fieldEditorWidth_ + 'px' - }, div); - - // Add the white and black keys - // Since we are adding the keys from left to right in order, they need - // to be in two groups in order to layer correctly. - this.pianoSVG_ = Blockly.utils.createSvgElement('g', {}, svg); - var whiteKeyGroup = Blockly.utils.createSvgElement('g', {}, this.pianoSVG_); - var blackKeyGroup = Blockly.utils.createSvgElement('g', {}, this.pianoSVG_); - - // Add three piano octaves, so we can animate moving up or down an octave. - // Only the middle octave gets bound to events. - this.keySVGs_ = []; - this.addPianoOctave_(-this.fieldEditorWidth_ + Blockly.FieldNote.EDGE_PADDING, - whiteKeyGroup, blackKeyGroup, null); - this.addPianoOctave_(0, whiteKeyGroup, blackKeyGroup, this.keySVGs_); - this.addPianoOctave_(this.fieldEditorWidth_ - Blockly.FieldNote.EDGE_PADDING, - whiteKeyGroup, blackKeyGroup, null); - - // Note name indicator at the top of the field - this.noteNameText_ = Blockly.utils.createSvgElement('text', - { - 'x': this.fieldEditorWidth_ / 2, - 'y': Blockly.FieldNote.TOP_MENU_HEIGHT / 2, - 'class': 'blocklyText', - 'text-anchor': 'middle', - 'dominant-baseline': 'middle', - }, svg); - - // Note names on the low and high C keys - var lowCX = Blockly.FieldNote.WHITE_KEY_WIDTH / 2; - this.lowCText_ = this.addCKeyLabel_(lowCX, svg); - var highCX = lowCX + (Blockly.FieldNote.WHITE_KEY_WIDTH * - (Blockly.FieldNote.NUM_WHITE_KEYS - 1)); - this.highCText_ = this.addCKeyLabel_(highCX, svg); - - // Horizontal line at the top of the keys - Blockly.utils.createSvgElement('line', - { - 'stroke': this.sourceBlock_.getColourTertiary(), - 'x1': 0, - 'y1': Blockly.FieldNote.TOP_MENU_HEIGHT, - 'x2': this.fieldEditorWidth_, - 'y2': Blockly.FieldNote.TOP_MENU_HEIGHT - }, svg); - - // Drop shadow at the top of the keys - Blockly.utils.createSvgElement('rect', - { - 'x': 0, - 'y': Blockly.FieldNote.TOP_MENU_HEIGHT, - 'width': this.fieldEditorWidth_, - 'height': Blockly.FieldNote.SHADOW_HEIGHT, - 'fill': Blockly.FieldNote.SHADOW_COLOR, - 'fill-opacity': Blockly.FieldNote.SHADOW_OPACITY - }, svg); - - // Octave buttons - this.octaveDownButton = this.addOctaveButton_(0, true, svg); - this.octaveUpButton = this.addOctaveButton_( - (this.fieldEditorWidth_ + Blockly.FieldNote.INSET * 2) - - Blockly.FieldNote.OCTAVE_BUTTON_SIZE, false, svg); - - this.octaveDownMouseDownWrapper_ = - Blockly.bindEvent_(this.octaveDownButton, 'mousedown', this, function() { - this.changeOctaveBy_(-1); - }); - this.octaveUpMouseDownWrapper_ = - Blockly.bindEvent_(this.octaveUpButton, 'mousedown', this,function() { - this.changeOctaveBy_(1); - }); - Blockly.DropDownDiv.setColour(this.sourceBlock_.parentBlock_.getColour(), - this.sourceBlock_.getColourTertiary()); - Blockly.DropDownDiv.setCategory(this.sourceBlock_.parentBlock_.getCategory()); - Blockly.DropDownDiv.showPositionedByBlock(this, this.sourceBlock_); - - this.updateSelection_(); -}; - -/** - * Add one octave of piano keys drawn using SVG. - * @param {number} x The x position of the left edge of this octave of keys. - * @param {SVGElement} whiteKeyGroup The group for all white piano keys. - * @param {SvgElement} blackKeyGroup The group for all black piano keys. - * @param {!Array.} keySVGarray An array containing all the key SVGs. - * @private - */ -Blockly.FieldNote.prototype.addPianoOctave_ = function(x, whiteKeyGroup, blackKeyGroup, keySVGarray) { - var xIncrement, width, height, fill, stroke, group; - x += Blockly.FieldNote.EDGE_PADDING / 2; - var y = Blockly.FieldNote.TOP_MENU_HEIGHT; - for (var i = 0; i < Blockly.FieldNote.KEY_INFO.length; i++) { - // Draw a black or white key - if (Blockly.FieldNote.KEY_INFO[i].isBlack) { - // Black keys are shifted back half a key - x -= Blockly.FieldNote.BLACK_KEY_WIDTH / 2; - xIncrement = Blockly.FieldNote.BLACK_KEY_WIDTH / 2; - width = Blockly.FieldNote.BLACK_KEY_WIDTH; - height = Blockly.FieldNote.BLACK_KEY_HEIGHT; - fill = Blockly.FieldNote.BLACK_KEY_COLOR; - stroke = Blockly.FieldNote.BLACK_KEY_STROKE; - group = blackKeyGroup; - } else { - xIncrement = Blockly.FieldNote.WHITE_KEY_WIDTH; - width = Blockly.FieldNote.WHITE_KEY_WIDTH; - height = Blockly.FieldNote.WHITE_KEY_HEIGHT; - fill = Blockly.FieldNote.WHITE_KEY_COLOR; - stroke = this.sourceBlock_.getColourTertiary(); - group = whiteKeyGroup; - } - var attr = { - 'd': this.getPianoKeyPath_(x, y, width, height), - 'fill': fill, - 'stroke': stroke - }; - x += xIncrement; - - var keySVG = Blockly.utils.createSvgElement('path', attr, group); - - if (keySVGarray) { - keySVGarray[i] = keySVG; - keySVG.setAttribute('data-pitch', Blockly.FieldNote.KEY_INFO[i].pitch); - keySVG.setAttribute('data-name', Blockly.FieldNote.KEY_INFO[i].name); - keySVG.setAttribute('data-isBlack', Blockly.FieldNote.KEY_INFO[i].isBlack); - - this.mouseDownWrappers_[i] = - Blockly.bindEvent_(keySVG, 'mousedown', this, this.onMouseDownOnKey_); - this.mouseEnterWrappers_[i] = - Blockly.bindEvent_(keySVG, 'mouseenter', this, this.onMouseEnter_); - } - } -}; - -/** - * Construct the SVG path string for a piano key shape: a rectangle with rounded - * corners at the bottom. - * @param {number} x the x position for the key. - * @param {number} y the y position for the key. - * @param {number} width the width of the key. - * @param {number} height the height of the key. - * @returns {string} the SVG path as a string. - * @private - */ -Blockly.FieldNote.prototype.getPianoKeyPath_ = function(x, y, width, height) { - return 'M' + x + ' ' + y + ' ' + - 'L' + x + ' ' + (y + height - Blockly.FieldNote.KEY_RADIUS) + ' ' + - 'Q' + x + ' ' + (y + height) + ' ' + - (x + Blockly.FieldNote.KEY_RADIUS) + ' ' + (y + height) + ' ' + - 'L' + (x + width - Blockly.FieldNote.KEY_RADIUS) + ' ' + (y + height) + ' ' + - 'Q' + (x + width) + ' ' + (y + height) + ' ' + - (x + width) + ' ' + (y + height - Blockly.FieldNote.KEY_RADIUS) + ' ' + - 'L' + (x + width) + ' ' + y + ' ' + - 'L' + x + ' ' + y; -}; - -/** - * Add a button for switching the displayed octave of the piano up or down. - * @param {number} x The x position of the button. - * @param {boolean} flipped If true, the icon should be flipped. - * @param {SvgElement} svg The svg element to add the buttons to. - * @returns {SvgElement} A group containing the button SVG elements. - * @private - */ -Blockly.FieldNote.prototype.addOctaveButton_ = function(x, flipped, svg) { - var group = Blockly.utils.createSvgElement('g', {}, svg); - var imageSize = Blockly.FieldNote.OCTAVE_BUTTON_SIZE; - var arrow = Blockly.utils.createSvgElement('image', - { - 'width': imageSize, - 'height': imageSize, - 'x': x - Blockly.FieldNote.INSET, - 'y': -1 * Blockly.FieldNote.INSET - }, group); - arrow.setAttributeNS( - 'http://www.w3.org/1999/xlink', - 'xlink:href', - Blockly.mainWorkspace.options.pathToMedia + Blockly.FieldNote.ARROW_SVG_PATH - ); - Blockly.utils.createSvgElement('line', - { - 'stroke': this.sourceBlock_.getColourTertiary(), - 'x1': x - Blockly.FieldNote.INSET, - 'y1': 0, - 'x2': x - Blockly.FieldNote.INSET, - 'y2': Blockly.FieldNote.TOP_MENU_HEIGHT - Blockly.FieldNote.INSET - }, group); - if (flipped) { - var translateX = -1 * Blockly.FieldNote.OCTAVE_BUTTON_SIZE + (Blockly.FieldNote.INSET * 2); - group.setAttribute('transform', 'scale(-1, 1) ' + - 'translate(' + translateX + ', 0)'); - } - return group; -}; - -/** - * Add an SVG text label for display on the C keys of the piano. - * @param {number} x The x position for the label. - * @param {SvgElement} svg The SVG element to add the label to. - * @returns {SvgElement} The SVG element containing the label. - * @private - */ -Blockly.FieldNote.prototype.addCKeyLabel_ = function(x, svg) { - return Blockly.utils.createSvgElement('text', - { - 'x': x, - 'y': Blockly.FieldNote.TOP_MENU_HEIGHT + Blockly.FieldNote.WHITE_KEY_HEIGHT - - Blockly.FieldNote.KEY_LABEL_PADDING, - 'class': 'scratchNotePickerKeyLabel', - 'text-anchor': 'middle' - }, svg); -}; - -/** - * Set the visibility of the C key labels. - * @param {boolean} visible If true, set labels to be visible. - * @private - */ -Blockly.FieldNote.prototype.setCKeyLabelsVisible_ = function(visible) { - if (visible) { - this.fadeSvgToOpacity_(this.lowCText_, 1); - this.fadeSvgToOpacity_(this.highCText_, 1); - } else { - this.fadeSvgToOpacity_(this.lowCText_, 0); - this.fadeSvgToOpacity_(this.highCText_, 0); - } -}; - -/** - * Animate an SVG to fade it in or out to a target opacity. - * @param {SvgElement} svg The SVG element to apply the fade to. - * @param {number} opacity The target opacity. - * @private - */ -Blockly.FieldNote.prototype.fadeSvgToOpacity_ = function(svg, opacity) { - svg.setAttribute('style', 'opacity: ' + opacity + '; transition: opacity 0.1s;'); -}; - -/** - * Handle the mouse down event on a piano key. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.FieldNote.prototype.onMouseDownOnKey_ = function(e) { - this.mouseIsDown_ = true; - this.mouseUpWrapper_ = Blockly.bindEvent_(document.body, 'mouseup', this, this.onMouseUp_); - this.selectNoteWithMouseEvent_(e); -}; - -/** - * Handle the mouse up event following a mouse down on a piano key. - * @private - */ -Blockly.FieldNote.prototype.onMouseUp_ = function() { - this.mouseIsDown_ = false; - Blockly.unbindEvent_(this.mouseUpWrapper_); -}; - -/** - * Handle the event when the mouse enters a piano key. - * @param {!Event} e Mouse enter event. - * @private - */ -Blockly.FieldNote.prototype.onMouseEnter_ = function(e) { - if (this.mouseIsDown_) { - this.selectNoteWithMouseEvent_(e); - } -}; - -/** - * Use the data in a mouse event to select a new note, and play it. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.FieldNote.prototype.selectNoteWithMouseEvent_ = function(e) { - var newNoteNum = Number(e.target.getAttribute('data-pitch')) + this.displayedOctave_ * 12; - this.setNoteNum_(newNoteNum); - this.playNoteInternal_(); -}; - -/** - * Play a note, by calling the externally overriden play note function. - * @private - */ -Blockly.FieldNote.prototype.playNoteInternal_ = function() { - if (Blockly.FieldNote.playNote_) { - Blockly.FieldNote.playNote_( - this.getValue(), - this.sourceBlock_.parentBlock_.getCategory() - ); - } -}; - -/** - * Function to play a musical note corresponding to the key selected. - * Overridden externally. - * @param {number} noteNum the MIDI note number to play. - * @param {string} id An id to select a scratch extension to play the note. - * @private - */ -Blockly.FieldNote.playNote_ = function(/* noteNum, id*/) { - return; -}; - -/** - * Change the selected note by a number of octaves, and start the animation. - * @param {number} octaves The number of octaves to change by. - * @private - */ -Blockly.FieldNote.prototype.changeOctaveBy_ = function(octaves) { - this.displayedOctave_ += octaves; - if (this.displayedOctave_ < 0) { - this.displayedOctave_ = 0; - return; - } - var maxOctave = Math.floor(Blockly.FieldNote.MAX_NOTE / 12); - if (this.displayedOctave_ > maxOctave) { - this.displayedOctave_ = maxOctave; - return; - } - - var newNote = Number(this.getText()) + (octaves * 12); - this.setNoteNum_(newNote); - - this.animationTarget_ = this.fieldEditorWidth_ * octaves * -1; - this.animationPos_ = 0; - this.stepOctaveAnimation_(); - this.setCKeyLabelsVisible_(false); -}; - -/** - * Animate the piano up or down an octave by sliding it to the left or right. - * @private - */ -Blockly.FieldNote.prototype.stepOctaveAnimation_ = function() { - var absDiff = Math.abs(this.animationPos_ - this.animationTarget_); - if (absDiff < 1) { - this.pianoSVG_.setAttribute('transform', 'translate(0, 0)'); - this.setCKeyLabelsVisible_(true); - this.playNoteInternal_(); - return; - } - this.animationPos_ += (this.animationTarget_ - this.animationPos_) * - Blockly.FieldNote.ANIMATION_FRACTION; - this.pianoSVG_.setAttribute('transform', 'translate(' + this.animationPos_ + ',0)'); - requestAnimationFrame(this.stepOctaveAnimation_.bind(this)); -}; - -/** - * Set the selected note number, and update the piano display and the input field. - * @param {number} noteNum The MIDI note number to select. - * @private - */ -Blockly.FieldNote.prototype.setNoteNum_ = function(noteNum) { - noteNum = this.callValidator(noteNum); - this.setValue(noteNum); - Blockly.FieldTextInput.htmlInput_.value = noteNum; -}; - -/** - * Sets the text in this field. Triggers a rerender of the source block, and - * updates the selection on the field. - * @param {?string} text New text. - */ -Blockly.FieldNote.prototype.setText = function(text) { - Blockly.FieldNote.superClass_.setText.call(this, text); - if (!this.textElement_) { - // Not rendered yet. - return; - } - this.updateSelection_(); - // Cached width is obsolete. Clear it. - this.size_.width = 0; -}; - -/** - * For a MIDI note number, find the index of the corresponding piano key. - * @param {number} noteNum The note number. - * @returns {number} The index of the piano key. - * @private - */ -Blockly.FieldNote.prototype.noteNumToKeyIndex_ = function(noteNum) { - return Math.floor(noteNum) - (this.displayedOctave_ * 12); -}; - -/** - * Update the selected note and labels on the field. - * @private - */ -Blockly.FieldNote.prototype.updateSelection_ = function() { - var noteNum = Number(this.getText()); - - // If the note is outside the currently displayed octave, update it - if (this.displayedOctave_ == null || - noteNum > ((this.displayedOctave_ * 12) + 12) || - noteNum < (this.displayedOctave_ * 12)) { - this.displayedOctave_ = Math.floor(noteNum / 12); - } - - var index = this.noteNumToKeyIndex_(noteNum); - - // Clear the highlight on all keys - this.keySVGs_.forEach(function(svg) { - var isBlack = svg.getAttribute('data-isBlack'); - if (isBlack === 'true') { - svg.setAttribute('fill', Blockly.FieldNote.BLACK_KEY_COLOR); - } else { - svg.setAttribute('fill', Blockly.FieldNote.WHITE_KEY_COLOR); - } - }); - // Set the highlight on the selected key - if (this.keySVGs_[index]) { - this.keySVGs_[index].setAttribute('fill', Blockly.FieldNote.KEY_SELECTED_COLOR); - // Update the note name text - var noteName = Blockly.FieldNote.KEY_INFO[index].name; - this.noteNameText_.textContent = noteName + ' (' + Math.floor(noteNum) + ')'; - // Update the low and high C note names - var lowCNum = this.displayedOctave_ * 12; - this.lowCText_.textContent = 'C(' + lowCNum + ')'; - this.highCText_.textContent = 'C(' + (lowCNum + 12) + ')'; - } -}; - -/** - * Ensure that only a valid MIDI note number may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid note number, or null if invalid. - */ -Blockly.FieldNote.prototype.classValidator = function(text) { - if (text === null) { - return null; - } - var n = parseFloat(text || 0); - if (isNaN(n)) { - return null; - } - if (n < 0) { - n = 0; - } - if (n > Blockly.FieldNote.MAX_NOTE) { - n = Blockly.FieldNote.MAX_NOTE; - } - return String(n); -}; - -Blockly.Field.register('field_note', Blockly.FieldNote); diff --git a/packages/scratch-blocks/core/field_number.js b/packages/scratch-blocks/core/field_number.js deleted file mode 100644 index c3307c623..000000000 --- a/packages/scratch-blocks/core/field_number.js +++ /dev/null @@ -1,366 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Field for numbers. Includes validator and numpad on touch. - * @author tmickel@mit.edu (Tim Mickel) - */ -'use strict'; - -goog.provide('Blockly.FieldNumber'); - -goog.require('Blockly.FieldTextInput'); -goog.require('Blockly.Touch'); -goog.require('goog.math'); -goog.require('goog.userAgent'); - -/** - * Class for an editable number field. - * In scratch-blocks, the min/max/precision properties are only used - * to construct a restrictor on typable characters, and to inform the pop-up - * numpad on touch devices. - * These properties are included here (i.e. instead of just accepting a - * decimalAllowed, negativeAllowed) to maintain API compatibility with Blockly - * and Blockly for Android. - * @param {(string|number)=} opt_value The initial content of the field. The value - * should cast to a number, and if it does not, '0' will be used. - * @param {(string|number)=} opt_min Minimum value. - * @param {(string|number)=} opt_max Maximum value. - * @param {(string|number)=} opt_precision Precision for value. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns the accepted text or null to abort - * the change. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldNumber = function(opt_value, opt_min, opt_max, opt_precision, - opt_validator) { - var numRestrictor = this.getNumRestrictor(opt_min, opt_max, opt_precision); - opt_value = (opt_value && !isNaN(opt_value)) ? String(opt_value) : '0'; - Blockly.FieldNumber.superClass_.constructor.call( - this, opt_value, opt_validator, numRestrictor); - this.addArgType('number'); -}; -goog.inherits(Blockly.FieldNumber, Blockly.FieldTextInput); - -/** - * Construct a FieldNumber from a JSON arg object. - * @param {!Object} options A JSON object with options (value, min, max, and - * precision). - * @returns {!Blockly.FieldNumber} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldNumber.fromJson = function(options) { - return new Blockly.FieldNumber(options['value'], - options['min'], options['max'], options['precision']); -}; - -/** - * Fixed width of the num-pad drop-down, in px. - * @type {number} - * @const - */ -Blockly.FieldNumber.DROPDOWN_WIDTH = 168; - -/** - * Buttons for the num-pad, in order from the top left. - * Values are strings of the number or symbol will be added to the field text - * when the button is pressed. - * @type {Array.} - * @const - */ -// Calculator order -Blockly.FieldNumber.NUMPAD_BUTTONS = - ['7', '8', '9', '4', '5', '6', '1', '2', '3', '.', '0', '-', ' ']; - -/** - * Src for the delete icon to be shown on the num-pad. - * @type {string} - * @const - */ -Blockly.FieldNumber.NUMPAD_DELETE_ICON = 'data:image/svg+xml;utf8,' + - '' + - ''; - -/** - * Currently active field during an edit. - * Used to give a reference to the num-pad button callbacks. - * @type {?FieldNumber} - * @private - */ -Blockly.FieldNumber.activeField_ = null; - -/** - * Return an appropriate restrictor, depending on whether this FieldNumber - * allows decimal or negative numbers. - * @param {number|string|undefined} opt_min Minimum value. - * @param {number|string|undefined} opt_max Maximum value. - * @param {number|string|undefined} opt_precision Precision for value. - * @return {!RegExp} Regular expression for this FieldNumber's restrictor. - */ -Blockly.FieldNumber.prototype.getNumRestrictor = function(opt_min, opt_max, - opt_precision) { - this.setConstraints_(opt_min, opt_max, opt_precision); - var pattern = "[\\d]"; // Always allow digits. - if (this.decimalAllowed_) { - pattern += "|[\\.]"; - } - if (this.negativeAllowed_) { - pattern += "|[-]"; - } - if (this.exponentialAllowed_) { - pattern += "|[eE]"; - } - return new RegExp(pattern); -}; - -/** - * Set the constraints for this field. - * @param {number=} opt_min Minimum number allowed. - * @param {number=} opt_max Maximum number allowed. - * @param {number=} opt_precision Step allowed between numbers - */ -Blockly.FieldNumber.prototype.setConstraints_ = function(opt_min, opt_max, - opt_precision) { - this.decimalAllowed_ = (typeof opt_precision == 'undefined') || - isNaN(opt_precision) || (opt_precision == 0) || - (Math.floor(opt_precision) != opt_precision); - this.negativeAllowed_ = (typeof opt_min == 'undefined') || isNaN(opt_min) || - opt_min < 0; - this.exponentialAllowed_ = this.decimalAllowed_; -}; - -/** - * Show the inline free-text editor on top of the text and the num-pad if - * appropriate. - * @private - */ -Blockly.FieldNumber.prototype.showEditor_ = function() { - Blockly.FieldNumber.activeField_ = this; - // Do not focus on mobile devices so we can show the num-pad - var showNumPad = this.useTouchInteraction_; - Blockly.FieldNumber.superClass_.showEditor_.call(this, false, showNumPad); - - // Show a numeric keypad in the drop-down on touch - if (showNumPad) { - this.showNumPad_(); - } -}; - -/** - * Show the number pad. - * @private - */ -Blockly.FieldNumber.prototype.showNumPad_ = function() { - // If there is an existing drop-down someone else owns, hide it immediately - // and clear it. - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - - var contentDiv = Blockly.DropDownDiv.getContentDiv(); - - // Accessibility properties - contentDiv.setAttribute('role', 'menu'); - contentDiv.setAttribute('aria-haspopup', 'true'); - - this.addButtons_(contentDiv); - - // Set colour and size of drop-down - Blockly.DropDownDiv.setColour(this.sourceBlock_.parentBlock_.getColour(), - this.sourceBlock_.getColourTertiary()); - contentDiv.style.width = Blockly.FieldNumber.DROPDOWN_WIDTH + 'px'; - - this.position_(); -}; - -/** - * Figure out where to place the drop-down, and move it there. - * @private - */ -Blockly.FieldNumber.prototype.position_ = function() { - // Calculate positioning for the drop-down - // sourceBlock_ is the rendered shadow field input box - var scale = this.sourceBlock_.workspace.scale; - var bBox = this.sourceBlock_.getHeightWidth(); - bBox.width *= scale; - bBox.height *= scale; - var position = this.getAbsoluteXY_(); - // If we can fit it, render below the shadow block - var primaryX = position.x + bBox.width / 2; - var primaryY = position.y + bBox.height; - // If we can't fit it, render above the entire parent block - var secondaryX = primaryX; - var secondaryY = position.y; - - Blockly.DropDownDiv.setBoundsElement( - this.sourceBlock_.workspace.getParentSvg().parentNode); - Blockly.DropDownDiv.show(this, primaryX, primaryY, secondaryX, secondaryY, - this.onHide_.bind(this)); -}; - -/** - * Add number, punctuation, and erase buttons to the numeric keypad's content - * div. - * @param {Element} contentDiv The div for the numeric keypad. - * @private - */ -Blockly.FieldNumber.prototype.addButtons_ = function(contentDiv) { - var buttonColour = this.sourceBlock_.parentBlock_.getColour(); - var buttonBorderColour = this.sourceBlock_.parentBlock_.getColourTertiary(); - - // Add numeric keypad buttons - var buttons = Blockly.FieldNumber.NUMPAD_BUTTONS; - for (var i = 0, buttonText; buttonText = buttons[i]; i++) { - var button = document.createElement('button'); - button.setAttribute('role', 'menuitem'); - button.setAttribute('class', 'blocklyNumPadButton'); - button.setAttribute('style', - 'background:' + buttonColour + ';' + - 'border: 1px solid ' + buttonBorderColour + ';'); - button.title = buttonText; - button.innerHTML = buttonText; - Blockly.bindEvent_(button, 'mousedown', button, - Blockly.FieldNumber.numPadButtonTouch); - if (buttonText == '.' && !this.decimalAllowed_) { - // Don't show the decimal point for inputs that must be round numbers - button.setAttribute('style', 'visibility: hidden'); - } else if (buttonText == '-' && !this.negativeAllowed_) { - continue; - } else if (buttonText == ' ' && !this.negativeAllowed_) { - continue; - } else if (buttonText == ' ' && this.negativeAllowed_) { - button.setAttribute('style', 'visibility: hidden'); - } - contentDiv.appendChild(button); - } - // Add erase button to the end - var eraseButton = document.createElement('button'); - eraseButton.setAttribute('role', 'menuitem'); - eraseButton.setAttribute('class', 'blocklyNumPadButton'); - eraseButton.setAttribute('style', - 'background:' + buttonColour + ';' + - 'border: 1px solid ' + buttonBorderColour + ';'); - eraseButton.title = 'Delete'; - - var eraseImage = document.createElement('img'); - eraseImage.src = Blockly.FieldNumber.NUMPAD_DELETE_ICON; - eraseButton.appendChild(eraseImage); - - Blockly.bindEvent_(eraseButton, 'mousedown', null, - Blockly.FieldNumber.numPadEraseButtonTouch); - contentDiv.appendChild(eraseButton); -}; - -/** - * Call for when a num-pad number or punctuation button is touched. - * Determine what the user is inputting and update the text field appropriately. - * @param {Event} e DOM event triggering the touch. - */ -Blockly.FieldNumber.numPadButtonTouch = function(e) { - // String of the button (e.g., '7') - var spliceValue = this.innerHTML; - // Old value of the text field - var oldValue = Blockly.FieldTextInput.htmlInput_.value; - // Determine the selected portion of the text field - var selectionStart = Blockly.FieldTextInput.htmlInput_.selectionStart; - var selectionEnd = Blockly.FieldTextInput.htmlInput_.selectionEnd; - - // Splice in the new value - var newValue = oldValue.slice(0, selectionStart) + spliceValue + - oldValue.slice(selectionEnd); - - // Set new value and advance the cursor - Blockly.FieldNumber.updateDisplay_(newValue, selectionStart + spliceValue.length); - - // This is just a click. - Blockly.Touch.clearTouchIdentifier(); - - // Prevent default to not lose input focus - e.preventDefault(); -}; - -/** - * Call for when the num-pad erase button is touched. - * Determine what the user is asking to erase, and erase it. - * @param {Event} e DOM event triggering the touch. - */ -Blockly.FieldNumber.numPadEraseButtonTouch = function(e) { - // Old value of the text field - var oldValue = Blockly.FieldTextInput.htmlInput_.value; - // Determine what is selected to erase (if anything) - var selectionStart = Blockly.FieldTextInput.htmlInput_.selectionStart; - var selectionEnd = Blockly.FieldTextInput.htmlInput_.selectionEnd; - - // If selection is zero-length, shift start to the left 1 character - if (selectionStart == selectionEnd) { - selectionStart = Math.max(0, selectionStart - 1); - } - - // Cut out selected range - var newValue = oldValue.slice(0, selectionStart) + - oldValue.slice(selectionEnd); - - Blockly.FieldNumber.updateDisplay_(newValue, selectionStart); - - // This is just a click. - Blockly.Touch.clearTouchIdentifier(); - - // Prevent default to not lose input focus which resets cursors in Chrome - e.preventDefault(); -}; - -/** - * Update the displayed value and resize/scroll the text field as needed. - * @param {string} newValue The new text to display. - * @param {string} newSelection The new index to put the cursor - * @private. - */ -Blockly.FieldNumber.updateDisplay_ = function(newValue, newSelection) { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - // Updates the display. The actual setValue occurs when editing ends. - htmlInput.value = newValue; - // Resize and scroll the text field appropriately - Blockly.FieldNumber.superClass_.resizeEditor_.call( - Blockly.FieldNumber.activeField_); - htmlInput.setSelectionRange(newSelection, newSelection); - htmlInput.scrollLeft = htmlInput.scrollWidth; - Blockly.FieldNumber.activeField_.validate_(); -}; - -/** - * Callback for when the drop-down is hidden. - */ -Blockly.FieldNumber.prototype.onHide_ = function() { - // Clear accessibility properties - Blockly.DropDownDiv.content_.removeAttribute('role'); - Blockly.DropDownDiv.content_.removeAttribute('aria-haspopup'); -}; - -Blockly.Field.register('field_number', Blockly.FieldNumber); diff --git a/packages/scratch-blocks/core/field_numberdropdown.js b/packages/scratch-blocks/core/field_numberdropdown.js deleted file mode 100644 index 27f1c91c0..000000000 --- a/packages/scratch-blocks/core/field_numberdropdown.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Combination number + drop-down field - * @author tmickel@mit.edu (Tim Mickel) - */ -'use strict'; - -goog.provide('Blockly.FieldNumberDropdown'); - -goog.require('Blockly.FieldTextDropdown'); -goog.require('goog.userAgent'); - - -/** - * Class for a combination number + drop-down field. - * @param {number|string} value The initial content of the field. - * @param {(!Array.>|!Function)} menuGenerator An array of - * options for a dropdown list, or a function which generates these options. - * @param {number|string|undefined} opt_min Minimum value. - * @param {number|string|undefined} opt_max Maximum value. - * @param {number|string|undefined} opt_precision Precision for value. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns the accepted text or null to abort - * the change. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldNumberDropdown = function(value, menuGenerator, opt_min, opt_max, - opt_precision, opt_validator) { - this.setConstraints_ = Blockly.FieldNumber.prototype.setConstraints_; - - var numRestrictor = Blockly.FieldNumber.prototype.getNumRestrictor.call( - this, opt_min, opt_max, opt_precision - ); - Blockly.FieldNumberDropdown.superClass_.constructor.call( - this, value, menuGenerator, opt_validator, numRestrictor - ); - this.addArgType('numberdropdown'); -}; -goog.inherits(Blockly.FieldNumberDropdown, Blockly.FieldTextDropdown); - -/** - * Construct a FieldTextDropdown from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} element A JSON object with options. - * @returns {!Blockly.FieldNumberDropdown} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldNumberDropdown.fromJson = function(element) { - return new Blockly.FieldNumberDropdown( - element['value'], element['options'], - element['min'], element['max'], element['precision'] - ); -}; - -Blockly.Field.register('field_numberdropdown', Blockly.FieldNumberDropdown); diff --git a/packages/scratch-blocks/core/field_textdropdown.js b/packages/scratch-blocks/core/field_textdropdown.js deleted file mode 100644 index 4e192a33f..000000000 --- a/packages/scratch-blocks/core/field_textdropdown.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Combination text + drop-down field - * @author tmickel@mit.edu (Tim Mickel) - */ -'use strict'; - -goog.provide('Blockly.FieldTextDropdown'); - -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.FieldDropdown'); -goog.require('Blockly.FieldTextInput'); -goog.require('goog.userAgent'); - - -/** - * Class for a combination text + drop-down field. - * @param {string} text The initial content of the text field. - * @param {(!Array.>|!Function)} menuGenerator An array of - * options for a dropdown list, or a function which generates these options. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns the accepted text or null to abort - * the change. - * @param {RegExp=} opt_restrictor An optional regular expression to restrict - * typed text to. Text that doesn't match the restrictor will never show - * in the text field. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldTextDropdown = function(text, menuGenerator, opt_validator, opt_restrictor) { - this.menuGenerator_ = menuGenerator; - Blockly.FieldDropdown.prototype.trimOptions_.call(this); - Blockly.FieldTextDropdown.superClass_.constructor.call(this, text, opt_validator, opt_restrictor); - this.addArgType('textdropdown'); -}; -goog.inherits(Blockly.FieldTextDropdown, Blockly.FieldTextInput); - -/** - * Construct a FieldTextDropdown from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} element A JSON object with options. - * @returns {!Blockly.FieldTextDropdown} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldTextDropdown.fromJson = function(element) { - var field = - new Blockly.FieldTextDropdown(element['text'], element['options']); - if (typeof element['spellcheck'] == 'boolean') { - field.setSpellcheck(element['spellcheck']); - } - return field; -}; - -/** - * Install this text drop-down field on a block. - */ -Blockly.FieldTextDropdown.prototype.init = function() { - if (this.fieldGroup_) { - // Text input + dropdown has already been initialized once. - return; - } - Blockly.FieldTextDropdown.superClass_.init.call(this); - // Add dropdown arrow: "option ▾" (LTR) or "▾ אופציה" (RTL) - // Positioned on render, after text size is calculated. - if (!this.arrow_) { - /** @type {Number} */ - this.arrowSize_ = 12; - /** @type {Number} */ - this.arrowX_ = 0; - /** @type {Number} */ - this.arrowY_ = 11; - this.arrow_ = Blockly.utils.createSvgElement('image', - { - 'height': this.arrowSize_ + 'px', - 'width': this.arrowSize_ + 'px' - }); - this.arrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'dropdown-arrow-dark.svg'); - this.arrow_.style.cursor = 'pointer'; - this.fieldGroup_.appendChild(this.arrow_); - this.mouseUpWrapper_ = - Blockly.bindEvent_(this.arrow_, 'mouseup', this, this.showDropdown_); - } - // Prevent the drop-down handler from changing the field colour on open. - this.disableColourChange_ = true; -}; - -/** - * Close the input widget if this input is being deleted. - */ -Blockly.FieldTextDropdown.prototype.dispose = function() { - if (this.mouseUpWrapper_) { - Blockly.unbindEvent_(this.mouseUpWrapper_); - this.mouseUpWrapper_ = null; - Blockly.Touch.clearTouchIdentifier(); - } - Blockly.FieldTextDropdown.superClass_.dispose.call(this); -}; - -/** - * If the drop-down isn't open, show the text editor. - */ -Blockly.FieldTextDropdown.prototype.showEditor_ = function() { - if (!this.dropDownOpen_) { - Blockly.FieldTextDropdown.superClass_.showEditor_.call(this, null, null, - true, function() { - // When the drop-down arrow is clicked, hide text editor and show drop-down. - Blockly.WidgetDiv.hide(); - this.showDropdown_(); - Blockly.Touch.clearTouchIdentifier(); - }); - } -}; - -/** - * Return a list of the options for this dropdown. - * See: Blockly.FieldDropDown.prototype.getOptions_. - * @return {!Array.>} Array of option tuples: - * (human-readable text, language-neutral name). - * @private - */ -Blockly.FieldTextDropdown.prototype.getOptions_ = Blockly.FieldDropdown.prototype.getOptions_; - -/** - * Position a drop-down arrow at the appropriate location at render-time. - * See: Blockly.FieldDropDown.prototype.positionArrow. - * @param {number} x X position the arrow is being rendered at, in px. - * @return {number} Amount of space the arrow is taking up, in px. - */ -Blockly.FieldTextDropdown.prototype.positionArrow = Blockly.FieldDropdown.prototype.positionArrow; - -/** - * Create the dropdown menu. - * @private - */ -Blockly.FieldTextDropdown.prototype.showDropdown_ = Blockly.FieldDropdown.prototype.showEditor_; - -/** - * Callback when the drop-down menu is hidden. - */ -Blockly.FieldTextDropdown.prototype.onHide = Blockly.FieldDropdown.prototype.onHide; - -Blockly.Field.register('field_textdropdown', Blockly.FieldTextDropdown); diff --git a/packages/scratch-blocks/core/field_textinput.js b/packages/scratch-blocks/core/field_textinput.js deleted file mode 100644 index 8ecf56302..000000000 --- a/packages/scratch-blocks/core/field_textinput.js +++ /dev/null @@ -1,675 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Text input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldTextInput'); - -goog.require('Blockly.BlockSvg.render'); -goog.require('Blockly.Colours'); -goog.require('Blockly.Field'); -goog.require('Blockly.Msg'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.utils'); - -goog.require('goog.asserts'); -goog.require('goog.dom'); -goog.require('goog.dom.TagName'); -goog.require('goog.userAgent'); - - -/** - * Class for an editable text field. - * @param {string} text The initial content of the field. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns either the accepted text, a replacement - * text, or null to abort the change. - * @param {RegExp=} opt_restrictor An optional regular expression to restrict - * typed text to. Text that doesn't match the restrictor will never show - * in the text field. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldTextInput = function(text, opt_validator, opt_restrictor) { - Blockly.FieldTextInput.superClass_.constructor.call(this, text, - opt_validator); - this.setRestrictor(opt_restrictor); - this.addArgType('text'); -}; -goog.inherits(Blockly.FieldTextInput, Blockly.Field); - -/** - * Construct a FieldTextInput from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (text, class, and - * spellcheck). - * @returns {!Blockly.FieldTextInput} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldTextInput.fromJson = function(options) { - var text = Blockly.utils.replaceMessageReferences(options['text']); - var field = new Blockly.FieldTextInput(text, options['class']); - if (typeof options['spellcheck'] === 'boolean') { - field.setSpellcheck(options['spellcheck']); - } - return field; -}; - -/** - * Length of animations in seconds. - */ -Blockly.FieldTextInput.ANIMATION_TIME = 0.25; - -/** - * Padding to use for text measurement for the field during editing, in px. - */ -Blockly.FieldTextInput.TEXT_MEASURE_PADDING_MAGIC = 45; - -/** - * The HTML input element for the user to type, or null if no FieldTextInput - * editor is currently open. - * @type {HTMLInputElement} - * @private - */ -Blockly.FieldTextInput.htmlInput_ = null; - -/** - * Mouse cursor style when over the hotspot that initiates the editor. - */ -Blockly.FieldTextInput.prototype.CURSOR = 'text'; - -/** - * Allow browser to spellcheck this field. - * @private - */ -Blockly.FieldTextInput.prototype.spellcheck_ = true; - -/** - * Install this text field on a block. - */ -Blockly.FieldTextInput.prototype.init = function() { - if (this.fieldGroup_) { - // Field has already been initialized once. - return; - } - - var notInShadow = !this.sourceBlock_.isShadow(); - - if (notInShadow) { - this.className_ += ' blocklyEditableLabel'; - } - - Blockly.FieldTextInput.superClass_.init.call(this); - - // If not in a shadow block, draw a box. - if (notInShadow) { - this.box_ = Blockly.utils.createSvgElement('rect', - { - 'x': 0, - 'y': 0, - 'width': this.size_.width, - 'height': this.size_.height, - 'fill': this.sourceBlock_.getColourTertiary() - } - ); - this.fieldGroup_.insertBefore(this.box_, this.textElement_); - } -}; - -/** - * Close the input widget if this input is being deleted. - */ -Blockly.FieldTextInput.prototype.dispose = function() { - Blockly.WidgetDiv.hideIfOwner(this); - Blockly.FieldTextInput.superClass_.dispose.call(this); -}; - -/** - * Set the value of this field. - * @param {?string} newValue New value. - * @override - */ -Blockly.FieldTextInput.prototype.setValue = function(newValue) { - if (newValue === null) { - return; // No change if null. - } - if (this.sourceBlock_) { - var validated = this.callValidator(newValue); - // If the new value is invalid, validation returns null. - // In this case we still want to display the illegal result. - if (validated !== null) { - newValue = validated; - } - } - Blockly.Field.prototype.setValue.call(this, newValue); -}; - -/** - * Set the text in this field and fire a change event. - * @param {*} newText New text. - */ -Blockly.FieldTextInput.prototype.setText = function(newText) { - if (newText === null) { - // No change if null. - return; - } - newText = String(newText); - if (newText === this.text_) { - // No change. - return; - } - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, this.text_, newText)); - } - Blockly.Field.prototype.setText.call(this, newText); -}; - -/** - * Set whether this field is spellchecked by the browser. - * @param {boolean} check True if checked. - */ -Blockly.FieldTextInput.prototype.setSpellcheck = function(check) { - this.spellcheck_ = check; -}; - -/** - * Set the restrictor regex for this text input. - * Text that doesn't match the restrictor will never show in the text field. - * @param {?RegExp} restrictor Regular expression to restrict text. - */ -Blockly.FieldTextInput.prototype.setRestrictor = function(restrictor) { - this.restrictor_ = restrictor; -}; - -/** - * Show the inline free-text editor on top of the text. - * @param {boolean=} opt_quietInput True if editor should be created without - * focus. Defaults to false. - * @param {boolean=} opt_readOnly True if editor should be created with HTML - * input set to read-only, to prevent virtual keyboards. - * @param {boolean=} opt_withArrow True to show drop-down arrow in text editor. - * @param {Function=} opt_arrowCallback Callback for when drop-down arrow clicked. - * @private - */ -Blockly.FieldTextInput.prototype.showEditor_ = function( - opt_quietInput, opt_readOnly, opt_withArrow, opt_arrowCallback) { - this.workspace_ = this.sourceBlock_.workspace; - var quietInput = opt_quietInput || false; - var readOnly = opt_readOnly || false; - Blockly.WidgetDiv.show(this, this.sourceBlock_.RTL, - this.widgetDispose_(), this.widgetDisposeAnimationFinished_(), - Blockly.FieldTextInput.ANIMATION_TIME); - var div = Blockly.WidgetDiv.DIV; - // Apply text-input-specific fixed CSS - div.className += ' fieldTextInput'; - // Create the input. - var htmlInput = - goog.dom.createDom(goog.dom.TagName.INPUT, 'blocklyHtmlInput'); - htmlInput.setAttribute('spellcheck', this.spellcheck_); - if (readOnly) { - htmlInput.setAttribute('readonly', 'true'); - } - /** @type {!HTMLInputElement} */ - Blockly.FieldTextInput.htmlInput_ = htmlInput; - div.appendChild(htmlInput); - - if (opt_withArrow) { - // Move text in input to account for displayed drop-down arrow. - if (this.sourceBlock_.RTL) { - htmlInput.style.paddingLeft = (this.arrowSize_ + Blockly.BlockSvg.DROPDOWN_ARROW_PADDING) + 'px'; - } else { - htmlInput.style.paddingRight = (this.arrowSize_ + Blockly.BlockSvg.DROPDOWN_ARROW_PADDING) + 'px'; - } - // Create the arrow. - var dropDownArrow = - goog.dom.createDom(goog.dom.TagName.IMG, 'blocklyTextDropDownArrow'); - dropDownArrow.setAttribute('src', - Blockly.mainWorkspace.options.pathToMedia + 'dropdown-arrow-dark.svg'); - dropDownArrow.style.width = this.arrowSize_ + 'px'; - dropDownArrow.style.height = this.arrowSize_ + 'px'; - dropDownArrow.style.top = this.arrowY_ + 'px'; - dropDownArrow.style.cursor = 'pointer'; - // Magic number for positioning the drop-down arrow on top of the text editor. - var dropdownArrowMagic = '11px'; - if (this.sourceBlock_.RTL) { - dropDownArrow.style.left = dropdownArrowMagic; - } else { - dropDownArrow.style.right = dropdownArrowMagic; - } - if (opt_arrowCallback) { - htmlInput.dropDownArrowMouseWrapper_ = Blockly.bindEvent_(dropDownArrow, - 'mousedown', this, opt_arrowCallback); - } - div.appendChild(dropDownArrow); - } - - htmlInput.value = htmlInput.defaultValue = this.text_; - htmlInput.oldValue_ = null; - this.validate_(); - this.resizeEditor_(); - if (!quietInput) { - htmlInput.focus(); - htmlInput.select(); - // For iOS only - htmlInput.setSelectionRange(0, 99999); - } - - this.bindEvents_(htmlInput, quietInput || readOnly); - - // Add animation transition properties - var transitionProperties = 'box-shadow ' + Blockly.FieldTextInput.ANIMATION_TIME + 's'; - if (Blockly.BlockSvg.FIELD_TEXTINPUT_ANIMATE_POSITIONING) { - div.style.transition += ',padding ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + - 'width ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + - 'height ' + Blockly.FieldTextInput.ANIMATION_TIME + 's,' + - 'margin-left ' + Blockly.FieldTextInput.ANIMATION_TIME + 's'; - } - div.style.transition = transitionProperties; - htmlInput.style.transition = 'font-size ' + Blockly.FieldTextInput.ANIMATION_TIME + 's'; - // The animated properties themselves - htmlInput.style.fontSize = Blockly.BlockSvg.FIELD_TEXTINPUT_FONTSIZE_FINAL + 'pt'; - div.style.boxShadow = '0px 0px 0px 4px ' + Blockly.Colours.fieldShadow; -}; - -/** - * Bind handlers for user input on this field and size changes on the workspace. - * @param {!HTMLInputElement} htmlInput The htmlInput created in showEditor, to - * which event handlers will be bound. - * @param {boolean} bindGlobalKeypress Whether to bind a keypress listener to enable - * keyboard editing without focusing the field. - * @private - */ -Blockly.FieldTextInput.prototype.bindEvents_ = function( - htmlInput, bindGlobalKeypress) { - // Bind to keydown -- trap Enter without IME and Esc to hide. - htmlInput.onKeyDownWrapper_ = - Blockly.bindEventWithChecks_(htmlInput, 'keydown', this, - this.onHtmlInputKeyDown_); - // Bind to keyup -- trap Enter; resize after every keystroke. - htmlInput.onKeyUpWrapper_ = - Blockly.bindEventWithChecks_(htmlInput, 'keyup', this, - this.onHtmlInputChange_); - // Bind to keyPress -- repeatedly resize when holding down a key. - htmlInput.onKeyPressWrapper_ = - Blockly.bindEventWithChecks_(htmlInput, 'keypress', this, - this.onHtmlInputChange_); - // For modern browsers (IE 9+, Chrome, Firefox, etc.) that support the - // DOM input event, also trigger onHtmlInputChange_ then. The input event - // is triggered on keypress but after the value of the text input - // has updated, allowing us to resize the block at that time. - htmlInput.onInputWrapper_ = - Blockly.bindEvent_(htmlInput, 'input', this, this.onHtmlInputChange_); - htmlInput.onWorkspaceChangeWrapper_ = this.resizeEditor_.bind(this); - this.workspace_.addChangeListener(htmlInput.onWorkspaceChangeWrapper_); - - if (bindGlobalKeypress) { - htmlInput.onDocumentKeyDownWrapper_ = - Blockly.bindEventWithChecks_(document, 'keydown', this, - this.onDocumentKeyDown_); - } -}; - -/** - * Unbind handlers for user input and workspace size changes. - * @param {!HTMLInputElement} htmlInput The html for this text input. - * @private - */ -Blockly.FieldTextInput.prototype.unbindEvents_ = function(htmlInput) { - Blockly.unbindEvent_(htmlInput.onKeyDownWrapper_); - Blockly.unbindEvent_(htmlInput.onKeyUpWrapper_); - Blockly.unbindEvent_(htmlInput.onKeyPressWrapper_); - Blockly.unbindEvent_(htmlInput.onInputWrapper_); - this.workspace_.removeChangeListener( - htmlInput.onWorkspaceChangeWrapper_); - - // Remove document handler only if it was added (e.g. in quiet mode) - if (htmlInput.onDocumentKeyDownWrapper_) { - Blockly.unbindEvent_(htmlInput.onDocumentKeyDownWrapper_); - } -}; - -/** - * Handle key down to the editor. - * @param {!Event} e Keyboard event. - * @private - */ -Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_ = function(e) { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - var tabKey = 9, enterKey = 13, escKey = 27; - if (e.keyCode == enterKey) { - Blockly.WidgetDiv.hide(); - Blockly.DropDownDiv.hideWithoutAnimation(); - } else if (e.keyCode == escKey) { - htmlInput.value = htmlInput.defaultValue; - Blockly.WidgetDiv.hide(); - Blockly.DropDownDiv.hideWithoutAnimation(); - } else if (e.keyCode == tabKey) { - Blockly.WidgetDiv.hide(); - Blockly.DropDownDiv.hideWithoutAnimation(); - this.sourceBlock_.tab(this, !e.shiftKey); - e.preventDefault(); - } -}; - -Blockly.FieldTextInput.prototype.onDocumentKeyDown_ = function(e) { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - var targetMatches = e.target === htmlInput; - var targetIsInput = e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA'; - if (targetMatches || !targetIsInput) { // Ignore keys into other inputs - htmlInput.removeAttribute('readonly'); - htmlInput.value = ''; // Reset the input, new value is picked up by input keypress - htmlInput.focus(); - Blockly.unbindEvent_(htmlInput.onDocumentKeyDownWrapper_); - htmlInput.onDocumentKeyDownWrapper_ = null; - } -}; - -/** - * Key codes that are whitelisted from the restrictor. - * These are only needed and used on Gecko (Firefox). - * See: https://github.com/LLK/scratch-blocks/issues/503. - */ -Blockly.FieldTextInput.GECKO_KEYCODE_WHITELIST = [ - 97, // Select all, META-A. - 99, // Copy, META-C. - 118, // Paste, META-V. - 120 // Cut, META-X. -]; - -/** - * Handle a change to the editor. - * @param {!Event} e Keyboard event. - * @private - */ -Blockly.FieldTextInput.prototype.onHtmlInputChange_ = function(e) { - // Check if the key matches the restrictor. - if (e.type === 'keypress' && this.restrictor_) { - var keyCode; - var isWhitelisted = false; - if (goog.userAgent.GECKO) { - // e.keyCode is not available in Gecko. - keyCode = e.charCode; - // Gecko reports control characters (e.g., left, right, copy, paste) - // in the key event - whitelist these from being restricted. - // < 32 and 127 (delete) are control characters. - // See: http://www.theasciicode.com.ar/ascii-control-characters/delete-ascii-code-127.html - if (keyCode < 32 || keyCode == 127) { - isWhitelisted = true; - } else if (e.metaKey || e.ctrlKey) { - // For combos (ctrl-v, ctrl-c, etc.), Gecko reports the ASCII letter - // and the metaKey/ctrlKey flags. - isWhitelisted = Blockly.FieldTextInput.GECKO_KEYCODE_WHITELIST.indexOf(keyCode) > -1; - } - } else { - keyCode = e.keyCode; - } - var char = String.fromCharCode(keyCode); - if (!isWhitelisted && !this.restrictor_.test(char) && e.preventDefault) { - // Failed to pass restrictor. - e.preventDefault(); - return; - } - } - var htmlInput = Blockly.FieldTextInput.htmlInput_; - // Update source block. - var text = htmlInput.value; - if (text !== htmlInput.oldValue_) { - htmlInput.oldValue_ = text; - this.setText(text); - this.validate_(); - } else if (goog.userAgent.WEBKIT) { - // Cursor key. Render the source block to show the caret moving. - // Chrome only (version 26, OS X). - this.sourceBlock_.render(); - } - this.resizeEditor_(); -}; - -/** - * Check to see if the contents of the editor validates. - * Style the editor accordingly. - * @private - */ -Blockly.FieldTextInput.prototype.validate_ = function() { - var valid = true; - goog.asserts.assertObject(Blockly.FieldTextInput.htmlInput_); - var htmlInput = Blockly.FieldTextInput.htmlInput_; - if (this.sourceBlock_) { - valid = this.callValidator(htmlInput.value); - } - if (valid === null) { - Blockly.utils.addClass(htmlInput, 'blocklyInvalidInput'); - } else { - Blockly.utils.removeClass(htmlInput, 'blocklyInvalidInput'); - } -}; - -/** - * Resize the editor and the underlying block to fit the text. - * @private - */ -Blockly.FieldTextInput.prototype.resizeEditor_ = function() { - var scale = this.sourceBlock_.workspace.scale; - var div = Blockly.WidgetDiv.DIV; - - var initialWidth; - if (this.sourceBlock_.isShadow()) { - initialWidth = this.sourceBlock_.getHeightWidth().width * scale; - } else { - initialWidth = this.size_.width * scale; - } - - var width; - if (Blockly.BlockSvg.FIELD_TEXTINPUT_EXPAND_PAST_TRUNCATION) { - // Resize the box based on the measured width of the text, pre-truncation - var textWidth = Blockly.scratchBlocksUtils.measureText( - Blockly.FieldTextInput.htmlInput_.style.fontSize, - Blockly.FieldTextInput.htmlInput_.style.fontFamily, - Blockly.FieldTextInput.htmlInput_.style.fontWeight, - Blockly.FieldTextInput.htmlInput_.value - ); - // Size drawn in the canvas needs padding and scaling - textWidth += Blockly.FieldTextInput.TEXT_MEASURE_PADDING_MAGIC; - textWidth *= scale; - width = textWidth; - } else { - // Set width to (truncated) block size. - width = initialWidth; - } - // The width must be at least FIELD_WIDTH and at most FIELD_WIDTH_MAX_EDIT - width = Math.max(width, Blockly.BlockSvg.FIELD_WIDTH_MIN_EDIT * scale); - width = Math.min(width, Blockly.BlockSvg.FIELD_WIDTH_MAX_EDIT * scale); - // Add 1px to width and height to account for border (pre-scale) - div.style.width = (width / scale + 1) + 'px'; - div.style.height = (Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT + 1) + 'px'; - div.style.transform = 'scale(' + scale + ')'; - - // Use margin-left to animate repositioning of the box (value is unscaled). - // This is the difference between the default position and the positioning - // after growing the box. - div.style.marginLeft = -0.5 * (width - initialWidth) + 'px'; - - // Add 0.5px to account for slight difference between SVG and CSS border - var borderRadius = this.getBorderRadius() + 0.5; - div.style.borderRadius = borderRadius + 'px'; - Blockly.FieldTextInput.htmlInput_.style.borderRadius = borderRadius + 'px'; - // Pull stroke colour from the existing shadow block - var strokeColour = this.sourceBlock_.getColourTertiary(); - div.style.borderColor = strokeColour; - - var xy = this.getAbsoluteXY_(); - // Account for border width, post-scale - xy.x -= scale / 2; - xy.y -= scale / 2; - // In RTL mode block fields and LTR input fields the left edge moves, - // whereas the right edge is fixed. Reposition the editor. - if (this.sourceBlock_.RTL) { - xy.x += width; - xy.x -= div.offsetWidth * scale; - xy.x += 1 * scale; - } - // Shift by a few pixels to line up exactly. - xy.y += 1 * scale; - if (goog.userAgent.GECKO && Blockly.WidgetDiv.DIV.style.top) { - // Firefox mis-reports the location of the border by a pixel - // once the WidgetDiv is moved into position. - xy.x += 2 * scale; - xy.y += 1 * scale; - } - if (goog.userAgent.WEBKIT) { - xy.y -= 1 * scale; - } - // Finally, set the actual style - div.style.left = xy.x + 'px'; - div.style.top = xy.y + 'px'; -}; - -/** - * Border radius for drawing this field, called when rendering the owning shadow block. - * @return {Number} Border radius in px. -*/ -Blockly.FieldTextInput.prototype.getBorderRadius = function() { - if (this.sourceBlock_.getOutputShape() == Blockly.OUTPUT_SHAPE_ROUND) { - return Blockly.BlockSvg.NUMBER_FIELD_CORNER_RADIUS; - } - return Blockly.BlockSvg.TEXT_FIELD_CORNER_RADIUS; -}; - -/** - * Close the editor, save the results, and start animating the disposal of elements. - * @return {!Function} Closure to call on destruction of the WidgetDiv. - * @private - */ -Blockly.FieldTextInput.prototype.widgetDispose_ = function() { - var thisField = this; - return function() { - var div = Blockly.WidgetDiv.DIV; - var htmlInput = Blockly.FieldTextInput.htmlInput_; - // Save the edit (if it validates). - thisField.maybeSaveEdit_(); - - thisField.unbindEvents_(htmlInput); - if (htmlInput.dropDownArrowMouseWrapper_) { - Blockly.unbindEvent_(htmlInput.dropDownArrowMouseWrapper_); - } - Blockly.Events.setGroup(false); - - // Animation of disposal - htmlInput.style.fontSize = Blockly.BlockSvg.FIELD_TEXTINPUT_FONTSIZE_INITIAL + 'pt'; - div.style.boxShadow = ''; - // Resize to actual size of final source block. - if (thisField.sourceBlock_) { - if (thisField.sourceBlock_.isShadow()) { - var size = thisField.sourceBlock_.getHeightWidth(); - div.style.width = (size.width + 1) + 'px'; - div.style.height = (size.height + 1) + 'px'; - } else { - div.style.width = (thisField.size_.width + 1) + 'px'; - div.style.height = (Blockly.BlockSvg.FIELD_HEIGHT_MAX_EDIT + 1) + 'px'; - } - } - div.style.marginLeft = 0; - }; -}; - -/** - * Final disposal of the text field's elements and properties. - * @return {!Function} Closure to call on finish animation of the WidgetDiv. - * @private - */ -Blockly.FieldTextInput.prototype.widgetDisposeAnimationFinished_ = function() { - return function() { - // Delete style properties. - var style = Blockly.WidgetDiv.DIV.style; - style.width = 'auto'; - style.height = 'auto'; - style.fontSize = ''; - // Reset class - Blockly.WidgetDiv.DIV.className = 'blocklyWidgetDiv'; - // Remove all styles - Blockly.WidgetDiv.DIV.removeAttribute('style'); - Blockly.FieldTextInput.htmlInput_.style.transition = ''; - Blockly.FieldTextInput.htmlInput_ = null; - }; -}; - -Blockly.FieldTextInput.prototype.maybeSaveEdit_ = function() { - var htmlInput = Blockly.FieldTextInput.htmlInput_; - // Save the edit (if it validates). - var text = htmlInput.value; - if (this.sourceBlock_) { - var text1 = this.callValidator(text); - if (text1 === null) { - // Invalid edit. - text = htmlInput.defaultValue; - } else { - // Validation function has changed the text. - text = text1; - if (this.onFinishEditing_) { - this.onFinishEditing_(text); - } - } - } - this.setText(text); - this.sourceBlock_.rendered && this.sourceBlock_.render(); -}; - -/** - * Ensure that only a number may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid number, or null if invalid. - */ -Blockly.FieldTextInput.numberValidator = function(text) { - console.warn('Blockly.FieldTextInput.numberValidator is deprecated. ' + - 'Use Blockly.FieldNumber instead.'); - if (text === null) { - return null; - } - text = String(text); - // TODO: Handle cases like 'ten', '1.203,14', etc. - // 'O' is sometimes mistaken for '0' by inexperienced users. - text = text.replace(/O/ig, '0'); - // Strip out thousands separators. - text = text.replace(/,/g, ''); - var n = parseFloat(text || 0); - return isNaN(n) ? null : String(n); -}; - -/** - * Ensure that only a nonnegative integer may be entered. - * @param {string} text The user's text. - * @return {?string} A string representing a valid int, or null if invalid. - */ -Blockly.FieldTextInput.nonnegativeIntegerValidator = function(text) { - var n = Blockly.FieldTextInput.numberValidator(text); - if (n) { - n = String(Math.max(0, Math.floor(n))); - } - return n; -}; - -Blockly.Field.register('field_input', Blockly.FieldTextInput); diff --git a/packages/scratch-blocks/core/field_textinput_removable.js b/packages/scratch-blocks/core/field_textinput_removable.js deleted file mode 100644 index a37e07184..000000000 --- a/packages/scratch-blocks/core/field_textinput_removable.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Massachusetts Institute of Technology - * 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. - */ - -/** - * @fileoverview Text input field with floating "remove" button. - * @author pkaplan@media.mit.edu (Paul Kaplan) - */ -'use strict'; - -goog.provide('Blockly.FieldTextInputRemovable'); - -goog.require('Blockly.BlockSvg.render'); -goog.require('Blockly.Colours'); -goog.require('Blockly.FieldTextInput'); -goog.require('Blockly.Msg'); -goog.require('Blockly.utils'); -goog.require('goog.dom'); -goog.require('goog.dom.TagName'); - -/** - * Class for an editable text field displaying a deletion icon when selected. - * @param {string} text The initial content of the field. - * @param {Function=} opt_validator An optional function that is called - * to validate any constraints on what the user entered. Takes the new - * text as an argument and returns either the accepted text, a replacement - * text, or null to abort the change. - * @param {RegExp=} opt_restrictor An optional regular expression to restrict - * typed text to. Text that doesn't match the restrictor will never show - * in the text field. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -Blockly.FieldTextInputRemovable = function(text, opt_validator, opt_restrictor) { - Blockly.FieldTextInputRemovable.superClass_.constructor.call(this, text, - opt_validator, opt_restrictor); -}; -goog.inherits(Blockly.FieldTextInputRemovable, Blockly.FieldTextInput); - -/** - * Show the inline free-text editor on top of the text with the remove button. - * @private - */ -Blockly.FieldTextInputRemovable.prototype.showEditor_ = function() { - Blockly.FieldTextInputRemovable.superClass_.showEditor_.call(this); - - var div = Blockly.WidgetDiv.DIV; - div.className += ' removableTextInput'; - var removeButton = - goog.dom.createDom(goog.dom.TagName.IMG, 'blocklyTextRemoveIcon'); - removeButton.setAttribute('src', - Blockly.mainWorkspace.options.pathToMedia + 'icons/remove.svg'); - this.removeButtonMouseWrapper_ = Blockly.bindEvent_(removeButton, - 'mousedown', this, this.removeCallback_); - div.appendChild(removeButton); -}; - -/** - * Function to call when remove button is called. Checks for removeFieldCallback - * on sourceBlock and calls it if possible. - * @private - */ -Blockly.FieldTextInputRemovable.prototype.removeCallback_ = function() { - if (this.sourceBlock_ && this.sourceBlock_.removeFieldCallback) { - this.sourceBlock_.removeFieldCallback(this); - } else { - console.warn('Expected a source block with removeFieldCallback'); - } -}; - -/** - * Helper function to construct a FieldTextInputRemovable from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (text, class, and - * spellcheck). - * @returns {!Blockly.FieldTextInputRemovable} The new text input. - * @public - */ -Blockly.FieldTextInputRemovable.fromJson = function(options) { - var text = Blockly.utils.replaceMessageReferences(options['text']); - var field = new Blockly.FieldTextInputRemovable(text, options['class']); - if (typeof options['spellcheck'] == 'boolean') { - field.setSpellcheck(options['spellcheck']); - } - return field; -}; - -Blockly.Field.register( - 'field_input_removable', Blockly.FieldTextInputRemovable); diff --git a/packages/scratch-blocks/core/field_variable.js b/packages/scratch-blocks/core/field_variable.js deleted file mode 100644 index c188482bd..000000000 --- a/packages/scratch-blocks/core/field_variable.js +++ /dev/null @@ -1,385 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Variable input field. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.FieldVariable'); - -goog.require('Blockly.FieldDropdown'); -goog.require('Blockly.Msg'); -goog.require('Blockly.VariableModel'); -goog.require('Blockly.Variables'); -goog.require('goog.asserts'); -goog.require('goog.string'); - - -/** - * Class for a variable's dropdown field. - * @param {?string} varname The default name for the variable. If null, - * a unique variable name will be generated. - * @param {Function=} opt_validator A function that is executed when a new - * option is selected. Its sole argument is the new option value. - * @param {Array.} opt_variableTypes A list of the types of variables to - * include in the dropdown. - * @extends {Blockly.FieldDropdown} - * @constructor - */ -Blockly.FieldVariable = function(varname, opt_validator, opt_variableTypes) { - // The FieldDropdown constructor would call setValue, which might create a - // spurious variable. Just do the relevant parts of the constructor. - this.menuGenerator_ = Blockly.FieldVariable.dropdownCreate; - this.size_ = new goog.math.Size(Blockly.BlockSvg.FIELD_WIDTH, - Blockly.BlockSvg.FIELD_HEIGHT); - this.setValidator(opt_validator); - // TODO (blockly #1499): Add opt_default_type to match default value. - // If not set, ''. - this.defaultVariableName = (varname || ''); - var hasSingleVarType = opt_variableTypes && (opt_variableTypes.length == 1); - this.defaultType_ = hasSingleVarType ? opt_variableTypes[0] : ''; - this.variableTypes = opt_variableTypes; - this.addArgType('variable'); - - this.value_ = null; -}; -goog.inherits(Blockly.FieldVariable, Blockly.FieldDropdown); - -/** - * Construct a FieldVariable from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (variable, - * variableTypes, and defaultType). - * @returns {!Blockly.FieldVariable} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldVariable.fromJson = function(options) { - var varname = Blockly.utils.replaceMessageReferences(options['variable']); - var variableTypes = options['variableTypes']; - return new Blockly.FieldVariable(varname, null, variableTypes); -}; - -/** - * Initialize everything needed to render this field. This includes making sure - * that the field's value is valid. - * @public - */ -Blockly.FieldVariable.prototype.init = function() { - if (this.fieldGroup_) { - // Dropdown has already been initialized once. - return; - } - Blockly.FieldVariable.superClass_.init.call(this); - - // TODO (blockly #1010): Change from init/initModel to initView/initModel - this.initModel(); -}; - -/** - * Initialize the model for this field if it has not already been initialized. - * If the value has not been set to a variable by the first render, we make up a - * variable rather than let the value be invalid. - * @package - */ -Blockly.FieldVariable.prototype.initModel = function() { - if (this.variable_) { - return; // Initialization already happened. - } - this.workspace_ = this.sourceBlock_.workspace; - // Initialize this field if it's in a broadcast block in the flyout - var variable = this.initFlyoutBroadcast_(this.workspace_); - if (!variable) { - var variable = Blockly.Variables.getOrCreateVariablePackage( - this.workspace_, null, this.defaultVariableName, this.defaultType_); - } - // Don't fire a change event for this setValue. It would have null as the - // old value, which is not valid. - Blockly.Events.disable(); - try { - this.setValue(variable.getId()); - } finally { - Blockly.Events.enable(); - } -}; - -/** - * Initialize broadcast blocks in the flyout. - * Implicit deletion of broadcast messages from the scratch vm may cause - * broadcast blocks in the flyout to change which variable they display as the - * selected option when the workspace is refreshed. - * Re-sort the broadcast messages by name, and set the field value to the id - * of the variable that comes first in sorted order. - * @param {!Blockly.Workspace} workspace The flyout workspace containing the - * broadcast block. - * @return {string} The variable of type 'broadcast_msg' that comes - * first in sorted order. - */ -Blockly.FieldVariable.prototype.initFlyoutBroadcast_ = function(workspace) { - // Using shorter name for this constant - var broadcastMsgType = Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE; - var broadcastVars = workspace.getVariablesOfType(broadcastMsgType); - if(workspace.isFlyout && this.defaultType_ == broadcastMsgType && - broadcastVars.length != 0) { - broadcastVars.sort(Blockly.VariableModel.compareByName); - return broadcastVars[0]; - } -}; - -/** - * Dispose of this field. - * @public - */ -Blockly.FieldVariable.dispose = function() { - Blockly.FieldVariable.superClass_.dispose.call(this); - this.workspace_ = null; - this.variableMap_ = null; -}; - -/** - * Attach this field to a block. - * @param {!Blockly.Block} block The block containing this field. - */ -Blockly.FieldVariable.prototype.setSourceBlock = function(block) { - goog.asserts.assert(!block.isShadow(), - 'Variable fields are not allowed to exist on shadow blocks.'); - Blockly.FieldVariable.superClass_.setSourceBlock.call(this, block); -}; - -/** - * Get the variable's ID. - * @return {string} Current variable's ID. - */ -Blockly.FieldVariable.prototype.getValue = function() { - return this.variable_ ? this.variable_.getId() : null; -}; - -/** - * Get the text from this field, which is the selected variable's name. - * @return {string} The selected variable's name, or the empty string if no - * variable is selected. - */ -Blockly.FieldVariable.prototype.getText = function() { - return this.variable_ ? this.variable_.name : ''; -}; - -/** - * Get the variable model for the selected variable. - * Not guaranteed to be in the variable map on the workspace (e.g. if accessed - * after the variable has been deleted). - * @return {?Blockly.VariableModel} the selected variable, or null if none was - * selected. - * @package - */ -Blockly.FieldVariable.prototype.getVariable = function() { - return this.variable_; -}; - -/** - * Set the variable ID. - * @param {string} id New variable ID, which must reference an existing - * variable. - */ -Blockly.FieldVariable.prototype.setValue = function(id) { - var workspace = this.sourceBlock_.workspace; - var variable = Blockly.Variables.getVariable(workspace, id); - - if (!variable) { - throw new Error('Variable id doesn\'t point to a real variable! ID was ' + - id); - } - // Type checks! - var type = variable.type; - if (!this.typeIsAllowed_(type)) { - throw new Error('Variable type doesn\'t match this field! Type was ' + - type); - } - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - var oldValue = this.variable_ ? this.variable_.getId() : null; - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, oldValue, id)); - } - this.variable_ = variable; - this.value_ = id; - this.setText(variable.name); -}; - -/** - * Check whether the given variable type is allowed on this field. - * @param {string} type The type to check. - * @return {boolean} True if the type is in the list of allowed types. - * @private - */ -Blockly.FieldVariable.prototype.typeIsAllowed_ = function(type) { - var typeList = this.getVariableTypes_(); - if (!typeList) { - return true; // If it's null, all types are valid. - } - for (var i = 0; i < typeList.length; i++) { - if (type == typeList[i]) { - return true; - } - } - return false; -}; - -/** - * Return a list of variable types to include in the dropdown. - * @return {!Array.} Array of variable types. - * @throws {Error} if variableTypes is an empty array. - * @private - */ -Blockly.FieldVariable.prototype.getVariableTypes_ = function() { - // TODO (#1513): Try to avoid calling this every time the field is edited. - var variableTypes = this.variableTypes; - if (variableTypes === null) { - // If variableTypes is null, return all variable types. - if (this.sourceBlock_) { - var workspace = this.sourceBlock_.workspace; - return workspace.getVariableTypes(); - } - } - variableTypes = variableTypes || ['']; - if (variableTypes.length == 0) { - // Throw an error if variableTypes is an empty list. - var name = this.getText(); - throw new Error('\'variableTypes\' of field variable ' + - name + ' was an empty list'); - } - return variableTypes; -}; - -/** - * Return a sorted list of variable names for variable dropdown menus. - * Include a special option at the end for creating a new variable name. - * @return {!Array.} Array of variable names. - * @this {Blockly.FieldVariable} - */ -Blockly.FieldVariable.dropdownCreate = function() { - if (!this.variable_) { - throw new Error('Tried to call dropdownCreate on a variable field with no' + - ' variable selected.'); - } - var variableModelList = []; - var name = this.getText(); - var workspace = null; - if (this.sourceBlock_) { - workspace = this.sourceBlock_.workspace; - } - if (workspace) { - var variableTypes = this.getVariableTypes_(); - var variableModelList = []; - // Get a copy of the list, so that adding rename and new variable options - // doesn't modify the workspace's list. - for (var i = 0; i < variableTypes.length; i++) { - var variableType = variableTypes[i]; - var variables = workspace.getVariablesOfType(variableType); - variableModelList = variableModelList.concat(variables); - - var potentialVarMap = workspace.getPotentialVariableMap(); - if (potentialVarMap) { - var potentialVars = potentialVarMap.getVariablesOfType(variableType); - variableModelList = variableModelList.concat(potentialVars); - } - } - } - variableModelList.sort(Blockly.VariableModel.compareByName); - - var options = []; - for (var i = 0; i < variableModelList.length; i++) { - // Set the uuid as the internal representation of the variable. - options[i] = [variableModelList[i].name, variableModelList[i].getId()]; - } - if (this.defaultType_ == Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE) { - options.unshift( - [Blockly.Msg.NEW_BROADCAST_MESSAGE, Blockly.NEW_BROADCAST_MESSAGE_ID]); - } else { - // Scalar variables and lists have the same backing action, but the option - // text is different. - if (this.defaultType_ == Blockly.LIST_VARIABLE_TYPE) { - var renameText = Blockly.Msg.RENAME_LIST; - var deleteText = Blockly.Msg.DELETE_LIST; - } else { - var renameText = Blockly.Msg.RENAME_VARIABLE; - var deleteText = Blockly.Msg.DELETE_VARIABLE; - } - options.push([renameText, Blockly.RENAME_VARIABLE_ID]); - if (deleteText) { - options.push( - [ - deleteText.replace('%1', name), - Blockly.DELETE_VARIABLE_ID - ]); - } - } - - return options; -}; - -/** - * Handle the selection of an item in the variable dropdown menu. - * Special case the 'Rename variable...', 'Delete variable...', - * and 'New message...' options. - * In the rename case, prompt the user for a new name. - * @param {!goog.ui.Menu} menu The Menu component clicked. - * @param {!goog.ui.MenuItem} menuItem The MenuItem selected within menu. - */ -Blockly.FieldVariable.prototype.onItemSelected = function(menu, menuItem) { - var id = menuItem.getValue(); - if (this.sourceBlock_ && this.sourceBlock_.workspace) { - var workspace = this.sourceBlock_.workspace; - if (id == Blockly.RENAME_VARIABLE_ID) { - // Rename variable. - Blockly.Variables.renameVariable(workspace, this.variable_); - return; - } else if (id == Blockly.DELETE_VARIABLE_ID) { - // Delete variable. - workspace.deleteVariableById(this.variable_.getId()); - return; - } else if (id == Blockly.NEW_BROADCAST_MESSAGE_ID) { - var thisField = this; - var updateField = function(varId) { - if (varId) { - thisField.setValue(varId); - } - }; - Blockly.Variables.createVariable(workspace, updateField, - Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE); - return; - } - - // TODO (blockly #1529): Call any validation function, and allow it to override. - } - this.setValue(id); -}; - -/** - * Overrides referencesVariables(), indicating this field refers to a variable. - * @return {boolean} True. - * @package - * @override - */ -Blockly.FieldVariable.prototype.referencesVariables = function() { - return true; -}; - -Blockly.Field.register('field_variable', Blockly.FieldVariable); diff --git a/packages/scratch-blocks/core/field_variable_getter.js b/packages/scratch-blocks/core/field_variable_getter.js deleted file mode 100644 index 93721289f..000000000 --- a/packages/scratch-blocks/core/field_variable_getter.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Variable getter field. Appears as a label but has a variable - * picker in the right-click menu. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.FieldVariableGetter'); - -goog.require('Blockly.Field'); - - -/** - * Class for a variable getter field. - * @param {string} text The initial content of the field. - * @param {string} name Optional CSS class for the field's text. - * @param {string} opt_varType The type of variable this field is associated with. - * @extends {Blockly.FieldLabel} - * @constructor - * - */ -Blockly.FieldVariableGetter = function(text, name, opt_varType) { - this.size_ = new goog.math.Size(Blockly.BlockSvg.FIELD_WIDTH, - Blockly.BlockSvg.FIELD_HEIGHT); - this.text_ = text; - - /** - * Maximum characters of text to display before adding an ellipsis. - * Same for strings and numbers. - * @type {number} - */ - this.maxDisplayLength = Blockly.BlockSvg.MAX_DISPLAY_LENGTH; - - this.name_ = name; - this.variableType_ = opt_varType ? opt_varType : ''; -}; -goog.inherits(Blockly.FieldVariableGetter, Blockly.Field); - -/** - * Construct a FieldVariableGetter from a JSON arg object, - * dereferencing any string table references. - * @param {!Object} options A JSON object with options (variable, - * variableTypes, and defaultType). - * @returns {!Blockly.FieldVariableGetter} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldVariableGetter.fromJson = function(options) { - var varname = Blockly.utils.replaceMessageReferences(options['text']); - return new Blockly.FieldVariableGetter(varname, options['name'], - options['class'], options['variableType']); -}; - -/** - * Editable fields usually show some sort of UI for the user to change them. - * This field should be serialized, but only edited programmatically. - * @type {boolean} - * @public - */ -Blockly.FieldVariableGetter.prototype.EDITABLE = false; - -/** - * Serializable fields are saved by the XML renderer, non-serializable fields - * are not. This field should be serialized, but only edited programmatically. - * @type {boolean} - * @public - */ -Blockly.FieldVariableGetter.prototype.SERIALIZABLE = true; - -/** - * Install this field on a block. - */ -Blockly.FieldVariableGetter.prototype.init = function() { - if (this.fieldGroup_) { - // Field has already been initialized once. - return; - } - Blockly.FieldVariableGetter.superClass_.init.call(this); - if (this.variable_) { - return; // Initialization already happened. - } - this.workspace_ = this.sourceBlock_.workspace; - var variable = Blockly.Variables.getOrCreateVariablePackage( - this.workspace_, null, this.text_, this.variableType_); - this.setValue(variable.getId()); -}; - -/** - * Get the variable's ID. - * @return {string} Current variable's ID. - */ -Blockly.FieldVariableGetter.prototype.getValue = function() { - return this.variable_ ? this.variable_.getId() : ''; -}; - -/** - * Get the text from this field. - * @return {string} Current text. - */ -Blockly.FieldVariableGetter.prototype.getText = function() { - return this.variable_ ? this.variable_.name : ''; -}; - -/** - * Get the variable model for the variable associated with this field. - * Not guaranteed to be in the variable map on the workspace (e.g. if accessed - * after the variable has been deleted). - * @return {?Blockly.VariableModel} the selected variable, or null if none was - * selected. - * @package - */ -Blockly.FieldVariableGetter.prototype.getVariable = function() { - return this.variable_; -}; - -Blockly.FieldVariableGetter.prototype.setValue = function(id) { - // What do I do when id is null? That happens when undoing a change event - // for the first time the value was set. - var workspace = this.sourceBlock_.workspace; - var variable = Blockly.Variables.getVariable(workspace, id); - - if (!variable) { - throw new Error('Variable id doesn\'t point to a real variable! ID was ' + - id); - } - - if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - var oldValue = this.variable_ ? this.variable_.getId() : null; - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.sourceBlock_, 'field', this.name, oldValue, variable.getId())); - } - this.variable_ = variable; - this.value_ = id; - this.setText(variable.name); -}; - -/** - * This field is editable, but only through the right-click menu. - * @private - */ -Blockly.FieldVariableGetter.prototype.showEditor_ = function() { - // nop. -}; - -/** - * Add or remove the UI indicating if this field is editable or not. - * This field is editable, but only through the right-click menu. - * Suppress default editable behaviour. - */ -Blockly.FieldVariableGetter.prototype.updateEditable = function() { - // nop. -}; - -/** - * Whether this field references any Blockly variables. If true it may need to - * be handled differently during serialization and deserialization. Subclasses - * may override this. - * @return {boolean} True if this field has any variable references. - * @package - */ -Blockly.FieldVariableGetter.prototype.referencesVariables = function() { - return true; -}; - -Blockly.Field.register('field_variable_getter', Blockly.FieldVariableGetter); diff --git a/packages/scratch-blocks/core/field_vertical_separator.js b/packages/scratch-blocks/core/field_vertical_separator.js deleted file mode 100644 index cde897d61..000000000 --- a/packages/scratch-blocks/core/field_vertical_separator.js +++ /dev/null @@ -1,161 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Massachusetts Institute of Technology - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Vertical separator field. Draws a vertical line. - * @author ericr@media.mit.edu (Eric Rosenbaum) - */ -'use strict'; - -goog.provide('Blockly.FieldVerticalSeparator'); - -goog.require('Blockly.Field'); -goog.require('goog.dom'); -goog.require('goog.math.Size'); - - -/** - * Class for a vertical separator line. - * @extends {Blockly.Field} - * @constructor - */ -Blockly.FieldVerticalSeparator = function() { - this.sourceBlock_ = null; - this.width_ = 1; - this.height_ = Blockly.BlockSvg.ICON_SEPARATOR_HEIGHT; - this.size_ = new goog.math.Size(this.width_, this.height_); -}; -goog.inherits(Blockly.FieldVerticalSeparator, Blockly.Field); - -/** - * Construct a FieldVerticalSeparator from a JSON arg object. - * @param {!Object} _element A JSON object with options (unused, but passed in - * by Field.fromJson). - * @returns {!Blockly.FieldVerticalSeparator} The new field instance. - * @package - * @nocollapse - */ -Blockly.FieldVerticalSeparator.fromJson = function( - /* eslint-disable no-unused-vars */ _element - /* eslint-enable no-unused-vars */) { - return new Blockly.FieldVerticalSeparator(); -}; -/** - * Editable fields are saved by the XML renderer, non-editable fields are not. - */ -Blockly.FieldVerticalSeparator.prototype.EDITABLE = false; - -/** - * Install this field on a block. - */ -Blockly.FieldVerticalSeparator.prototype.init = function() { - if (this.fieldGroup_) { - // Image has already been initialized once. - return; - } - // Build the DOM. - /** @type {SVGElement} */ - this.fieldGroup_ = Blockly.utils.createSvgElement('g', {}, null); - if (!this.visible_) { - this.fieldGroup_.style.display = 'none'; - } - /** @type {SVGElement} */ - this.lineElement_ = Blockly.utils.createSvgElement('line', - { - 'stroke': this.sourceBlock_.getColourSecondary(), - 'stroke-linecap': 'round', - 'x1': 0, - 'y1': 0, - 'x2': 0, - 'y2': this.height_ - }, this.fieldGroup_); - - this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_); -}; - -/** - * Set the height of the line element, without adjusting the field's height. - * This allows the line's height to be changed without causing it to be - * centered with the new height (needed for correct rendering of hat blocks). - * @param {number} newHeight the new height for the line. - * @package - */ -Blockly.FieldVerticalSeparator.prototype.setLineHeight = function(newHeight) { - this.lineElement_.setAttribute('y2', newHeight); -}; - -/** - * Dispose of all DOM objects belonging to this text. - */ -Blockly.FieldVerticalSeparator.prototype.dispose = function() { - goog.dom.removeNode(this.fieldGroup_); - this.fieldGroup_ = null; - this.lineElement_ = null; -}; - -/** - * Get the value of this field. A no-op in this case. - * @return {string} null. - * @override - */ -Blockly.FieldVerticalSeparator.prototype.getValue = function() { - return null; -}; - -/** - * Set the value of this field. A no-op in this case. - * @param {?string} src New value. - * @override - */ -Blockly.FieldVerticalSeparator.prototype.setValue = function( - /* eslint-disable no-unused-vars */ src - /* eslint-enable no-unused-vars */) { - return; -}; - -/** - * Set the text of this field. A no-op in this case. - * @param {?string} alt New text. - * @override - */ -Blockly.FieldVerticalSeparator.prototype.setText = function( - /* eslint-disable no-unused-vars */ alt - /* eslint-enable no-unused-vars */) { - return; -}; - -/** - * Separator lines are fixed width, no need to render. - * @private - */ -Blockly.FieldVerticalSeparator.prototype.render_ = function() { - // NOP -}; - -/** - * Separator lines are fixed width, no need to update. - * @private - */ -Blockly.FieldVerticalSeparator.prototype.updateWidth = function() { - // NOP -}; - -Blockly.Field.register( - 'field_vertical_separator', Blockly.FieldVerticalSeparator); diff --git a/packages/scratch-blocks/core/flyout_base.js b/packages/scratch-blocks/core/flyout_base.js deleted file mode 100644 index fe5b3fcd4..000000000 --- a/packages/scratch-blocks/core/flyout_base.js +++ /dev/null @@ -1,923 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Flyout tray containing blocks which may be created. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Flyout'); - -goog.require('Blockly.Block'); -goog.require('Blockly.Comment'); -goog.require('Blockly.Events'); -goog.require('Blockly.Events.BlockCreate'); -goog.require('Blockly.Events.VarCreate'); -goog.require('Blockly.FlyoutButton'); -goog.require('Blockly.FlyoutExtensionCategoryHeader'); -goog.require('Blockly.Gesture'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.Touch'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.dom'); -goog.require('goog.events'); -goog.require('goog.math.Rect'); -goog.require('goog.userAgent'); - - -/** - * Class for a flyout. - * @param {!Object} workspaceOptions Dictionary of options for the workspace. - * @constructor - */ -Blockly.Flyout = function(workspaceOptions) { - workspaceOptions.getMetrics = this.getMetrics_.bind(this); - workspaceOptions.setMetrics = this.setMetrics_.bind(this); - - /** - * @type {!Blockly.Workspace} - * @protected - */ - this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); - this.workspace_.isFlyout = true; - - // When we create blocks for this workspace, instead of using the "optional" id - // make the default `id` the same as the `type` for easier re-use. - var newBlock = this.workspace_.newBlock; - this.workspace_.newBlock = function(type, id) { - // Use `type` if `id` isn't passed. `this` will be workspace. - return newBlock.call(this, type, id || type); - }; - - /** - * Is RTL vs LTR. - * @type {boolean} - */ - this.RTL = !!workspaceOptions.RTL; - - /** - * Flyout should be laid out horizontally vs vertically. - * @type {boolean} - * @private - */ - this.horizontalLayout_ = workspaceOptions.horizontalLayout; - - /** - * Position of the toolbox and flyout relative to the workspace. - * @type {number} - * @protected - */ - this.toolboxPosition_ = workspaceOptions.toolboxPosition; - - /** - * Opaque data that can be passed to Blockly.unbindEvent_. - * @type {!Array.} - * @private - */ - this.eventWrappers_ = []; - - /** - * List of background buttons that lurk behind each block to catch clicks - * landing in the blocks' lakes and bays. - * @type {!Array.} - * @private - */ - this.backgroundButtons_ = []; - - /** - * List of visible buttons. - * @type {!Array.} - * @protected - */ - this.buttons_ = []; - - /** - * List of event listeners. - * @type {!Array.} - * @private - */ - this.listeners_ = []; - - /** - * List of blocks that should always be disabled. - * @type {!Array.} - * @private - */ - this.permanentlyDisabled_ = []; - - /** - * The toolbox that this flyout belongs to, or none if tihs is a simple - * workspace. - * @type {Blockly.Toolbox} - * @private - */ - this.parentToolbox_ = null; - - /** - * The target position for the flyout scroll animation in pixels. - * Is a number while animating, null otherwise. - * @type {?number} - * @package - */ - this.scrollTarget = null; - - /** - * A recycle bin for blocks. - * @type {!Array.} - * @private - */ - this.recycleBlocks_ = []; - -}; - -/** - * Does the flyout automatically close when a block is created? - * @type {boolean} - */ -Blockly.Flyout.prototype.autoClose = false; - -/** - * Whether the flyout is visible. - * @type {boolean} - * @private - */ -Blockly.Flyout.prototype.isVisible_ = false; - -/** - * Whether the workspace containing this flyout is visible. - * @type {boolean} - * @private - */ -Blockly.Flyout.prototype.containerVisible_ = true; - -/** - * Corner radius of the flyout background. - * @type {number} - * @const - */ -Blockly.Flyout.prototype.CORNER_RADIUS = 0; - -/** - * Margin around the edges of the blocks in the flyout. - * @type {number} - * @const - */ -Blockly.Flyout.prototype.MARGIN = 12; - -// TODO: Move GAP_X and GAP_Y to their appropriate files. - -/** - * Gap between items in horizontal flyouts. Can be overridden with the "sep" - * element. - * @const {number} - */ -Blockly.Flyout.prototype.GAP_X = Blockly.Flyout.prototype.MARGIN * 3; - -/** - * Gap between items in vertical flyouts. Can be overridden with the "sep" - * element. - * @const {number} - */ -Blockly.Flyout.prototype.GAP_Y = Blockly.Flyout.prototype.MARGIN; - -/** - * Top/bottom padding between scrollbar and edge of flyout background. - * @type {number} - * @const - */ -Blockly.Flyout.prototype.SCROLLBAR_PADDING = 2; - -/** - * Width of flyout. - * @type {number} - * @protected - */ -Blockly.Flyout.prototype.width_ = 0; - -/** - * Height of flyout. - * @type {number} - * @protected - */ -Blockly.Flyout.prototype.height_ = 0; - -/** - * Width of flyout contents. - * @type {number} - * @private - */ -Blockly.Flyout.prototype.contentWidth_ = 0; - -/** - * Height of flyout contents. - * @type {number} - * @private - */ -Blockly.Flyout.prototype.contentHeight_ = 0; - -/** - * Vertical offset of flyout. - * @type {number} - * @private - */ -Blockly.Flyout.prototype.verticalOffset_ = 0; - -/** - * Range of a drag angle from a flyout considered "dragging toward workspace". - * Drags that are within the bounds of this many degrees from the orthogonal - * line to the flyout edge are considered to be "drags toward the workspace". - * Example: - * Flyout Edge Workspace - * [block] / <-within this angle, drags "toward workspace" | - * [block] ---- orthogonal to flyout boundary ---- | - * [block] \ | - * The angle is given in degrees from the orthogonal. - * - * This is used to know when to create a new block and when to scroll the - * flyout. Setting it to 360 means that all drags create a new block. - * @type {number} - * @protected -*/ -Blockly.Flyout.prototype.dragAngleRange_ = 70; - -/** - * The fraction of the distance to the scroll target to move the flyout on - * each animation frame, when auto-scrolling. Values closer to 1.0 will make - * the scroll animation complete faster. Use 1.0 for no animation. - * @type {number} - */ -Blockly.Flyout.prototype.scrollAnimationFraction = 0.3; - -/** - * Whether to recycle blocks when refreshing the flyout. When false, do not allow - * anything to be recycled. The default is to recycle. - * @type {boolean} - * @private - */ -Blockly.Flyout.prototype.recyclingEnabled_ = true; - -/** - * Creates the flyout's DOM. Only needs to be called once. The flyout can - * either exist as its own svg element or be a g element nested inside a - * separate svg element. - * @param {string} tagName The type of tag to put the flyout in. This - * should be or . - * @return {!Element} The flyout's SVG group. - */ -Blockly.Flyout.prototype.createDom = function(tagName) { - /* - - - - - */ - // Setting style to display:none to start. The toolbox and flyout - // hide/show code will set up proper visibility and size later. - this.svgGroup_ = Blockly.utils.createSvgElement(tagName, - {'class': 'blocklyFlyout', 'style': 'display: none'}, null); - this.svgBackground_ = Blockly.utils.createSvgElement('path', - {'class': 'blocklyFlyoutBackground'}, this.svgGroup_); - this.svgGroup_.appendChild(this.workspace_.createDom()); - return this.svgGroup_; -}; - -/** - * Initializes the flyout. - * @param {!Blockly.Workspace} targetWorkspace The workspace in which to create - * new blocks. - */ -Blockly.Flyout.prototype.init = function(targetWorkspace) { - this.targetWorkspace_ = targetWorkspace; - this.workspace_.targetWorkspace = targetWorkspace; - // Add scrollbar. - this.scrollbar_ = new Blockly.Scrollbar(this.workspace_, - this.horizontalLayout_, false, 'blocklyFlyoutScrollbar'); - - this.position(); - - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, this.wheel_)); - // Dragging the flyout up and down (or left and right). - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEventWithChecks_( - this.svgGroup_, 'mousedown', this, this.onMouseDown_)); - - // A flyout connected to a workspace doesn't have its own current gesture. - this.workspace_.getGesture = - this.targetWorkspace_.getGesture.bind(this.targetWorkspace_); - - // Get variables from the main workspace rather than the target workspace. - this.workspace_.variableMap_ = this.targetWorkspace_.getVariableMap(); - - this.workspace_.createPotentialVariableMap(); -}; - -/** - * Dispose of this flyout. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Flyout.prototype.dispose = function() { - this.hide(); - Blockly.unbindEvent_(this.eventWrappers_); - if (this.scrollbar_) { - this.scrollbar_.dispose(); - this.scrollbar_ = null; - } - if (this.workspace_) { - this.workspace_.targetWorkspace = null; - this.workspace_.dispose(); - this.workspace_ = null; - } - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.parentToolbox_ = null; - this.svgBackground_ = null; - this.targetWorkspace_ = null; -}; - -/** - * Set the parent toolbox of this flyout. - * @param {!Blockly.Toolbox} toolbox The toolbox that owns this flyout. - */ -Blockly.Flyout.prototype.setParentToolbox = function(toolbox) { - this.parentToolbox_ = toolbox; -}; - -/** - * Get the width of the flyout. - * @return {number} The width of the flyout. - */ -Blockly.Flyout.prototype.getWidth = function() { - return this.DEFAULT_WIDTH; -}; - -/** - * Get the height of the flyout. - * @return {number} The width of the flyout. - */ -Blockly.Flyout.prototype.getHeight = function() { - return this.height_; -}; - -/** - * Get the workspace inside the flyout. - * @return {!Blockly.WorkspaceSvg} The workspace inside the flyout. - * @package - */ -Blockly.Flyout.prototype.getWorkspace = function() { - return this.workspace_; -}; - -/** - * Is the flyout visible? - * @return {boolean} True if visible. - */ -Blockly.Flyout.prototype.isVisible = function() { - return this.isVisible_; -}; - -/** - * Set whether the flyout is visible. A value of true does not necessarily mean - * that the flyout is shown. It could be hidden because its container is hidden. - * @param {boolean} visible True if visible. - */ -Blockly.Flyout.prototype.setVisible = function(visible) { - var visibilityChanged = (visible != this.isVisible()); - - this.isVisible_ = visible; - if (visibilityChanged) { - this.updateDisplay_(); - } -}; - -/** - * Set whether this flyout's container is visible. - * @param {boolean} visible Whether the container is visible. - */ -Blockly.Flyout.prototype.setContainerVisible = function(visible) { - var visibilityChanged = (visible != this.containerVisible_); - this.containerVisible_ = visible; - if (visibilityChanged) { - this.updateDisplay_(); - } -}; - -/** - * Update the display property of the flyout based whether it thinks it should - * be visible and whether its containing workspace is visible. - * @private - */ -Blockly.Flyout.prototype.updateDisplay_ = function() { - var show = true; - if (!this.containerVisible_) { - show = false; - } else { - show = this.isVisible(); - } - this.svgGroup_.style.display = show ? 'block' : 'none'; - // Update the scrollbar's visiblity too since it should mimic the - // flyout's visibility. - this.scrollbar_.setContainerVisible(show); -}; - -/** - * Hide and empty the flyout. - */ -Blockly.Flyout.prototype.hide = function() { - if (!this.isVisible()) { - return; - } - this.setVisible(false); - // Delete all the event listeners. - for (var x = 0, listen; listen = this.listeners_[x]; x++) { - Blockly.unbindEvent_(listen); - } - this.listeners_.length = 0; - if (this.reflowWrapper_) { - this.workspace_.removeChangeListener(this.reflowWrapper_); - this.reflowWrapper_ = null; - } - // Do NOT delete the blocks here. Wait until Flyout.show. - // https://neil.fraser.name/news/2014/08/09/ -}; - -/** - * Show and populate the flyout. - * @param {!Array|string} xmlList List of blocks to show. - * Variables and procedures have a custom set of blocks. - */ -Blockly.Flyout.prototype.show = function(xmlList) { - this.workspace_.setResizesEnabled(false); - this.hide(); - this.clearOldBlocks_(); - - this.setVisible(true); - // Create the blocks to be shown in this flyout. - var contents = []; - var gaps = []; - this.permanentlyDisabled_.length = 0; - for (var i = 0, xml; xml = xmlList[i]; i++) { - // Handle dynamic categories, represented by a name instead of a list of XML. - // Look up the correct category generation function and call that to get a - // valid XML list. - if (typeof xml === 'string') { - var fnToApply = this.workspace_.targetWorkspace.getToolboxCategoryCallback( - xmlList[i]); - var newList = fnToApply(this.workspace_.targetWorkspace); - // Insert the new list of blocks in the middle of the list. - // We use splice to insert at index i, and remove a single element - // (the placeholder string). Because the spread operator (...) is not - // available, use apply and concat the array. - xmlList.splice.apply(xmlList, [i, 1].concat(newList)); - xml = xmlList[i]; - } - if (xml.tagName) { - var tagName = xml.tagName.toUpperCase(); - var default_gap = this.horizontalLayout_ ? this.GAP_X : this.GAP_Y; - if (tagName == 'BLOCK') { - - // We assume that in a flyout, the same block id (or type if missing id) means - // the same output BlockSVG. - - // Look for a block that matches the id or type, our createBlock will assign - // id = type if none existed. - var id = xml.getAttribute('id') || xml.getAttribute('type'); - var recycled = this.recycleBlocks_.findIndex(function(block) { - return block.id === id; - }); - - - // If we found a recycled item, reuse the BlockSVG from last time. - // Otherwise, convert the XML block to a BlockSVG. - var curBlock; - if (recycled > -1) { - curBlock = this.recycleBlocks_.splice(recycled, 1)[0]; - } else { - curBlock = Blockly.Xml.domToBlock(xml, this.workspace_); - } - - if (curBlock.disabled) { - // Record blocks that were initially disabled. - // Do not enable these blocks as a result of capacity filtering. - this.permanentlyDisabled_.push(curBlock); - } - contents.push({type: 'block', block: curBlock}); - var gap = parseInt(xml.getAttribute('gap'), 10); - gaps.push(isNaN(gap) ? default_gap : gap); - } else if (xml.tagName.toUpperCase() == 'SEP') { - // Change the gap between two blocks. - // - // The default gap is 24, can be set larger or smaller. - // This overwrites the gap attribute on the previous block. - // Note that a deprecated method is to add a gap to a block. - // - var newGap = parseInt(xml.getAttribute('gap'), 10); - // Ignore gaps before the first block. - if (!isNaN(newGap) && gaps.length > 0) { - gaps[gaps.length - 1] = newGap; - } else { - gaps.push(default_gap); - } - } else if ((tagName == 'LABEL') && (xml.getAttribute('showStatusButton') == 'true')) { - var curButton = new Blockly.FlyoutExtensionCategoryHeader(this.workspace_, - this.targetWorkspace_, xml); - contents.push({type: 'button', button: curButton}); - gaps.push(default_gap); - } else if (tagName == 'BUTTON' || tagName == 'LABEL') { - // Labels behave the same as buttons, but are styled differently. - var isLabel = tagName == 'LABEL'; - var curButton = new Blockly.FlyoutButton(this.workspace_, - this.targetWorkspace_, xml, isLabel); - contents.push({type: 'button', button: curButton}); - gaps.push(default_gap); - } - } - } - - this.emptyRecycleBlocks_(); - - this.layout_(contents, gaps); - - // IE 11 is an incompetent browser that fails to fire mouseout events. - // When the mouse is over the background, deselect all blocks. - var deselectAll = function() { - var topBlocks = this.workspace_.getTopBlocks(false); - for (var i = 0, block; block = topBlocks[i]; i++) { - block.removeSelect(); - } - }; - - this.listeners_.push(Blockly.bindEvent_(this.svgBackground_, 'mouseover', - this, deselectAll)); - - this.workspace_.setResizesEnabled(true); - this.reflow(); - - // Correctly position the flyout's scrollbar when it opens. - this.position(); - - this.reflowWrapper_ = this.reflow.bind(this); - this.workspace_.addChangeListener(this.reflowWrapper_); - - this.recordCategoryScrollPositions_(); -}; - -/** - * Empty out the recycled blocks, properly destroying everything. - * @private - */ -Blockly.Flyout.prototype.emptyRecycleBlocks_ = function() { - // Clean out the old recycle bin. - var oldBlocks = this.recycleBlocks_; - this.recycleBlocks_ = []; - for (var i = 0; i < oldBlocks.length; i++) { - oldBlocks[i].dispose(false, false); - } -}; - -/** - * Store an array of category names, ids, scrollbar positions, and category lengths. - * This is used when scrolling the flyout to cause a category to be selected. - * @private - */ -Blockly.Flyout.prototype.recordCategoryScrollPositions_ = function() { - this.categoryScrollPositions = []; - // Record category names and positions using the text label at the top of each one. - for (var i = 0; i < this.buttons_.length; i++) { - if (this.buttons_[i].getIsCategoryLabel()) { - var categoryLabel = this.buttons_[i]; - this.categoryScrollPositions.push({ - categoryName: categoryLabel.getText(), - position: this.horizontalLayout_ ? - categoryLabel.getPosition().x : categoryLabel.getPosition().y - }); - } - } - // Record the length of each category, setting the final one to 0. - var numCategories = this.categoryScrollPositions.length; - if (numCategories > 0) { - for (var i = 0; i < numCategories - 1; i++) { - var currentPos = this.categoryScrollPositions[i].position; - var nextPos = this.categoryScrollPositions[i + 1].position; - var length = nextPos - currentPos; - this.categoryScrollPositions[i].length = length; - } - this.categoryScrollPositions[numCategories - 1].length = 0; - // Record the id of each category. - for (var i = 0; i < numCategories; i++) { - var category = this.parentToolbox_.getCategoryByIndex(i); - if (category && category.id_) { - this.categoryScrollPositions[i].categoryId = category.id_; - } - } - } -}; - -/** - * Select a category using the scroll position. - * @param {number} pos The scroll position in pixels. - * @package - */ -Blockly.Flyout.prototype.selectCategoryByScrollPosition = function(pos) { - // If we are currently auto-scrolling, due to selecting a category by clicking on it, - // do not update the category selection. - if (this.scrollTarget) { - return; - } - var workspacePos = Math.round(pos / this.workspace_.scale); - // Traverse the array of scroll positions in reverse, so we can select the furthest - // category that the scroll position is beyond. - for (var i = this.categoryScrollPositions.length - 1; i >= 0; i--) { - if (workspacePos >= this.categoryScrollPositions[i].position) { - this.parentToolbox_.selectCategoryById(this.categoryScrollPositions[i].categoryId); - return; - } - } -}; - -/** - * Step the scrolling animation by scrolling a fraction of the way to - * a scroll target, and request the next frame if necessary. - * @package - */ -Blockly.Flyout.prototype.stepScrollAnimation = function() { - if (!this.scrollTarget) { - return; - } - var scrollPos = this.horizontalLayout_ ? - -this.workspace_.scrollX : -this.workspace_.scrollY; - var diff = this.scrollTarget - scrollPos; - if (Math.abs(diff) < 1) { - this.scrollbar_.set(this.scrollTarget); - this.scrollTarget = null; - return; - } - this.scrollbar_.set(scrollPos + diff * this.scrollAnimationFraction); - - // Polyfilled by goog.dom.animationFrame.polyfill - requestAnimationFrame(this.stepScrollAnimation.bind(this)); -}; - -/** - * Get the scaled scroll position. - * @return {number} The current scroll position. - */ -Blockly.Flyout.prototype.getScrollPos = function() { - var pos = this.horizontalLayout_ ? - -this.workspace_.scrollX : -this.workspace_.scrollY; - return pos / this.workspace_.scale; -}; - -/** - * Set the scroll position, scaling it. - * @param {number} pos The scroll position to set. - */ -Blockly.Flyout.prototype.setScrollPos = function(pos) { - this.scrollbar_.set(pos * this.workspace_.scale); -}; - -/** - * Set whether the flyout can recycle blocks. A value of true allows blocks to be recycled. - * @param {boolean} recycle True if recycling is possible. - */ -Blockly.Flyout.prototype.setRecyclingEnabled = function(recycle) { - this.recyclingEnabled_ = recycle; -}; - -/** - * Delete blocks and background buttons from a previous showing of the flyout. - * @private - */ -Blockly.Flyout.prototype.clearOldBlocks_ = function() { - // Delete any blocks from a previous showing. - var oldBlocks = this.workspace_.getTopBlocks(false); - for (var i = 0, block; block = oldBlocks[i]; i++) { - if (block.workspace == this.workspace_) { - if (this.recyclingEnabled_ && - Blockly.scratchBlocksUtils.blockIsRecyclable(block)) { - this.recycleBlock_(block); - } else { - block.dispose(false, false); - } - } - } - // Delete any background buttons from a previous showing. - for (var j = 0; j < this.backgroundButtons_.length; j++) { - var rect = this.backgroundButtons_[j]; - if (rect) goog.dom.removeNode(rect); - } - this.backgroundButtons_.length = 0; - - for (var i = 0, button; button = this.buttons_[i]; i++) { - button.dispose(); - } - this.buttons_.length = 0; - - // Clear potential variables from the previous showing. - this.workspace_.getPotentialVariableMap().clear(); -}; - -/** - * Add listeners to a block that has been added to the flyout. - * @param {!Element} root The root node of the SVG group the block is in. - * @param {!Blockly.Block} block The block to add listeners for. - * @param {!Element} rect The invisible rectangle under the block that acts as - * a button for that block. - * @private - */ -Blockly.Flyout.prototype.addBlockListeners_ = function(root, block, rect) { - this.listeners_.push(Blockly.bindEventWithChecks_(root, 'mousedown', null, - this.blockMouseDown_(block))); - this.listeners_.push(Blockly.bindEventWithChecks_(rect, 'mousedown', null, - this.blockMouseDown_(block))); - this.listeners_.push(Blockly.bindEvent_(root, 'mouseover', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(root, 'mouseout', block, - block.removeSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseover', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseout', block, - block.removeSelect)); -}; - -/** - * Handle a mouse-down on an SVG block in a non-closing flyout. - * @param {!Blockly.Block} block The flyout block to copy. - * @return {!Function} Function to call when block is clicked. - * @private - */ -Blockly.Flyout.prototype.blockMouseDown_ = function(block) { - var flyout = this; - return function(e) { - var gesture = flyout.targetWorkspace_.getGesture(e); - if (gesture) { - gesture.setStartBlock(block); - gesture.handleFlyoutStart(e, flyout); - } - }; -}; - -/** - * Mouse down on the flyout background. Start a scroll drag. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Flyout.prototype.onMouseDown_ = function(e) { - var gesture = this.targetWorkspace_.getGesture(e); - if (gesture) { - gesture.handleFlyoutStart(e, this); - } -}; - -/** - * Create a copy of this block on the workspace. - * @param {!Blockly.BlockSvg} originalBlock The block to copy from the flyout. - * @return {Blockly.BlockSvg} The newly created block, or null if something - * went wrong with deserialization. - * @package - */ -Blockly.Flyout.prototype.createBlock = function(originalBlock) { - var newBlock = null; - Blockly.Events.disable(); - var variablesBeforeCreation = this.targetWorkspace_.getAllVariables(); - this.targetWorkspace_.setResizesEnabled(false); - try { - newBlock = this.placeNewBlock_(originalBlock); - // Close the flyout. - Blockly.hideChaff(); - } finally { - Blockly.Events.enable(); - } - - var newVariables = Blockly.Variables.getAddedVariables(this.targetWorkspace_, - variablesBeforeCreation); - - if (Blockly.Events.isEnabled()) { - Blockly.Events.setGroup(true); - Blockly.Events.fire(new Blockly.Events.Create(newBlock)); - // Fire a VarCreate event for each (if any) new variable created. - for (var i = 0; i < newVariables.length; i++) { - var thisVariable = newVariables[i]; - Blockly.Events.fire(new Blockly.Events.VarCreate(thisVariable)); - } - } - if (this.autoClose) { - this.hide(); - } - return newBlock; -}; - -/** - * Reflow blocks and their buttons. - */ -Blockly.Flyout.prototype.reflow = function() { - if (this.reflowWrapper_) { - this.workspace_.removeChangeListener(this.reflowWrapper_); - } - var blocks = this.workspace_.getTopBlocks(false); - this.reflowInternal_(blocks); - if (this.reflowWrapper_) { - this.workspace_.addChangeListener(this.reflowWrapper_); - } -}; - -/** - * @return {boolean} True if this flyout may be scrolled with a scrollbar or by - * dragging. - * @package - */ -Blockly.Flyout.prototype.isScrollable = function() { - return this.scrollbar_ ? this.scrollbar_.isVisible() : false; -}; - -/** - * Copy a block from the flyout to the workspace and position it correctly. - * @param {!Blockly.Block} oldBlock The flyout block to copy. - * @return {!Blockly.Block} The new block in the main workspace. - * @private - */ -Blockly.Flyout.prototype.placeNewBlock_ = function(oldBlock) { - var targetWorkspace = this.targetWorkspace_; - var svgRootOld = oldBlock.getSvgRoot(); - if (!svgRootOld) { - throw 'oldBlock is not rendered.'; - } - - // Create the new block by cloning the block in the flyout (via XML). - var xml = Blockly.Xml.blockToDom(oldBlock); - // The target workspace would normally resize during domToBlock, which will - // lead to weird jumps. Save it for terminateDrag. - targetWorkspace.setResizesEnabled(false); - - // Using domToBlock instead of domToWorkspace means that the new block will be - // placed at position (0, 0) in main workspace units. - var block = Blockly.Xml.domToBlock(xml, targetWorkspace); - var svgRootNew = block.getSvgRoot(); - if (!svgRootNew) { - throw 'block is not rendered.'; - } - - // The offset in pixels between the main workspace's origin and the upper left - // corner of the injection div. - var mainOffsetPixels = targetWorkspace.getOriginOffsetInPixels(); - - // The offset in pixels between the flyout workspace's origin and the upper - // left corner of the injection div. - var flyoutOffsetPixels = this.workspace_.getOriginOffsetInPixels(); - - // The position of the old block in flyout workspace coordinates. - var oldBlockPosWs = oldBlock.getRelativeToSurfaceXY(); - - // The position of the old block in pixels relative to the flyout - // workspace's origin. - var oldBlockPosPixels = oldBlockPosWs.scale(this.workspace_.scale); - - // The position of the old block in pixels relative to the upper left corner - // of the injection div. - var oldBlockOffsetPixels = goog.math.Coordinate.sum(flyoutOffsetPixels, - oldBlockPosPixels); - - // The position of the old block in pixels relative to the origin of the - // main workspace. - var finalOffsetPixels = goog.math.Coordinate.difference(oldBlockOffsetPixels, - mainOffsetPixels); - - // The position of the old block in main workspace coordinates. - var finalOffsetMainWs = finalOffsetPixels.scale(1 / targetWorkspace.scale); - - block.moveBy(finalOffsetMainWs.x, finalOffsetMainWs.y); - return block; -}; - -/** - * Put a previously created block into the recycle bin, used during large - * workspace swaps to limit the number of new dom elements we need to create - * - * @param {!Blockly.BlockSvg} block The block to recycle. - * @private - */ -Blockly.Flyout.prototype.recycleBlock_ = function(block) { - var xy = block.getRelativeToSurfaceXY(); - block.moveBy(-xy.x, -xy.y); - this.recycleBlocks_.push(block); -}; diff --git a/packages/scratch-blocks/core/flyout_button.js b/packages/scratch-blocks/core/flyout_button.js deleted file mode 100644 index 26f7d8f39..000000000 --- a/packages/scratch-blocks/core/flyout_button.js +++ /dev/null @@ -1,322 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Class for a button in the flyout. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.FlyoutButton'); - -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); - - -/** - * Class for a button or label in the flyout. Labels behave the same as buttons, - * but are styled differently. - * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this - * button. - * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace. - * @param {!Element} xml The XML specifying the label/button. - * @param {boolean} isLabel Whether this button should be styled as a label. - * @constructor - */ -Blockly.FlyoutButton = function(workspace, targetWorkspace, xml, isLabel) { - - this.init(workspace, targetWorkspace, xml, isLabel); - - /** - * Function to call when this button is clicked. - * @type {function(!Blockly.FlyoutButton)} - * @private - */ - this.callback_ = null; - - var callbackKey = xml.getAttribute('callbackKey'); - if (this.isLabel_ && callbackKey) { - console.warn('Labels should not have callbacks. Label text: ' + this.text_); - } else if (!this.isLabel_ && - !(callbackKey && targetWorkspace.getButtonCallback(callbackKey))) { - console.warn('Buttons should have callbacks. Button text: ' + this.text_); - } else { - this.callback_ = targetWorkspace.getButtonCallback(callbackKey); - } -}; - -/** - * The margin around the text in the button. - */ -Blockly.FlyoutButton.MARGIN = 40; - -/** - * The width of the button's rect. - * @type {number} - */ -Blockly.FlyoutButton.prototype.width = 0; - -/** - * The height of the button's rect. - * @type {number} - */ -Blockly.FlyoutButton.prototype.height = 40; // Can't be computed like the width - -/** - * Opaque data that can be passed to Blockly.unbindEvent_. - * @type {Array.} - * @private - */ -Blockly.FlyoutButton.prototype.onMouseUpWrapper_ = null; - -/** -* Initialize the button or label. This is a helper function to so that the -* constructor can be overridden. -* @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this -* button. -* @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace. -* @param {!Element} xml The XML specifying the label/button. -* @param {boolean} isLabel Whether this button should be styled as a label. - */ -Blockly.FlyoutButton.prototype.init = function( - workspace, targetWorkspace, xml, isLabel) { - - /** - * @type {!Blockly.WorkspaceSvg} - * @private - */ - this.workspace_ = workspace; - - /** - * @type {!Blockly.Workspace} - * @private - */ - this.targetWorkspace_ = targetWorkspace; - - /** - * @type {string} - * @private - */ - this.text_ = xml.getAttribute('text'); - - /** - * @type {!goog.math.Coordinate} - * @private - */ - this.position_ = new goog.math.Coordinate(0, 0); - - /** - * Whether this button should be styled as a label. - * @type {boolean} - * @private - */ - this.isLabel_ = isLabel; - - /** - * Whether this button is a label at the top of a category. - * @type {boolean} - * @private - */ - this.isCategoryLabel_ = xml.getAttribute('category-label') === 'true'; - - /** - * If specified, a CSS class to add to this button. - * @type {?string} - * @private - */ - this.cssClass_ = xml.getAttribute('web-class') || null; -}; - -/** - * Create the button elements. - * @return {!Element} The button's SVG group. - */ -Blockly.FlyoutButton.prototype.createDom = function() { - var cssClass = this.isLabel_ ? 'blocklyFlyoutLabel' : 'blocklyFlyoutButton'; - if (this.cssClass_) { - cssClass += ' ' + this.cssClass_; - } - - this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': cssClass}, - this.workspace_.getCanvas()); - - this.addTextSvg(this.isLabel_); - - this.mouseUpWrapper_ = Blockly.bindEventWithChecks_(this.svgGroup_, 'mouseup', - this, this.onMouseUp_); - return this.svgGroup_; -}; - -/** - * Add the text element for the label or button. - * @param {boolean} isLabel True if this is a label and not button. - * @package - */ -Blockly.FlyoutButton.prototype.addTextSvg = function(isLabel) { - if (!isLabel) { - // Shadow rectangle (light source does not mirror in RTL). - var shadow = Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyFlyoutButtonShadow', - 'rx': 4, - 'ry': 4, - 'x': 1, - 'y': 1 - }, - this.svgGroup_); - } - // Background rectangle. - var rect = Blockly.utils.createSvgElement('rect', - { - 'class': isLabel ? - 'blocklyFlyoutLabelBackground' : 'blocklyFlyoutButtonBackground', - 'rx': 4, 'ry': 4 - }, - this.svgGroup_); - - var svgText = Blockly.utils.createSvgElement('text', - { - 'class': isLabel ? 'blocklyFlyoutLabelText' : 'blocklyText', - 'x': 0, - 'y': 0, - 'text-anchor': 'middle' - }, - this.svgGroup_); - svgText.textContent = Blockly.utils.replaceMessageReferences(this.text_); - - this.width = Blockly.Field.getCachedWidth(svgText); - - if (!isLabel) { - this.width += 2 * Blockly.FlyoutButton.MARGIN; - shadow.setAttribute('width', this.width); - shadow.setAttribute('height', this.height); - } - - rect.setAttribute('width', this.width); - rect.setAttribute('height', this.height); - - svgText.setAttribute('text-anchor', 'middle'); - svgText.setAttribute('dominant-baseline', 'central'); - svgText.setAttribute('dy', goog.userAgent.EDGE_OR_IE ? - Blockly.Field.IE_TEXT_OFFSET : '0'); - svgText.setAttribute('x', this.width / 2); - svgText.setAttribute('y', this.height / 2); -}; - -/** - * Correctly position the flyout button and make it visible. - */ -Blockly.FlyoutButton.prototype.show = function() { - this.updateTransform_(); - this.svgGroup_.setAttribute('display', 'block'); -}; - -/** - * Update SVG attributes to match internal state. - * @private - */ -Blockly.FlyoutButton.prototype.updateTransform_ = function() { - this.svgGroup_.setAttribute('transform', - 'translate(' + this.position_.x + ',' + this.position_.y + ')'); -}; - -/** - * Move the button to the given x, y coordinates. - * @param {number} x The new x coordinate. - * @param {number} y The new y coordinate. - */ -Blockly.FlyoutButton.prototype.moveTo = function(x, y) { - this.position_.x = x; - this.position_.y = y; - this.updateTransform_(); -}; - -/** - * Get the button's target workspace. - * @return {!Blockly.WorkspaceSvg} The target workspace of the flyout where this - * button resides. - */ -Blockly.FlyoutButton.prototype.getTargetWorkspace = function() { - return this.targetWorkspace_; -}; - -/** - * Get whether this button is a label at the top of a category. - * @return {boolean} True if it is a category label. - * @package - */ -Blockly.FlyoutButton.prototype.getIsCategoryLabel = function() { - return this.isCategoryLabel_; -}; - -/** - * Get the text of this button. - * @return {string} The text on the button. - * @package - */ -Blockly.FlyoutButton.prototype.getText = function() { - return this.text_; -}; - -/** - * Get the position of this button. - * @return {!goog.math.Coordinate} The button position. - * @package - */ -Blockly.FlyoutButton.prototype.getPosition = function() { - return this.position_; -}; - -/** - * Dispose of this button. - */ -Blockly.FlyoutButton.prototype.dispose = function() { - if (this.onMouseUpWrapper_) { - Blockly.unbindEvent_(this.onMouseUpWrapper_); - } - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.workspace_ = null; - this.targetWorkspace_ = null; -}; - -/** - * Do something when the button is clicked. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.FlyoutButton.prototype.onMouseUp_ = function(e) { - var gesture = this.targetWorkspace_.getGesture(e); - if (gesture) { - // If we're in the middle of dragging something (blocks, workspace, etc.) ignore the button. - // Otherwise, cancel the gesture. - if (gesture.isDragging()) { - return; - } - gesture.cancel(); - } - - // Call the callback registered to this button. - if (this.callback_) { - this.callback_(this); - } -}; diff --git a/packages/scratch-blocks/core/flyout_dragger.js b/packages/scratch-blocks/core/flyout_dragger.js deleted file mode 100644 index c3909eaf2..000000000 --- a/packages/scratch-blocks/core/flyout_dragger.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for dragging a flyout visually. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.FlyoutDragger'); - -goog.require('Blockly.WorkspaceDragger'); - -goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); - - -/** - * Class for a flyout dragger. It moves a flyout workspace around when it is - * being dragged by a mouse or touch. - * Note that the workspace itself manages whether or not it has a drag surface - * and how to do translations based on that. This simply passes the right - * commands based on events. - * @param {!Blockly.Flyout} flyout The flyout to drag. - * @constructor - */ -Blockly.FlyoutDragger = function(flyout) { - Blockly.FlyoutDragger.superClass_.constructor.call(this, - flyout.getWorkspace()); - - /** - * The scrollbar to update to move the flyout. - * Unlike the main workspace, the flyout has only one scrollbar, in either the - * horizontal or the vertical direction. - * @type {!Blockly.Scrollbar} - * @private - */ - this.scrollbar_ = flyout.scrollbar_; - - /** - * Whether the flyout scrolls horizontally. If false, the flyout scrolls - * vertically. - * @type {boolean} - * @private - */ - this.horizontalLayout_ = flyout.horizontalLayout_; -}; -goog.inherits(Blockly.FlyoutDragger, Blockly.WorkspaceDragger); - -/** - * Move the appropriate scrollbar to drag the flyout. - * Since flyouts only scroll in one direction at a time, this will discard one - * of the calculated values. - * x and y are in pixels. - * @param {number} x The new x position to move the scrollbar to. - * @param {number} y The new y position to move the scrollbar to. - * @private - */ -Blockly.FlyoutDragger.prototype.updateScroll_ = function(x, y) { - // Move the scrollbar and the flyout will scroll automatically. - if (this.horizontalLayout_) { - this.scrollbar_.set(x); - } else { - this.scrollbar_.set(y); - } -}; diff --git a/packages/scratch-blocks/core/flyout_extension_category_header.js b/packages/scratch-blocks/core/flyout_extension_category_header.js deleted file mode 100644 index b97aa04b5..000000000 --- a/packages/scratch-blocks/core/flyout_extension_category_header.js +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Class for a category header in the flyout for Scratch - * extensions which can display a textual label and a status button. - * @author ericr@media.mit.edu (Eric Rosenbaum) - */ -'use strict'; - -goog.provide('Blockly.FlyoutExtensionCategoryHeader'); - -goog.require('Blockly.FlyoutButton'); - -/** - * Class for a category header in the flyout for Scratch extensions which can - * display a textual label and a status button. - * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this - * header. - * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace. - * @param {!Element} xml The XML specifying the header. - * @extends {Blockly.FlyoutButton} - * @constructor - */ -Blockly.FlyoutExtensionCategoryHeader = function(workspace, targetWorkspace, xml) { - - this.init(workspace, targetWorkspace, xml, false); - - /** - * @type {number} - * @private - */ - this.flyoutWidth_ = this.targetWorkspace_.getFlyout().getWidth(); - - /** - * @type {string} - */ - this.extensionId = xml.getAttribute('id'); - - /** - * Whether this is a label at the top of a category. - * @type {boolean} - * @private - */ - this.isCategoryLabel_ = true; -}; -goog.inherits(Blockly.FlyoutExtensionCategoryHeader, Blockly.FlyoutButton); - -/** - * Create the label and button elements. - * @return {!Element} The SVG group. - */ -Blockly.FlyoutExtensionCategoryHeader.prototype.createDom = function() { - var cssClass = 'blocklyFlyoutLabel'; - - this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': cssClass}, - this.workspace_.getCanvas()); - - this.addTextSvg(true); - - this.refreshStatus(); - - var statusButtonWidth = 30; - var marginX = 20; - var marginY = 5; - var touchPadding = 16; - - var statusButtonX = this.workspace_.RTL ? (marginX - this.flyoutWidth_ + statusButtonWidth) : - (this.flyoutWidth_ - statusButtonWidth - marginX) / this.workspace_.scale; - - if (this.imageSrc_) { - /** @type {SVGElement} */ - this.imageElement_ = Blockly.utils.createSvgElement( - 'image', - { - 'class': 'blocklyFlyoutButton', - 'height': statusButtonWidth + 'px', - 'width': statusButtonWidth + 'px', - 'x': statusButtonX + 'px', - 'y': marginY + 'px' - }, - this.svgGroup_); - this.imageElementBackground_ = Blockly.utils.createSvgElement( - 'rect', - { - 'class': 'blocklyTouchTargetBackground', - 'height': statusButtonWidth + 2 * touchPadding + 'px', - 'width': statusButtonWidth + 2 * touchPadding + 'px', - 'x': (statusButtonX - touchPadding) + 'px', - 'y': (marginY - touchPadding) + 'px' - }, - this.svgGroup_); - this.setImageSrc(this.imageSrc_); - } - - this.callback_ = Blockly.statusButtonCallback.bind(this, this.extensionId); - - this.mouseUpWrapper_ = Blockly.bindEventWithChecks_(this.imageElementBackground_, 'mouseup', - this, this.onMouseUp_); - return this.svgGroup_; -}; - -/** - * Set the image on the status button using a status string. - */ -Blockly.FlyoutExtensionCategoryHeader.prototype.refreshStatus = function() { - var status = Blockly.FlyoutExtensionCategoryHeader.getExtensionState(this.extensionId); - var basePath = Blockly.mainWorkspace.options.pathToMedia; - if (status == Blockly.StatusButtonState.READY) { - this.setImageSrc(basePath + 'status-ready.svg'); - } - if (status == Blockly.StatusButtonState.NOT_READY) { - this.setImageSrc(basePath + 'status-not-ready.svg'); - } -}; - -/** - * Set the source URL of the image for the button. - * @param {?string} src New source. - * @package - */ -Blockly.FlyoutExtensionCategoryHeader.prototype.setImageSrc = function(src) { - if (src === null) { - // No change if null. - return; - } - this.imageSrc_ = src; - if (this.imageElement_) { - this.imageElement_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', this.imageSrc_ || ''); - } -}; - -/** - * Gets the extension state. Overridden externally. - * @param {string} extensionId The ID of the extension in question. - * @return {Blockly.StatusButtonState} The state of the extension. - * @public - */ -Blockly.FlyoutExtensionCategoryHeader.getExtensionState = function(/* extensionId */) { - return Blockly.StatusButtonState.NOT_READY; -}; diff --git a/packages/scratch-blocks/core/flyout_horizontal.js b/packages/scratch-blocks/core/flyout_horizontal.js deleted file mode 100644 index b80d84464..000000000 --- a/packages/scratch-blocks/core/flyout_horizontal.js +++ /dev/null @@ -1,475 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Flyout tray containing blocks which may be created. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.HorizontalFlyout'); - -goog.require('Blockly.Block'); -goog.require('Blockly.Comment'); -goog.require('Blockly.Events'); -goog.require('Blockly.FlyoutButton'); -goog.require('Blockly.Flyout'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.dom'); -goog.require('goog.dom.animationFrame.polyfill'); -goog.require('goog.events'); -goog.require('goog.math.Rect'); -goog.require('goog.userAgent'); - - -/** - * Class for a flyout. - * @param {!Object} workspaceOptions Dictionary of options for the workspace. - * @extends {Blockly.Flyout} - * @constructor - */ -Blockly.HorizontalFlyout = function(workspaceOptions) { - workspaceOptions.getMetrics = this.getMetrics_.bind(this); - workspaceOptions.setMetrics = this.setMetrics_.bind(this); - - Blockly.HorizontalFlyout.superClass_.constructor.call(this, workspaceOptions); - /** - * Flyout should be laid out horizontally vs vertically. - * @type {boolean} - * @private - */ - this.horizontalLayout_ = true; -}; -goog.inherits(Blockly.HorizontalFlyout, Blockly.Flyout); - -/** - * Return an object with all the metrics required to size scrollbars for the - * flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the contents, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .absoluteTop: Top-edge of view. - * .viewLeft: Offset of the left edge of visible rectangle from parent, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteLeft: Left-edge of view. - * @return {Object} Contains size and position metrics of the flyout. - * @private - */ -Blockly.HorizontalFlyout.prototype.getMetrics_ = function() { - if (!this.isVisible()) { - // Flyout is hidden. - return null; - } - - try { - var optionBox = this.workspace_.getCanvas().getBBox(); - } catch (e) { - // Firefox has trouble with hidden elements (Bug 528969). - var optionBox = {height: 0, y: 0, width: 0, x: 0}; - } - - var absoluteTop = this.SCROLLBAR_PADDING; - var absoluteLeft = this.SCROLLBAR_PADDING; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { - absoluteTop = 0; - } - var viewHeight = this.height_; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { - viewHeight += this.MARGIN; - } - var viewWidth = this.width_ - 2 * this.SCROLLBAR_PADDING; - - var metrics = { - viewHeight: viewHeight, - viewWidth: viewWidth, - contentHeight: optionBox.height * this.workspace_.scale + 2 * this.MARGIN, - contentWidth: optionBox.width * this.workspace_.scale + 2 * this.MARGIN, - viewTop: -this.workspace_.scrollY, - viewLeft: -this.workspace_.scrollX, - contentTop: optionBox.y, - contentLeft: optionBox.x, - absoluteTop: absoluteTop, - absoluteLeft: absoluteLeft - }; - return metrics; -}; - -/** - * Sets the translation of the flyout to match the scrollbars. - * @param {!Object} xyRatio Contains a y property which is a float - * between 0 and 1 specifying the degree of scrolling and a - * similar x property. - * @private - */ -Blockly.HorizontalFlyout.prototype.setMetrics_ = function(xyRatio) { - var metrics = this.getMetrics_(); - // This is a fix to an apparent race condition. - if (!metrics) { - return; - } - - if (goog.isNumber(xyRatio.x)) { - this.workspace_.scrollX = -metrics.contentWidth * xyRatio.x; - } - - this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, - this.workspace_.scrollY + metrics.absoluteTop); - - if (this.categoryScrollPositions) { - this.selectCategoryByScrollPosition(-this.workspace_.scrollX); - } -}; - -/** - * Move the flyout to the edge of the workspace. - */ -Blockly.HorizontalFlyout.prototype.position = function() { - if (!this.isVisible()) { - return; - } - var targetWorkspaceMetrics = this.targetWorkspace_.getMetrics(); - if (!targetWorkspaceMetrics) { - // Hidden components will return null. - return; - } - var edgeWidth = this.horizontalLayout_ ? - targetWorkspaceMetrics.viewWidth - 2 * this.CORNER_RADIUS : - this.width_ - this.CORNER_RADIUS; - - var edgeHeight = this.horizontalLayout_ ? - this.height_ - this.CORNER_RADIUS : - targetWorkspaceMetrics.viewHeight - 2 * this.CORNER_RADIUS; - - this.setBackgroundPath_(edgeWidth, edgeHeight); - - var x = targetWorkspaceMetrics.absoluteLeft; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT) { - x += targetWorkspaceMetrics.viewWidth; - x -= this.width_; - } - - var y = targetWorkspaceMetrics.absoluteTop; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { - y += targetWorkspaceMetrics.viewHeight; - y -= this.height_; - } - - // Record the height for Blockly.Flyout.getMetrics_, or width if the layout is - // horizontal. - if (this.horizontalLayout_) { - this.width_ = targetWorkspaceMetrics.viewWidth; - } else { - this.height_ = targetWorkspaceMetrics.viewHeight; - } - - this.svgGroup_.setAttribute("width", this.width_); - this.svgGroup_.setAttribute("height", this.height_); - var transform = 'translate(' + x + 'px,' + y + 'px)'; - Blockly.utils.setCssTransform(this.svgGroup_, transform); - - // Update the scrollbar (if one exists). - if (this.scrollbar_) { - // Set the scrollbars origin to be the top left of the flyout. - this.scrollbar_.setOrigin(x, y); - this.scrollbar_.resize(); - } - // The blocks need to be visible in order to be laid out and measured correctly, but we don't - // want the flyout to show up until it's properly sized. - // Opacity is set to zero in show(). - this.svgGroup_.style.opacity = 1; -}; - -/** - * Create and set the path for the visible boundaries of the flyout. - * @param {number} width The width of the flyout, not including the - * rounded corners. - * @param {number} height The height of the flyout, not including - * rounded corners. - * @private - */ -Blockly.HorizontalFlyout.prototype.setBackgroundPath_ = function(width, height) { - var atTop = this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP; - // Start at top left. - var path = ['M 0,' + (atTop ? 0 : this.CORNER_RADIUS)]; - - if (atTop) { - // Top. - path.push('h', width + 2 * this.CORNER_RADIUS); - // Right. - path.push('v', height); - // Bottom. - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, - -this.CORNER_RADIUS, this.CORNER_RADIUS); - path.push('h', -1 * width); - // Left. - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, - -this.CORNER_RADIUS, -this.CORNER_RADIUS); - path.push('z'); - } else { - // Top. - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, - this.CORNER_RADIUS, -this.CORNER_RADIUS); - path.push('h', width); - // Right. - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, 1, - this.CORNER_RADIUS, this.CORNER_RADIUS); - path.push('v', height); - // Bottom. - path.push('h', -width - 2 * this.CORNER_RADIUS); - // Left. - path.push('z'); - } - this.svgBackground_.setAttribute('d', path.join(' ')); -}; - -/** - * Scroll the flyout to the top. - */ -Blockly.HorizontalFlyout.prototype.scrollToStart = function() { - this.scrollbar_.set(this.RTL ? Infinity : 0); -}; - -/** - * Scroll the flyout to a position. - * @param {number} pos The targeted scroll position. - * @package - */ -Blockly.HorizontalFlyout.prototype.scrollTo = function(pos) { - this.scrollTarget = pos * this.workspace_.scale; - - // Make sure not to set the scroll target past the farthest point we can - // scroll to, i.e. the content width minus the view width - var metrics = this.workspace_.getMetrics(); - var contentWidth = metrics.contentWidth; - var viewWidth = metrics.viewWidth; - this.scrollTarget = Math.min(this.scrollTarget, contentWidth - viewWidth); - - this.stepScrollAnimation(); -}; - -/** - * Scroll the flyout. - * @param {!Event} e Mouse wheel scroll event. - * @private - */ -Blockly.HorizontalFlyout.prototype.wheel_ = function(e) { - // remove scrollTarget to stop auto scrolling in stepScrollAnimation - this.scrollTarget = null; - - var delta = e.deltaX; - - // If we're scrolling more vertically than horizontally, use the vertical - // scroll delta instead. This allows people using a mouse wheel (which can - // only scroll vertically) to scroll the horizontal flyout. It also allows - // trackpad users to scroll it by scrolling either horizontally or - // vertically. - if (Math.abs(e.deltaY) > Math.abs(delta)) { - delta = e.deltaY; - } - - if (delta) { - // Firefox's mouse wheel deltas are a tenth that of Chrome/Safari. - // DeltaMode is 1 for a mouse wheel, but not for a trackpad scroll event - if (goog.userAgent.GECKO && (e.deltaMode === 1)) { - delta *= 10; - } - var metrics = this.getMetrics_(); - var pos = metrics.viewLeft + delta; - var limit = metrics.contentWidth - metrics.viewWidth; - pos = Math.min(pos, limit); - pos = Math.max(pos, 0); - this.scrollbar_.set(pos); - // When the flyout moves from a wheel event, hide WidgetDiv and DropDownDiv. - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - } - - // Don't scroll the page. - e.preventDefault(); - // Don't propagate mousewheel event (zooming). - e.stopPropagation(); -}; - -/** - * Lay out the blocks in the flyout. - * @param {!Array.} contents The blocks and buttons to lay out. - * @param {!Array.} gaps The visible gaps between blocks. - * @private - */ -Blockly.HorizontalFlyout.prototype.layout_ = function(contents, gaps) { - this.workspace_.scale = this.targetWorkspace_.scale; - var margin = this.MARGIN; - var cursorX = margin; - var cursorY = margin; - if (this.RTL) { - contents = contents.reverse(); - } - - for (var i = 0, item; item = contents[i]; i++) { - if (item.type == 'block') { - var block = item.block; - var allBlocks = block.getDescendants(false); - for (var j = 0, child; child = allBlocks[j]; j++) { - // Mark blocks as being inside a flyout. This is used to detect and - // prevent the closure of the flyout if the user right-clicks on such a - // block. - child.isInFlyout = true; - } - var root = block.getSvgRoot(); - var blockHW = block.getHeightWidth(); - - var moveX = cursorX; - if (this.RTL) { - moveX += blockHW.width; - } - - block.moveBy(moveX, cursorY); - cursorX += blockHW.width + gaps[i]; - - // Create an invisible rectangle under the block to act as a button. Just - // using the block as a button is poor, since blocks have holes in them. - var rect = Blockly.utils.createSvgElement('rect', {'fill-opacity': 0}, null); - rect.tooltip = block; - Blockly.Tooltip.bindMouseEvents(rect); - // Add the rectangles under the blocks, so that the blocks' tooltips work. - this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot()); - block.flyoutRect_ = rect; - this.backgroundButtons_[i] = rect; - - this.addBlockListeners_(root, block, rect); - } else if (item.type == 'button') { - var button = item.button; - var buttonSvg = button.createDom(); - button.moveTo(cursorX, cursorY); - button.show(); - // Clicking on a flyout button or label is a lot like clicking on the - // flyout background. - this.listeners_.push(Blockly.bindEventWithChecks_(buttonSvg, 'mousedown', - this, this.onMouseDown_)); - - - this.buttons_.push(button); - cursorX += (button.width + gaps[i]); - } - } -}; - -/** - * Determine if a drag delta is toward the workspace, based on the position - * and orientation of the flyout. This to decide if a new block should be - * created or if the flyout should scroll. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at mouse down, in pixel units. - * @return {boolean} true if the drag is toward the workspace. - * @package - */ -Blockly.HorizontalFlyout.prototype.isDragTowardWorkspace = function(currentDragDeltaXY) { - var dx = currentDragDeltaXY.x; - var dy = currentDragDeltaXY.y; - // Direction goes from -180 to 180, with 0 toward the right and 90 on top. - var dragDirection = Math.atan2(dy, dx) / Math.PI * 180; - - var draggingTowardWorkspace = false; - var range = this.dragAngleRange_; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { - // Horizontal at top. - if (dragDirection < 90 + range && dragDirection > 90 - range) { - draggingTowardWorkspace = true; - } - } else { - // Horizontal at bottom. - if (dragDirection > -90 - range && dragDirection < -90 + range) { - draggingTowardWorkspace = true; - } - } - return draggingTowardWorkspace; -}; - -/** - * Return the deletion rectangle for this flyout in viewport coordinates. - * @return {goog.math.Rect} Rectangle in which to delete. - */ -Blockly.HorizontalFlyout.prototype.getClientRect = function() { - if (!this.svgGroup_) { - return null; - } - - var flyoutRect = this.svgGroup_.getBoundingClientRect(); - // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout - // area are still deleted. Must be larger than the largest screen size, - // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). - var BIG_NUM = 1000000000; - var y = flyoutRect.top; - var height = flyoutRect.height; - - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { - return new goog.math.Rect(-BIG_NUM, y - BIG_NUM, BIG_NUM * 2, - BIG_NUM + height); - } else if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { - return new goog.math.Rect(-BIG_NUM, y, BIG_NUM * 2, - BIG_NUM + height); - } -}; - -/** - * Compute height of flyout. Position button under each block. - * For RTL: Lay out the blocks right-aligned. - * @param {!Array} blocks The blocks to reflow. - */ -Blockly.HorizontalFlyout.prototype.reflowInternal_ = function(blocks) { - this.workspace_.scale = this.targetWorkspace_.scale; - var flyoutHeight = 0; - for (var i = 0, block; block = blocks[i]; i++) { - flyoutHeight = Math.max(flyoutHeight, block.getHeightWidth().height); - } - flyoutHeight += this.MARGIN * 1.5; - flyoutHeight *= this.workspace_.scale; - flyoutHeight += Blockly.Scrollbar.scrollbarThickness; - if (this.height_ != flyoutHeight) { - for (var i = 0, block; block = blocks[i]; i++) { - var blockHW = block.getHeightWidth(); - if (block.flyoutRect_) { - block.flyoutRect_.setAttribute('width', blockHW.width); - block.flyoutRect_.setAttribute('height', blockHW.height); - // Rectangles behind blocks with output tabs are shifted a bit. - var blockXY = block.getRelativeToSurfaceXY(); - block.flyoutRect_.setAttribute('y', blockXY.y); - block.flyoutRect_.setAttribute('x', - this.RTL ? blockXY.x - blockHW.width : blockXY.x); - // For hat blocks we want to shift them down by the hat height - // since the y coordinate is the corner, not the top of the hat. - var hatOffset = - block.startHat_ ? Blockly.BlockSvg.START_HAT_HEIGHT : 0; - if (hatOffset) { - block.moveBy(0, hatOffset); - } - block.flyoutRect_.setAttribute('y', blockXY.y); - } - } - // Record the height for .getMetrics_ and .position. - this.height_ = flyoutHeight; - // Call this since it is possible the trash and zoom buttons need - // to move. e.g. on a bottom positioned flyout when zoom is clicked. - this.targetWorkspace_.resize(); - } -}; diff --git a/packages/scratch-blocks/core/flyout_vertical.js b/packages/scratch-blocks/core/flyout_vertical.js deleted file mode 100644 index 6f9c744a5..000000000 --- a/packages/scratch-blocks/core/flyout_vertical.js +++ /dev/null @@ -1,770 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Layout code for a vertical variant of the flyout. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.VerticalFlyout'); - -goog.require('Blockly.Block'); -goog.require('Blockly.Comment'); -goog.require('Blockly.Events'); -goog.require('Blockly.Flyout'); -goog.require('Blockly.FlyoutButton'); -goog.require('Blockly.utils'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.dom'); -goog.require('goog.dom.animationFrame.polyfill'); -goog.require('goog.events'); -goog.require('goog.math.Rect'); -goog.require('goog.userAgent'); - - -/** - * Class for a flyout. - * @param {!Object} workspaceOptions Dictionary of options for the workspace. - * @extends {Blockly.Flyout} - * @constructor - */ -Blockly.VerticalFlyout = function(workspaceOptions) { - workspaceOptions.getMetrics = this.getMetrics_.bind(this); - workspaceOptions.setMetrics = this.setMetrics_.bind(this); - - Blockly.VerticalFlyout.superClass_.constructor.call(this, workspaceOptions); - /** - * Flyout should be laid out vertically. - * @type {boolean} - * @private - */ - this.horizontalLayout_ = false; - - /** - * List of checkboxes next to variable blocks. - * Each element is an object containing the SVG for the checkbox, a boolean - * for its checked state, and the block the checkbox is associated with. - * @type {!Array.} - * @private - */ - this.checkboxes_ = []; -}; -goog.inherits(Blockly.VerticalFlyout, Blockly.Flyout); - -/** - * Does the flyout automatically close when a block is created? - * @type {boolean} - */ -Blockly.VerticalFlyout.prototype.autoClose = false; - -/** - * The width of the flyout, if not otherwise specified. - * @type {number} - */ -Blockly.VerticalFlyout.prototype.DEFAULT_WIDTH = 250; - -/** - * Size of a checkbox next to a variable reporter. - * @type {number} - * @const - */ -Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE = 25; - -/** - * Amount of touchable padding around reporter checkboxes. - * @type {number} - * @const - */ -Blockly.VerticalFlyout.prototype.CHECKBOX_TOUCH_PADDING = 12; - -/** - * SVG path data for checkmark in checkbox. - * @type {string} - * @const - */ -Blockly.VerticalFlyout.prototype.CHECKMARK_PATH = - 'M' + Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE / 4 + - ' ' + Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE / 2 + - 'L' + 5 * Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE / 12 + - ' ' + 2 * Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE / 3 + - 'L' + 3 * Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE / 4 + - ' ' + Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE / 3; - -/** - * Size of the checkbox corner radius - * @type {number} - * @const - */ -Blockly.VerticalFlyout.prototype.CHECKBOX_CORNER_RADIUS = 5; - -/** - * Space above and around the checkbox. - * @type {number} - * @const - */ -Blockly.VerticalFlyout.prototype.CHECKBOX_MARGIN = Blockly.Flyout.prototype.MARGIN; - -/** - * Total additional width of a row that contains a checkbox. - * @type {number} - * @const - */ -Blockly.VerticalFlyout.prototype.CHECKBOX_SPACE_X = - Blockly.VerticalFlyout.prototype.CHECKBOX_SIZE + - 2 * Blockly.VerticalFlyout.prototype.CHECKBOX_MARGIN; - -/** - * Initializes the flyout. - * @param {!Blockly.Workspace} targetWorkspace The workspace in which to create - * new blocks. - */ -Blockly.VerticalFlyout.prototype.init = function(targetWorkspace) { - Blockly.VerticalFlyout.superClass_.init.call(this, targetWorkspace); - this.workspace_.scale = targetWorkspace.scale; -}; - -/** - * Creates the flyout's DOM. Only needs to be called once. - * @param {string} tagName HTML element - * @return {!Element} The flyout's SVG group. - */ -Blockly.VerticalFlyout.prototype.createDom = function(tagName) { - Blockly.VerticalFlyout.superClass_.createDom.call(this, tagName); - - /* - - - - - - - */ - this.defs_ = Blockly.utils.createSvgElement('defs', {}, this.svgGroup_); - var clipPath = Blockly.utils.createSvgElement('clipPath', - {'id':'blocklyBlockMenuClipPath'}, this.defs_); - this.clipRect_ = Blockly.utils.createSvgElement('rect', - { - 'id': 'blocklyBlockMenuClipRect', - 'height': '0', - 'width': '0', - 'y': '0', - 'x': '0' - }, - clipPath); - this.workspace_.svgGroup_.setAttribute( - 'clip-path', 'url(#blocklyBlockMenuClipPath)'); - - return this.svgGroup_; -}; - -/** - * Calculate the bounding box of the flyout. - * - * @return {Object} Contains the position and size of the bounding - * box containing the elements (blocks, buttons, labels) in the flyout. - */ -Blockly.VerticalFlyout.prototype.getContentBoundingBox_ = function() { - var contentBounds = this.workspace_.getBlocksBoundingBox(); - var bounds = { - xMin: contentBounds.x, - yMin: contentBounds.y, - xMax: contentBounds.x + contentBounds.width, - yMax: contentBounds.y + contentBounds.height - }; - - // Check if any of the buttons/labels are outside the blocks bounding box. - for (var i = 0; i < this.buttons_.length; i ++) { - var button = this.buttons_[i]; - var buttonPosition = button.getPosition(); - if (buttonPosition.x < bounds.xMin) { - bounds.xMin = buttonPosition.x; - } - if (buttonPosition.y < bounds.yMin) { - bounds.yMin = buttonPosition.y; - } - // Button extends past the bounding box to the right. - if (buttonPosition.x + button.width > bounds.xMax) { - bounds.xMax = buttonPosition.x + button.width; - } - - // Button extends past the bounding box on the bottom - if (buttonPosition.y + button.height > bounds.yMax) { - bounds.yMax = buttonPosition.y + button.height; - } - } - - return { - x: bounds.xMin, - y: bounds.yMin, - width: bounds.xMax - bounds.xMin, - height: bounds.yMax - bounds.yMin, - }; -}; - -/** - * Return an object with all the metrics required to size scrollbars for the - * flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the contents, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .absoluteTop: Top-edge of view. - * .viewLeft: Offset of the left edge of visible rectangle from parent, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteLeft: Left-edge of view. - * @return {Object} Contains size and position metrics of the flyout. - * @private - */ -Blockly.VerticalFlyout.prototype.getMetrics_ = function() { - if (!this.isVisible()) { - // Flyout is hidden. - return null; - } - - var optionBox = this.getContentBoundingBox_(); - - // Padding for the end of the scrollbar. - var absoluteTop = this.SCROLLBAR_PADDING; - var absoluteLeft = 0; - - var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; - var viewWidth = this.getWidth() - this.SCROLLBAR_PADDING; - - // Add padding to the bottom of the flyout, so we can scroll to the top of - // the last category. - var contentHeight = optionBox.height * this.workspace_.scale; - this.recordCategoryScrollPositions_(); - var bottomPadding = this.MARGIN; - if (this.categoryScrollPositions.length > 0) { - var lastLabel = this.categoryScrollPositions[ - this.categoryScrollPositions.length - 1]; - var lastPos = lastLabel.position * this.workspace_.scale; - var lastCategoryHeight = contentHeight - lastPos; - if (lastCategoryHeight < viewHeight) { - bottomPadding = viewHeight - lastCategoryHeight; - } - } - - var metrics = { - viewHeight: viewHeight, - viewWidth: viewWidth, - contentHeight: contentHeight + bottomPadding, - contentWidth: optionBox.width * this.workspace_.scale + 2 * this.MARGIN, - viewTop: -this.workspace_.scrollY + optionBox.y, - viewLeft: -this.workspace_.scrollX, - contentTop: optionBox.y, - contentLeft: optionBox.x, - absoluteTop: absoluteTop, - absoluteLeft: absoluteLeft - }; - return metrics; -}; - -/** - * Sets the translation of the flyout to match the scrollbars. - * @param {!Object} xyRatio Contains a y property which is a float - * between 0 and 1 specifying the degree of scrolling and a - * similar x property. - * @private - */ -Blockly.VerticalFlyout.prototype.setMetrics_ = function(xyRatio) { - var metrics = this.getMetrics_(); - // This is a fix to an apparent race condition. - if (!metrics) { - return; - } - if (goog.isNumber(xyRatio.y)) { - this.workspace_.scrollY = -metrics.contentHeight * xyRatio.y; - } - this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, - this.workspace_.scrollY + metrics.absoluteTop); - - this.clipRect_.setAttribute('height', Math.max(0, metrics.viewHeight) + 'px'); - this.clipRect_.setAttribute('width', metrics.viewWidth + 'px'); - - if (this.categoryScrollPositions) { - this.selectCategoryByScrollPosition(-this.workspace_.scrollY); - } -}; - -/** - * Move the flyout to the edge of the workspace. - */ -Blockly.VerticalFlyout.prototype.position = function() { - if (!this.isVisible()) { - return; - } - var targetWorkspaceMetrics = this.targetWorkspace_.getMetrics(); - if (!targetWorkspaceMetrics) { - // Hidden components will return null. - return; - } - - // This version of the flyout does not change width to fit its contents. - // Instead it matches the width of its parent or uses a default value. - this.width_ = this.getWidth(); - - if (this.parentToolbox_) { - var toolboxWidth = this.parentToolbox_.getWidth(); - var categoryWidth = toolboxWidth - this.width_; - var x = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT ? - targetWorkspaceMetrics.viewWidth : categoryWidth; - var y = 0; - } else { - var x = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT ? - targetWorkspaceMetrics.viewWidth - this.width_ : 0; - var y = 0; - } - - // Record the height for Blockly.Flyout.getMetrics_ - this.height_ = Math.max(0, targetWorkspaceMetrics.viewHeight - y); - - this.setBackgroundPath_(this.width_, this.height_); - - this.svgGroup_.setAttribute("width", this.width_); - this.svgGroup_.setAttribute("height", this.height_); - var transform = 'translate(' + x + 'px,' + y + 'px)'; - Blockly.utils.setCssTransform(this.svgGroup_, transform); - - // Update the scrollbar (if one exists). - if (this.scrollbar_) { - // Set the scrollbars origin to be the top left of the flyout. - this.scrollbar_.setOrigin(x, y); - this.scrollbar_.resize(); - } - // The blocks need to be visible in order to be laid out and measured - // correctly, but we don't want the flyout to show up until it's properly - // sized. Opacity is set to zero in show(). - this.svgGroup_.style.opacity = 1; -}; - -/** - * Create and set the path for the visible boundaries of the flyout. - * @param {number} width The width of the flyout, not including the - * rounded corners. - * @param {number} height The height of the flyout, not including - * rounded corners. - * @private - */ -Blockly.VerticalFlyout.prototype.setBackgroundPath_ = function(width, height) { - var atRight = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT; - // Decide whether to start on the left or right. - var path = ['M ' + 0 + ',0']; - // Top. - path.push('h', width); - // Rounded corner. - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, - atRight ? 0 : 1, - atRight ? -this.CORNER_RADIUS : this.CORNER_RADIUS, - this.CORNER_RADIUS); - // Side closest to workspace. - path.push('v', Math.max(0, height - this.CORNER_RADIUS * 2)); - // Rounded corner. - path.push('a', this.CORNER_RADIUS, this.CORNER_RADIUS, 0, 0, - atRight ? 0 : 1, - atRight ? this.CORNER_RADIUS : -this.CORNER_RADIUS, - this.CORNER_RADIUS); - // Bottom. - path.push('h', -width); - path.push('z'); - this.svgBackground_.setAttribute('d', path.join(' ')); -}; - -/** - * Scroll the flyout to the top. - */ -Blockly.VerticalFlyout.prototype.scrollToStart = function() { - this.scrollbar_.set(0); -}; - -/** - * Scroll the flyout to a position. - * @param {number} pos The targeted scroll position in workspace coordinates. - * @package - */ -Blockly.VerticalFlyout.prototype.scrollTo = function(pos) { - this.scrollTarget = pos * this.workspace_.scale; - - // Make sure not to set the scroll target below the lowest point we can - // scroll to, i.e. the content height minus the view height - var metrics = this.workspace_.getMetrics(); - var contentHeight = metrics.contentHeight; - var viewHeight = metrics.viewHeight; - this.scrollTarget = Math.min(this.scrollTarget, contentHeight - viewHeight); - - this.stepScrollAnimation(); -}; - -/** - * Scroll the flyout. - * @param {!Event} e Mouse wheel scroll event. - * @private - */ -Blockly.VerticalFlyout.prototype.wheel_ = function(e) { - // remove scrollTarget to stop auto scrolling in stepScrollAnimation - this.scrollTarget = null; - - var delta = e.deltaY; - - if (delta) { - // Firefox's mouse wheel deltas are a tenth that of Chrome/Safari. - // DeltaMode is 1 for a mouse wheel, but not for a trackpad scroll event - if (goog.userAgent.GECKO && (e.deltaMode === 1)) { - delta *= 10; - } - var metrics = this.getMetrics_(); - var pos = (metrics.viewTop - metrics.contentTop) + delta; - var limit = metrics.contentHeight - metrics.viewHeight; - pos = Math.min(pos, limit); - pos = Math.max(pos, 0); - this.scrollbar_.set(pos); - // When the flyout moves from a wheel event, hide WidgetDiv and DropDownDiv. - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - } - - // Don't scroll the page. - e.preventDefault(); - // Don't propagate mousewheel event (zooming). - e.stopPropagation(); -}; - -/** - * Delete blocks and background buttons from a previous showing of the flyout. - * @private - */ -Blockly.VerticalFlyout.prototype.clearOldBlocks_ = function() { - Blockly.VerticalFlyout.superClass_.clearOldBlocks_.call(this); - - // Do the same for checkboxes. - for (var i = 0, elem; elem = this.checkboxes_[i]; i++) { - elem.block.flyoutCheckbox = null; - goog.dom.removeNode(elem.svgRoot); - } - this.checkboxes_ = []; -}; - -/** - * Add listeners to a block that has been added to the flyout. - * @param {Element} root The root node of the SVG group the block is in. - * @param {!Blockly.Block} block The block to add listeners for. - * @param {!Element} rect The invisible rectangle under the block that acts as - * a button for that block. - * @private - */ -Blockly.VerticalFlyout.prototype.addBlockListeners_ = function(root, block, - rect) { - Blockly.VerticalFlyout.superClass_.addBlockListeners_.call(this, root, block, - rect); - if (block.flyoutCheckbox) { - this.listeners_.push(Blockly.bindEvent_(block.flyoutCheckbox.svgRoot, - 'mousedown', null, this.checkboxClicked_(block.flyoutCheckbox))); - } -}; - -/** - * Lay out the blocks in the flyout. - * @param {!Array.} contents The blocks and buttons to lay out. - * @param {!Array.} gaps The visible gaps between blocks. - * @private - */ -Blockly.VerticalFlyout.prototype.layout_ = function(contents, gaps) { - var margin = this.MARGIN; - var flyoutWidth = this.getWidth() / this.workspace_.scale; - var cursorX = margin; - var cursorY = margin; - - for (var i = 0, item; item = contents[i]; i++) { - if (item.type == 'block') { - var block = item.block; - var allBlocks = block.getDescendants(false); - for (var j = 0, child; child = allBlocks[j]; j++) { - // Mark blocks as being inside a flyout. This is used to detect and - // prevent the closure of the flyout if the user right-clicks on such a - // block. - child.isInFlyout = true; - } - var root = block.getSvgRoot(); - var blockHW = block.getHeightWidth(); - - // Figure out where the block goes, taking into account its size, whether - // we're in RTL mode, and whether it has a checkbox. - var oldX = block.getRelativeToSurfaceXY().x; - var newX = flyoutWidth - this.MARGIN; - - var moveX = this.RTL ? newX - oldX : margin; - if (block.hasCheckboxInFlyout()) { - this.createCheckbox_(block, cursorX, cursorY, blockHW); - if (this.RTL) { - moveX -= (this.CHECKBOX_SIZE + this.CHECKBOX_MARGIN); - } else { - moveX += this.CHECKBOX_SIZE + this.CHECKBOX_MARGIN; - } - } - - // The block moves a bit extra for the hat, but the block's rectangle - // doesn't. That's because the hat actually extends up from 0. - block.moveBy(moveX, - cursorY + (block.startHat_ ? Blockly.BlockSvg.START_HAT_HEIGHT : 0)); - - var rect = this.createRect_(block, this.RTL ? moveX - blockHW.width : moveX, cursorY, blockHW, i); - - this.addBlockListeners_(root, block, rect); - - cursorY += blockHW.height + gaps[i] + (block.startHat_ ? Blockly.BlockSvg.START_HAT_HEIGHT : 0); - } else if (item.type == 'button') { - var button = item.button; - var buttonSvg = button.createDom(); - if (this.RTL) { - button.moveTo(flyoutWidth - this.MARGIN - button.width, cursorY); - } else { - button.moveTo(cursorX, cursorY); - } - button.show(); - // Clicking on a flyout button or label is a lot like clicking on the - // flyout background. - this.listeners_.push(Blockly.bindEventWithChecks_( - buttonSvg, 'mousedown', this, this.onMouseDown_)); - - this.buttons_.push(button); - cursorY += button.height + gaps[i]; - } - } -}; - -/** - * Create and place a rectangle corresponding to the given block. - * @param {!Blockly.Block} block The block to associate the rect to. - * @param {number} x The x position of the cursor during this layout pass. - * @param {number} y The y position of the cursor during this layout pass. - * @param {!{height: number, width: number}} blockHW The height and width of the - * block. - * @param {number} index The index into the background buttons list where this - * rect should be placed. - * @return {!SVGElement} Newly created SVG element for the rectangle behind the - * block. - * @private - */ -Blockly.VerticalFlyout.prototype.createRect_ = function(block, x, y, - blockHW, index) { - // Create an invisible rectangle under the block to act as a button. Just - // using the block as a button is poor, since blocks have holes in them. - var rect = Blockly.utils.createSvgElement('rect', - { - 'fill-opacity': 0, - 'x': x, - 'y': y, - 'height': blockHW.height, - 'width': blockHW.width - }, null); - rect.tooltip = block; - Blockly.Tooltip.bindMouseEvents(rect); - // Add the rectangles under the blocks, so that the blocks' tooltips work. - this.workspace_.getCanvas().insertBefore(rect, block.getSvgRoot()); - - block.flyoutRect_ = rect; - this.backgroundButtons_[index] = rect; - return rect; -}; - -/** - * Create and place a checkbox corresponding to the given block. - * @param {!Blockly.Block} block The block to associate the checkbox to. - * @param {number} cursorX The x position of the cursor during this layout pass. - * @param {number} cursorY The y position of the cursor during this layout pass. - * @param {!{height: number, width: number}} blockHW The height and width of the - * block. - * @private - */ -Blockly.VerticalFlyout.prototype.createCheckbox_ = function(block, cursorX, - cursorY, blockHW) { - var checkboxState = Blockly.VerticalFlyout.getCheckboxState(block.id); - var svgRoot = block.getSvgRoot(); - var extraSpace = this.CHECKBOX_SIZE + this.CHECKBOX_MARGIN; - var width = this.RTL ? this.getWidth() / this.workspace_.scale - extraSpace : cursorX; - var height = cursorY + blockHW.height / 2 - this.CHECKBOX_SIZE / 2; - var touchMargin = this.CHECKBOX_TOUCH_PADDING; - var checkboxGroup = Blockly.utils.createSvgElement('g', - { - 'transform': 'translate(' + width + ', ' + height + ')' - }, null); - Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyFlyoutCheckbox', - 'height': this.CHECKBOX_SIZE, - 'width': this.CHECKBOX_SIZE, - 'rx': this.CHECKBOX_CORNER_RADIUS, - 'ry': this.CHECKBOX_CORNER_RADIUS - }, checkboxGroup); - Blockly.utils.createSvgElement('path', - { - 'class': 'blocklyFlyoutCheckboxPath', - 'd': this.CHECKMARK_PATH - }, checkboxGroup); - Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyTouchTargetBackground', - 'x': -touchMargin + 'px', - 'y': -touchMargin + 'px', - 'height': this.CHECKBOX_SIZE + 2 * touchMargin, - 'width': this.CHECKBOX_SIZE + 2 * touchMargin, - }, checkboxGroup); - var checkboxObj = {svgRoot: checkboxGroup, clicked: checkboxState, block: block}; - - if (checkboxState) { - Blockly.utils.addClass((checkboxObj.svgRoot), 'checked'); - } - - block.flyoutCheckbox = checkboxObj; - this.workspace_.getCanvas().insertBefore(checkboxGroup, svgRoot); - this.checkboxes_.push(checkboxObj); -}; - -/** - * Respond to a click on a checkbox in the flyout. - * @param {!Object} checkboxObj An object containing the svg element of the - * checkbox, a boolean for the state of the checkbox, and the block the - * checkbox is associated with. - * @return {!Function} Function to call when checkbox is clicked. - * @private - */ -Blockly.VerticalFlyout.prototype.checkboxClicked_ = function(checkboxObj) { - return function(e) { - this.setCheckboxState(checkboxObj.block.id, !checkboxObj.clicked); - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); - e.preventDefault(); - }.bind(this); -}; - -/** - * Set the state of a checkbox by block ID. - * @param {string} blockId ID of the block whose checkbox should be set - * @param {boolean} value Value to set the checkbox to. - * @public - */ -Blockly.VerticalFlyout.prototype.setCheckboxState = function(blockId, value) { - for (var i = 0; i < this.checkboxes_.length; i++) { - var checkboxObj = this.checkboxes_[i]; - if (checkboxObj.block.id === blockId) { - if (checkboxObj.clicked === value) return; - - var oldValue = checkboxObj.clicked; - checkboxObj.clicked = value; - - if (checkboxObj.clicked) { - Blockly.utils.addClass((checkboxObj.svgRoot), 'checked'); - } else { - Blockly.utils.removeClass((checkboxObj.svgRoot), 'checked'); - } - - Blockly.Events.fire(new Blockly.Events.Change( - checkboxObj.block, 'checkbox', null, oldValue, value)); - - return; - } - } -}; - -/** - * Determine if a drag delta is toward the workspace, based on the position - * and orientation of the flyout. This to decide if a new block should be - * created or if the flyout should scroll. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at mouse down, in pixel units. - * @return {boolean} true if the drag is toward the workspace. - * @package - */ -Blockly.VerticalFlyout.prototype.isDragTowardWorkspace = function(currentDragDeltaXY) { - var dx = currentDragDeltaXY.x; - var dy = currentDragDeltaXY.y; - // Direction goes from -180 to 180, with 0 toward the right and 90 on top. - var dragDirection = Math.atan2(dy, dx) / Math.PI * 180; - - var draggingTowardWorkspace = false; - var range = this.dragAngleRange_; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { - // Vertical at left. - if (dragDirection < range && dragDirection > -range) { - draggingTowardWorkspace = true; - } - } else { - // Vertical at right. - if (dragDirection < -180 + range || dragDirection > 180 - range) { - draggingTowardWorkspace = true; - } - } - return draggingTowardWorkspace; -}; - -/** - * Return the deletion rectangle for this flyout in viewport coordinates. - * Deletion area is the height of the flyout, but extends to the left (in LTR) - * by a lot in order to allow for deleting blocks when dragged beyond the left - * window edge. In RTL, the delete area extends off to the right. - * The top/bottom do not extend to allow dragging blocks outside of the workspace - * to be dropped (e.g. to the backpack). - * @return {goog.math.Rect} Rectangle in which to delete. - */ -Blockly.VerticalFlyout.prototype.getClientRect = function() { - if (!this.svgGroup_) { - return null; - } - - var flyoutRect = this.svgGroup_.getBoundingClientRect(); - // BIG_NUM is offscreen padding so that blocks dragged beyond the shown flyout - // area are still deleted. Must be larger than the largest screen size, - // but be smaller than half Number.MAX_SAFE_INTEGER (not available on IE). - var BIG_NUM = 1000000000; - var x = flyoutRect.left; - var y = flyoutRect.top; - var width = flyoutRect.width; - var height = flyoutRect.height; - - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { - return new goog.math.Rect(x - BIG_NUM, y, BIG_NUM + width, height); - } else { // Right - return new goog.math.Rect(x, y, BIG_NUM + width, height); - } -}; - -/** - * Compute width of flyout. Position button under each block. - * For RTL: Lay out the blocks right-aligned. - * @param {!Array} blocks The blocks to reflow. - */ -Blockly.VerticalFlyout.prototype.reflowInternal_ = function(/* blocks */) { - // This is a no-op because the flyout is a fixed size. - return; -}; - -/** - * Gets the checkbox state for a block - * @param {string} blockId The ID of the block in question. - * @return {boolean} Whether the block is checked. - * @public - */ -Blockly.VerticalFlyout.getCheckboxState = function(/* blockId */) { - return false; -}; diff --git a/packages/scratch-blocks/core/generator.js b/packages/scratch-blocks/core/generator.js deleted file mode 100644 index b567304f8..000000000 --- a/packages/scratch-blocks/core/generator.js +++ /dev/null @@ -1,426 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility functions for generating executable code from - * Blockly code. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Generator'); - -goog.require('Blockly.Block'); -goog.require('goog.asserts'); - - -/** - * Class for a code generator that translates the blocks into a language. - * @param {string} name Language name of this generator. - * @constructor - */ -Blockly.Generator = function(name) { - this.name_ = name; - this.FUNCTION_NAME_PLACEHOLDER_REGEXP_ = - new RegExp(this.FUNCTION_NAME_PLACEHOLDER_, 'g'); -}; - -/** - * Category to separate generated function names from variables and procedures. - */ -Blockly.Generator.NAME_TYPE = 'generated_function'; - -/** - * Arbitrary code to inject into locations that risk causing infinite loops. - * Any instances of '%1' will be replaced by the block ID that failed. - * E.g. ' checkTimeout(%1);\n' - * @type {?string} - */ -Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null; - -/** - * Arbitrary code to inject before every statement. - * Any instances of '%1' will be replaced by the block ID of the statement. - * E.g. 'highlight(%1);\n' - * @type {?string} - */ -Blockly.Generator.prototype.STATEMENT_PREFIX = null; - -/** - * The method of indenting. Defaults to two spaces, but language generators - * may override this to increase indent or change to tabs. - * @type {string} - */ -Blockly.Generator.prototype.INDENT = ' '; - -/** - * Maximum length for a comment before wrapping. Does not account for - * indenting level. - * @type {number} - */ -Blockly.Generator.prototype.COMMENT_WRAP = 60; - -/** - * List of outer-inner pairings that do NOT require parentheses. - * @type {!Array.>} - */ -Blockly.Generator.prototype.ORDER_OVERRIDES = []; - -/** - * Generate code for all blocks in the workspace to the specified language. - * @param {Blockly.Workspace} workspace Workspace to generate code from. - * @return {string} Generated code. - */ -Blockly.Generator.prototype.workspaceToCode = function(workspace) { - if (!workspace) { - // Backwards compatibility from before there could be multiple workspaces. - console.warn('No workspace specified in workspaceToCode call. Guessing.'); - workspace = Blockly.getMainWorkspace(); - } - var code = []; - this.init(workspace); - var blocks = workspace.getTopBlocks(true); - for (var x = 0, block; block = blocks[x]; x++) { - var line = this.blockToCode(block); - if (goog.isArray(line)) { - // Value blocks return tuples of code and operator order. - // Top-level blocks don't care about operator order. - line = line[0]; - } - if (line) { - if (block.outputConnection && this.scrubNakedValue) { - // This block is a naked value. Ask the language's code generator if - // it wants to append a semicolon, or something. - line = this.scrubNakedValue(line); - } - code.push(line); - } - } - code = code.join('\n'); // Blank line between each section. - code = this.finish(code); - // Final scrubbing of whitespace. - code = code.replace(/^\s+\n/, ''); - code = code.replace(/\n\s+$/, '\n'); - code = code.replace(/[ \t]+\n/g, '\n'); - return code; -}; - -// The following are some helpful functions which can be used by multiple -// languages. - -/** - * Prepend a common prefix onto each line of code. - * @param {string} text The lines of code. - * @param {string} prefix The common prefix. - * @return {string} The prefixed lines of code. - */ -Blockly.Generator.prototype.prefixLines = function(text, prefix) { - return prefix + text.replace(/(?!\n$)\n/g, '\n' + prefix); -}; - -/** - * Recursively spider a tree of blocks, returning all their comments. - * @param {!Blockly.Block} block The block from which to start spidering. - * @return {string} Concatenated list of comments. - */ -Blockly.Generator.prototype.allNestedComments = function(block) { - var comments = []; - var blocks = block.getDescendants(true); - for (var i = 0; i < blocks.length; i++) { - var comment = blocks[i].getCommentText(); - if (comment) { - comments.push(comment); - } - } - // Append an empty string to create a trailing line break when joined. - if (comments.length) { - comments.push(''); - } - return comments.join('\n'); -}; - -/** - * Generate code for the specified block (and attached blocks). - * @param {Blockly.Block} block The block to generate code for. - * @return {string|!Array} For statement blocks, the generated code. - * For value blocks, an array containing the generated code and an - * operator order value. Returns '' if block is null. - */ -Blockly.Generator.prototype.blockToCode = function(block) { - if (!block) { - return ''; - } - if (block.disabled) { - // Skip past this block if it is disabled. - return this.blockToCode(block.getNextBlock()); - } - - var func = this[block.type]; - goog.asserts.assertFunction(func, - 'Language "%s" does not know how to generate code for block type "%s".', - this.name_, block.type); - // First argument to func.call is the value of 'this' in the generator. - // Prior to 24 September 2013 'this' was the only way to access the block. - // The current prefered method of accessing the block is through the second - // argument to func.call, which becomes the first parameter to the generator. - var code = func.call(block, block); - if (goog.isArray(code)) { - // Value blocks return tuples of code and operator order. - goog.asserts.assert(block.outputConnection, - 'Expecting string from statement block "%s".', block.type); - return [this.scrub_(block, code[0]), code[1]]; - } else if (goog.isString(code)) { - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. - if (this.STATEMENT_PREFIX) { - code = this.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\'') + - code; - } - return this.scrub_(block, code); - } else if (code === null) { - // Block has handled code generation itself. - return ''; - } else { - goog.asserts.fail('Invalid code generated: %s', code); - } -}; - -/** - * Generate code representing the specified value input. - * @param {!Blockly.Block} block The block containing the input. - * @param {string} name The name of the input. - * @param {number} outerOrder The maximum binding strength (minimum order value) - * of any operators adjacent to "block". - * @return {string} Generated code or '' if no blocks are connected or the - * specified input does not exist. - */ -Blockly.Generator.prototype.valueToCode = function(block, name, outerOrder) { - if (isNaN(outerOrder)) { - goog.asserts.fail('Expecting valid order from block "%s".', block.type); - } - var targetBlock = block.getInputTargetBlock(name); - if (!targetBlock) { - return ''; - } - var tuple = this.blockToCode(targetBlock); - if (tuple === '') { - // Disabled block. - return ''; - } - // Value blocks must return code and order of operations info. - // Statement blocks must only return code. - goog.asserts.assertArray(tuple, 'Expecting tuple from value block "%s".', - targetBlock.type); - var code = tuple[0]; - var innerOrder = tuple[1]; - if (isNaN(innerOrder)) { - goog.asserts.fail('Expecting valid order from value block "%s".', - targetBlock.type); - } - if (!code) { - return ''; - } - - // Add parentheses if needed. - var parensNeeded = false; - var outerOrderClass = Math.floor(outerOrder); - var innerOrderClass = Math.floor(innerOrder); - if (outerOrderClass <= innerOrderClass) { - if (outerOrderClass == innerOrderClass && - (outerOrderClass == 0 || outerOrderClass == 99)) { - // Don't generate parens around NONE-NONE and ATOMIC-ATOMIC pairs. - // 0 is the atomic order, 99 is the none order. No parentheses needed. - // In all known languages multiple such code blocks are not order - // sensitive. In fact in Python ('a' 'b') 'c' would fail. - } else { - // The operators outside this code are stronger than the operators - // inside this code. To prevent the code from being pulled apart, - // wrap the code in parentheses. - parensNeeded = true; - // Check for special exceptions. - for (var i = 0; i < this.ORDER_OVERRIDES.length; i++) { - if (this.ORDER_OVERRIDES[i][0] == outerOrder && - this.ORDER_OVERRIDES[i][1] == innerOrder) { - parensNeeded = false; - break; - } - } - } - } - if (parensNeeded) { - // Technically, this should be handled on a language-by-language basis. - // However all known (sane) languages use parentheses for grouping. - code = '(' + code + ')'; - } - return code; -}; - -/** - * Generate code representing the statement. Indent the code. - * @param {!Blockly.Block} block The block containing the input. - * @param {string} name The name of the input. - * @return {string} Generated code or '' if no blocks are connected. - */ -Blockly.Generator.prototype.statementToCode = function(block, name) { - var targetBlock = block.getInputTargetBlock(name); - var code = this.blockToCode(targetBlock); - // Value blocks must return code and order of operations info. - // Statement blocks must only return code. - goog.asserts.assertString(code, 'Expecting code from statement block "%s".', - targetBlock && targetBlock.type); - if (code) { - code = this.prefixLines(/** @type {string} */ (code), this.INDENT); - } - return code; -}; - -/** - * Add an infinite loop trap to the contents of a loop. - * If loop is empty, add a statment prefix for the loop block. - * @param {string} branch Code for loop contents. - * @param {string} id ID of enclosing block. - * @return {string} Loop contents, with infinite loop trap added. - */ -Blockly.Generator.prototype.addLoopTrap = function(branch, id) { - id = id.replace(/\$/g, '$$$$'); // Issue 251. - if (this.INFINITE_LOOP_TRAP) { - branch = this.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\'') + branch; - } - if (this.STATEMENT_PREFIX) { - branch += this.prefixLines(this.STATEMENT_PREFIX.replace(/%1/g, - '\'' + id + '\''), this.INDENT); - } - return branch; -}; - -/** - * Comma-separated list of reserved words. - * @type {string} - * @private - */ -Blockly.Generator.prototype.RESERVED_WORDS_ = ''; - -/** - * Add one or more words to the list of reserved words for this language. - * @param {string} words Comma-separated list of words to add to the list. - * No spaces. Duplicates are ok. - */ -Blockly.Generator.prototype.addReservedWords = function(words) { - this.RESERVED_WORDS_ += words + ','; -}; - -/** - * This is used as a placeholder in functions defined using - * Blockly.Generator.provideFunction_. It must not be legal code that could - * legitimately appear in a function definition (or comment), and it must - * not confuse the regular expression parser. - * @type {string} - * @private - */ -Blockly.Generator.prototype.FUNCTION_NAME_PLACEHOLDER_ = '{leCUI8hutHZI4480Dc}'; - -/** - * Define a function to be included in the generated code. - * The first time this is called with a given desiredName, the code is - * saved and an actual name is generated. Subsequent calls with the - * same desiredName have no effect but have the same return value. - * - * It is up to the caller to make sure the same desiredName is not - * used for different code values. - * - * The code gets output when Blockly.Generator.finish() is called. - * - * @param {string} desiredName The desired name of the function (e.g., isPrime). - * @param {!Array.} code A list of statements. Use ' ' for indents. - * @return {string} The actual name of the new function. This may differ - * from desiredName if the former has already been taken by the user. - * @private - */ -Blockly.Generator.prototype.provideFunction_ = function(desiredName, code) { - if (!this.definitions_[desiredName]) { - var functionName = this.variableDB_.getDistinctName(desiredName, - Blockly.Procedures.NAME_TYPE); - this.functionNames_[desiredName] = functionName; - var codeText = code.join('\n').replace( - this.FUNCTION_NAME_PLACEHOLDER_REGEXP_, functionName); - // Change all ' ' indents into the desired indent. - // To avoid an infinite loop of replacements, change all indents to '\0' - // character first, then replace them all with the indent. - // We are assuming that no provided functions contain a literal null char. - var oldCodeText; - while (oldCodeText != codeText) { - oldCodeText = codeText; - codeText = codeText.replace(/^(( {2})*) {2}/gm, '$1\0'); - } - codeText = codeText.replace(/\0/g, this.INDENT); - this.definitions_[desiredName] = codeText; - } - return this.functionNames_[desiredName]; -}; - -/** - * Hook for code to run before code generation starts. - * Subclasses may override this, e.g. to initialise the database of variable - * names. - * @param {!Blockly.Workspace} _workspace Workspace to generate code from. - */ -Blockly.Generator.prototype.init = function(_workspace) { - // Optionally override -}; - -/** - * Common tasks for generating code from blocks. This is called from - * blockToCode and is called on every block, not just top level blocks. - * Subclasses may override this, e.g. to generate code for statements following - * the block, or to handle comments for the specified block and any connected - * value blocks. - * @param {!Blockly.Block} _block The current block. - * @param {string} code The JavaScript code created for this block. - * @return {string} JavaScript code with comments and subsequent blocks added. - * @private - */ -Blockly.Generator.prototype.scrub_ = function(_block, code) { - // Optionally override - return code; -}; - -/** - * Hook for code to run at end of code generation. - * Subclasses may override this, e.g. to prepend the generated code with the - * variable definitions. - * @param {string} code Generated code. - * @return {string} Completed code. - */ -Blockly.Generator.prototype.finish = function(code) { - // Optionally override - return code; -}; - -/** - * Naked values are top-level blocks with outputs that aren't plugged into - * anything. - * Subclasses may override this, e.g. if their language does not allow - * naked values. - * @param {string} line Line of generated code. - * @return {string} Legal line of code. - */ -Blockly.Generator.prototype.scrubNakedValue = function(line) { - // Optionally override - return line; -}; diff --git a/packages/scratch-blocks/core/gesture.js b/packages/scratch-blocks/core/gesture.js deleted file mode 100644 index 1e9ec9a49..000000000 --- a/packages/scratch-blocks/core/gesture.js +++ /dev/null @@ -1,1011 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview The class representing an in-progress gesture, usually a drag - * or a tap. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Gesture'); - -goog.require('Blockly.BlockAnimations'); -goog.require('Blockly.BlockDragger'); -goog.require('Blockly.BubbleDragger'); -goog.require('Blockly.constants'); -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.FlyoutDragger'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.Tooltip'); -goog.require('Blockly.Touch'); -goog.require('Blockly.WorkspaceDragger'); - -goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); - - -/* - * Note: In this file "start" refers to touchstart, mousedown, and pointerstart - * events. "End" refers to touchend, mouseup, and pointerend events. - */ -// TODO: Consider touchcancel/pointercancel. - - -/** - * Class for one gesture. - * @param {!Event} e The event that kicked off this gesture. - * @param {!Blockly.WorkspaceSvg} creatorWorkspace The workspace that created - * this gesture and has a reference to it. - * @constructor - */ -Blockly.Gesture = function(e, creatorWorkspace) { - - /** - * The position of the mouse when the gesture started. Units are css pixels, - * with (0, 0) at the top left of the browser window (mouseEvent clientX/Y). - * @type {goog.math.Coordinate} - */ - this.mouseDownXY_ = null; - - /** - * How far the mouse has moved during this drag, in pixel units. - * (0, 0) is at this.mouseDownXY_. - * @type {goog.math.Coordinate} - * @private - */ - this.currentDragDeltaXY_ = null; - - /** - * The bubble that the gesture started on, or null if it did not start on a - * bubble. - * @type {Blockly.Bubble} - * @private - */ - this.startBubble_ = null; - - /** - * The field that the gesture started on, or null if it did not start on a - * field. - * @type {Blockly.Field} - * @private - */ - this.startField_ = null; - - /** - * The block that the gesture started on, or null if it did not start on a - * block. - * @type {Blockly.BlockSvg} - * @private - */ - this.startBlock_ = null; - - /** - * The block that this gesture targets. If the gesture started on a - * shadow block, this is the first non-shadow parent of the block. If the - * gesture started in the flyout, this is the root block of the block group - * that was clicked or dragged. - * @type {Blockly.BlockSvg} - * @private - */ - this.targetBlock_ = null; - - /** - * The workspace that the gesture started on. There may be multiple - * workspaces on a page; this is more accurate than using - * Blockly.getMainWorkspace(). - * @type {Blockly.WorkspaceSvg} - * @private - */ - this.startWorkspace_ = null; - - /** - * The workspace that created this gesture. This workspace keeps a reference - * to the gesture, which will need to be cleared at deletion. - * This may be different from the start workspace. For instance, a flyout is - * a workspace, but its parent workspace manages gestures for it. - * @type {Blockly.WorkspaceSvg} - * @private - */ - this.creatorWorkspace_ = creatorWorkspace; - - /** - * Whether the pointer has at any point moved out of the drag radius. - * A gesture that exceeds the drag radius is a drag even if it ends exactly at - * its start point. - * @type {boolean} - * @private - */ - this.hasExceededDragRadius_ = false; - - /** - * Whether the workspace is currently being dragged. - * @type {boolean} - * @private - */ - this.isDraggingWorkspace_ = false; - - /** - * Whether the block is currently being dragged. - * @type {boolean} - * @private - */ - this.isDraggingBlock_ = false; - - /** - * Whether the bubble is currently being dragged. - * @type {boolean} - * @private - */ - this.isDraggingBubble_ = false; - - /** - * The event that most recently updated this gesture. - * @type {!Event} - * @private - */ - this.mostRecentEvent_ = e; - - /** - * A handle to use to unbind a mouse move listener at the end of a drag. - * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {Array.} - * @private - */ - this.onMoveWrapper_ = null; - - /** - * A handle to use to unbind a mouse up listener at the end of a drag. - * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {Array.} - * @private - */ - this.onUpWrapper_ = null; - - /** - * The object tracking a bubble drag, or null if none is in progress. - * @type {Blockly.BubbleDragger} - * @private - */ - this.bubbleDragger_ = null; - - /** - * The object tracking a block drag, or null if none is in progress. - * @type {Blockly.BlockDragger} - * @private - */ - this.blockDragger_ = null; - - /** - * The object tracking a workspace or flyout workspace drag, or null if none - * is in progress. - * @type {Blockly.WorkspaceDragger} - * @private - */ - this.workspaceDragger_ = null; - - /** - * The flyout a gesture started in, if any. - * @type {Blockly.Flyout} - * @private - */ - this.flyout_ = null; - - /** - * Boolean for sanity-checking that some code is only called once. - * @type {boolean} - * @private - */ - this.calledUpdateIsDragging_ = false; - - /** - * Boolean for sanity-checking that some code is only called once. - * @type {boolean} - * @private - */ - this.hasStarted_ = false; - - /** - * Boolean used internally to break a cycle in disposal. - * @type {boolean} - * @private - */ - this.isEnding_ = false; - - /** - * True if dragging from the target block should duplicate the target block - * and drag the duplicate instead. This has a lot of side effects. - * @type {boolean} - * @private - */ - this.shouldDuplicateOnDrag_ = false; -}; - -/** - * Sever all links from this object. - * @package - */ -Blockly.Gesture.prototype.dispose = function() { - Blockly.Touch.clearTouchIdentifier(); - Blockly.Tooltip.unblock(); - // Clear the owner's reference to this gesture. - this.creatorWorkspace_.clearGesture(); - - if (this.onMoveWrapper_) { - Blockly.unbindEvent_(this.onMoveWrapper_); - } - if (this.onUpWrapper_) { - Blockly.unbindEvent_(this.onUpWrapper_); - } - - - this.startField_ = null; - this.startBlock_ = null; - this.targetBlock_ = null; - this.startWorkspace_ = null; - this.flyout_ = null; - - if (this.blockDragger_) { - this.blockDragger_.dispose(); - this.blockDragger_ = null; - } - if (this.workspaceDragger_) { - this.workspaceDragger_.dispose(); - this.workspaceDragger_ = null; - } - if (this.bubbleDragger_) { - this.bubbleDragger_.dispose(); - this.bubbleDragger_ = null; - } -}; - -/** - * Update internal state based on an event. - * @param {!Event} e The most recent mouse or touch event. - * @private - */ -Blockly.Gesture.prototype.updateFromEvent_ = function(e) { - var currentXY = new goog.math.Coordinate(e.clientX, e.clientY); - var changed = this.updateDragDelta_(currentXY); - // Exceeded the drag radius for the first time. - if (changed) { - this.updateIsDragging_(); - Blockly.longStop_(); - } - this.mostRecentEvent_ = e; -}; - -/** - * DO MATH to set currentDragDeltaXY_ based on the most recent mouse position. - * @param {!goog.math.Coordinate} currentXY The most recent mouse/pointer - * position, in pixel units, with (0, 0) at the window's top left corner. - * @return {boolean} True if the drag just exceeded the drag radius for the - * first time. - * @private - */ -Blockly.Gesture.prototype.updateDragDelta_ = function(currentXY) { - this.currentDragDeltaXY_ = goog.math.Coordinate.difference(currentXY, - this.mouseDownXY_); - - if (!this.hasExceededDragRadius_) { - var currentDragDelta = goog.math.Coordinate.magnitude( - this.currentDragDeltaXY_); - - // The flyout has a different drag radius from the rest of Blockly. - var limitRadius = this.flyout_ ? Blockly.FLYOUT_DRAG_RADIUS : - Blockly.DRAG_RADIUS; - - this.hasExceededDragRadius_ = currentDragDelta > limitRadius; - return this.hasExceededDragRadius_; - } - return false; -}; - -/** - * Update this gesture to record whether a block is being dragged from the - * flyout. - * This function should be called on a mouse/touch move event the first time the - * drag radius is exceeded. It should be called no more than once per gesture. - * If a block should be dragged from the flyout this function creates the new - * block on the main workspace and updates targetBlock_ and startWorkspace_. - * @return {boolean} True if a block is being dragged from the flyout. - * @private - */ -Blockly.Gesture.prototype.updateIsDraggingFromFlyout_ = function() { - // Disabled blocks may not be dragged from the flyout. - if (this.targetBlock_.disabled) { - return false; - } - if (!this.flyout_.isScrollable() || - this.flyout_.isDragTowardWorkspace(this.currentDragDeltaXY_)) { - this.startWorkspace_ = this.flyout_.targetWorkspace_; - this.startWorkspace_.updateScreenCalculationsIfScrolled(); - // Start the event group now, so that the same event group is used for block - // creation and block dragging. - if (!Blockly.Events.getGroup()) { - Blockly.Events.setGroup(true); - } - // The start block is no longer relevant, because this is a drag. - this.startBlock_ = null; - this.targetBlock_ = this.flyout_.createBlock(this.targetBlock_); - this.targetBlock_.select(); - return true; - } - return false; -}; - -/** - * Update this gesture to record whether a bubble is being dragged. - * This function should be called on a mouse/touch move event the first time the - * drag radius is exceeded. It should be called no more than once per gesture. - * If a bubble should be dragged this function creates the necessary - * BubbleDragger and starts the drag. - * @return {boolean} true if a bubble is being dragged. - * @private - */ -Blockly.Gesture.prototype.updateIsDraggingBubble_ = function() { - if (!this.startBubble_) { - return false; - } - - this.isDraggingBubble_ = true; - this.startDraggingBubble_(); - return true; -}; - -/** - * Update this gesture to record whether a block is being dragged. - * This function should be called on a mouse/touch move event the first time the - * drag radius is exceeded. It should be called no more than once per gesture. - * If a block should be dragged, either from the flyout or in the workspace, - * this function creates the necessary BlockDragger and starts the drag. - * @return {boolean} true if a block is being dragged. - * @private - */ -Blockly.Gesture.prototype.updateIsDraggingBlock_ = function() { - if (!this.targetBlock_) { - return false; - } - - if (this.flyout_) { - this.isDraggingBlock_ = this.updateIsDraggingFromFlyout_(); - } else if (this.targetBlock_.isMovable() || this.shouldDuplicateOnDrag_){ - this.isDraggingBlock_ = true; - } - - if (this.isDraggingBlock_) { - this.startDraggingBlock_(); - return true; - } - return false; -}; - -/** - * Update this gesture to record whether a workspace is being dragged. - * This function should be called on a mouse/touch move event the first time the - * drag radius is exceeded. It should be called no more than once per gesture. - * If a workspace is being dragged this function creates the necessary - * WorkspaceDragger or FlyoutDragger and starts the drag. - * @private - */ -Blockly.Gesture.prototype.updateIsDraggingWorkspace_ = function() { - var wsMovable = this.flyout_ ? this.flyout_.isScrollable() : - this.startWorkspace_ && this.startWorkspace_.isDraggable(); - - if (!wsMovable) { - return; - } - - if (this.flyout_) { - this.workspaceDragger_ = new Blockly.FlyoutDragger(this.flyout_); - } else { - this.workspaceDragger_ = new Blockly.WorkspaceDragger(this.startWorkspace_); - } - - this.isDraggingWorkspace_ = true; - this.workspaceDragger_.startDrag(); -}; - -/** - * Update this gesture to record whether anything is being dragged. - * This function should be called on a mouse/touch move event the first time the - * drag radius is exceeded. It should be called no more than once per gesture. - * @private - */ -Blockly.Gesture.prototype.updateIsDragging_ = function() { - // Sanity check. - goog.asserts.assert(!this.calledUpdateIsDragging_, - 'updateIsDragging_ should only be called once per gesture.'); - this.calledUpdateIsDragging_ = true; - - // First check if it was a bubble drag. Bubbles always sit on top of blocks. - if (this.updateIsDraggingBubble_()) { - return; - } - // Then check if it was a block drag. - if (this.updateIsDraggingBlock_()) { - return; - } - // Then check if it's a workspace drag. - this.updateIsDraggingWorkspace_(); -}; - -/** - * Create a block dragger and start dragging the selected block. - * @private - */ -Blockly.Gesture.prototype.startDraggingBlock_ = function() { - if (this.shouldDuplicateOnDrag_) { - this.duplicateOnDrag_(); - } - this.blockDragger_ = new Blockly.BlockDragger(this.targetBlock_, - this.startWorkspace_); - this.blockDragger_.startBlockDrag(this.currentDragDeltaXY_); - this.blockDragger_.dragBlock(this.mostRecentEvent_, - this.currentDragDeltaXY_); -}; - -/** - * Create a bubble dragger and start dragging the selected bubble. - * TODO (fenichel): Possibly combine this and startDraggingBlock_. - * @private - */ -Blockly.Gesture.prototype.startDraggingBubble_ = function() { - this.bubbleDragger_ = new Blockly.BubbleDragger(this.startBubble_, - this.startWorkspace_); - this.bubbleDragger_.startBubbleDrag(); - this.bubbleDragger_.dragBubble(this.mostRecentEvent_, - this.currentDragDeltaXY_); -}; -/** - * Start a gesture: update the workspace to indicate that a gesture is in - * progress and bind mousemove and mouseup handlers. - * @param {!Event} e A mouse down or touch start event. - * @package - */ -Blockly.Gesture.prototype.doStart = function(e) { - if (Blockly.utils.isTargetInput(e)) { - this.cancel(); - return; - } - this.hasStarted_ = true; - - Blockly.BlockAnimations.disconnectUiStop(); - this.startWorkspace_.updateScreenCalculationsIfScrolled(); - if (this.startWorkspace_.isMutator) { - // Mutator's coordinate system could be out of date because the bubble was - // dragged, the block was moved, the parent workspace zoomed, etc. - this.startWorkspace_.resize(); - } - this.startWorkspace_.markFocused(); - this.mostRecentEvent_ = e; - - // Hide chaff also hides the flyout, so don't do it if the click is in a flyout. - Blockly.hideChaff(!!this.flyout_); - Blockly.Tooltip.block(); - - if (this.targetBlock_) { - this.targetBlock_.select(); - } - - if (Blockly.utils.isRightButton(e)) { - this.handleRightClick(e); - return; - } - - if (goog.string.caseInsensitiveEquals(e.type, 'touchstart')) { - Blockly.longStart_(e, this); - } - - this.mouseDownXY_ = new goog.math.Coordinate(e.clientX, e.clientY); - this.currentDragDeltaXY_ = new goog.math.Coordinate(0, 0); - - this.bindMouseEvents(e); -}; - -/** - * Bind gesture events. - * @param {!Event} e A mouse down or touch start event. - * @package - */ -Blockly.Gesture.prototype.bindMouseEvents = function(e) { - this.onMoveWrapper_ = Blockly.bindEventWithChecks_( - document, 'mousemove', null, this.handleMove.bind(this)); - this.onUpWrapper_ = Blockly.bindEventWithChecks_( - document, 'mouseup', null, this.handleUp.bind(this)); - - e.preventDefault(); - e.stopPropagation(); -}; - -/** - * Handle a mouse move or touch move event. - * @param {!Event} e A mouse move or touch move event. - * @package - */ -Blockly.Gesture.prototype.handleMove = function(e) { - var stopPropagation = true; - this.updateFromEvent_(e); - if (this.isDraggingWorkspace_) { - this.workspaceDragger_.drag(this.currentDragDeltaXY_); - } else if (this.isDraggingBlock_) { - if (this.blockDragger_.dragBlock( - this.mostRecentEvent_, this.currentDragDeltaXY_)) { - stopPropagation = false; - } - } else if (this.isDraggingBubble_) { - this.bubbleDragger_.dragBubble(this.mostRecentEvent_, - this.currentDragDeltaXY_); - } - - if (stopPropagation) { - e.preventDefault(); - e.stopPropagation(); - } -}; - -/** - * Handle a mouse up or touch end event. - * @param {!Event} e A mouse up or touch end event. - * @package - */ -Blockly.Gesture.prototype.handleUp = function(e) { - this.updateFromEvent_(e); - Blockly.longStop_(); - - if (this.isEnding_) { - return; - } - this.isEnding_ = true; - // The ordering of these checks is important: drags have higher priority than - // clicks. Fields have higher priority than blocks; blocks have higher - // priority than workspaces. - // The ordering within drags does not matter, because the three types of - // dragging are exclusive. - if (this.isDraggingBubble_) { - this.bubbleDragger_.endBubbleDrag(e, this.currentDragDeltaXY_); - } else if (this.isDraggingBlock_) { - this.blockDragger_.endBlockDrag(e, this.currentDragDeltaXY_); - } else if (this.isDraggingWorkspace_) { - this.workspaceDragger_.endDrag(this.currentDragDeltaXY_); - } else if (this.isBubbleClick_()) { - // Bubbles are in front of all fields and blocks. - this.doBubbleClick_(); - } else if (this.isFieldClick_()) { - this.doFieldClick_(); - } else if (this.isBlockClick_()) { - this.doBlockClick_(); - } else if (this.isWorkspaceClick_()) { - this.doWorkspaceClick_(); - } - - e.preventDefault(); - e.stopPropagation(); - - this.dispose(); -}; - -/** - * Cancel an in-progress gesture. If a workspace or block drag is in progress, - * end the drag at the most recent location. - * @package - */ -Blockly.Gesture.prototype.cancel = function() { - // Disposing of a block cancels in-progress drags, but dragging to a delete - // area disposes of a block and leads to recursive disposal. Break that cycle. - if (this.isEnding_) { - console.log('Trying to cancel a gesture recursively.'); - return; - } - this.isEnding_ = true; - Blockly.longStop_(); - if (this.isDraggingBubble_) { - this.bubbleDragger_.endBubbleDrag(this.mostRecentEvent_, - this.currentDragDeltaXY_); - } else if (this.isDraggingBlock_) { - this.blockDragger_.endBlockDrag(this.mostRecentEvent_, - this.currentDragDeltaXY_); - } else if (this.isDraggingWorkspace_) { - this.workspaceDragger_.endDrag(this.currentDragDeltaXY_); - } - this.dispose(); -}; - -/** - * Handle a real or faked right-click event by showing a context menu. - * @param {!Event} e A mouse move or touch move event. - * @package - */ -Blockly.Gesture.prototype.handleRightClick = function(e) { - if (this.targetBlock_) { - this.bringBlockToFront_(); - Blockly.hideChaff(this.flyout_); - this.targetBlock_.showContextMenu_(e); - } else if (this.startBubble_) { - this.startBubble_.showContextMenu_(e); - } else if (this.startWorkspace_ && !this.flyout_) { - Blockly.hideChaff(); - this.startWorkspace_.showContextMenu_(e); - } - - // TODO: Handle right-click on a bubble. - e.preventDefault(); - e.stopPropagation(); - - this.dispose(); -}; - -/** - * Handle a mousedown/touchstart event on a workspace. - * @param {!Event} e A mouse down or touch start event. - * @param {!Blockly.Workspace} ws The workspace the event hit. - * @package - */ -Blockly.Gesture.prototype.handleWsStart = function(e, ws) { - goog.asserts.assert(!this.hasStarted_, - 'Tried to call gesture.handleWsStart, but the gesture had already been ' + - 'started.'); - this.setStartWorkspace_(ws); - this.mostRecentEvent_ = e; - this.doStart(e); -}; - -/** - * Handle a mousedown/touchstart event on a flyout. - * @param {!Event} e A mouse down or touch start event. - * @param {!Blockly.Flyout} flyout The flyout the event hit. - * @package - */ -Blockly.Gesture.prototype.handleFlyoutStart = function(e, flyout) { - goog.asserts.assert(!this.hasStarted_, - 'Tried to call gesture.handleFlyoutStart, but the gesture had already ' + - 'been started.'); - this.setStartFlyout_(flyout); - this.handleWsStart(e, flyout.getWorkspace()); -}; - -/** - * Handle a mousedown/touchstart event on a block. - * @param {!Event} e A mouse down or touch start event. - * @param {!Blockly.BlockSvg} block The block the event hit. - * @package - */ -Blockly.Gesture.prototype.handleBlockStart = function(e, block) { - goog.asserts.assert(!this.hasStarted_, - 'Tried to call gesture.handleBlockStart, but the gesture had already ' + - 'been started.'); - this.setStartBlock(block); - this.mostRecentEvent_ = e; -}; - -/** - * Handle a mousedown/touchstart event on a bubble. - * @param {!Event} e A mouse down or touch start event. - * @param {!Blockly.Bubble} bubble The bubble the event hit. - * @package - */ -Blockly.Gesture.prototype.handleBubbleStart = function(e, bubble) { - goog.asserts.assert(!this.hasStarted_, - 'Tried to call gesture.handleBubbleStart, but the gesture had already ' + - 'been started.'); - this.setStartBubble(bubble); - this.mostRecentEvent_ = e; -}; - -/* Begin functions defining what actions to take to execute clicks on each type - * of target. Any developer wanting to add behaviour on clicks should modify - * only this code. */ - -/** - * Execute a bubble click. - * @private - */ -Blockly.Gesture.prototype.doBubbleClick_ = function() { - // TODO (github.com/google/blockly/issues/1673): Consistent handling of single - // clicks. - this.startBubble_.setFocus && this.startBubble_.setFocus(); - this.startBubble_.select && this.startBubble_.select(); -}; - -/** - * Execute a field click. - * @private - */ -Blockly.Gesture.prototype.doFieldClick_ = function() { - this.startField_.showEditor_(); - this.bringBlockToFront_(); -}; - -/** - * Execute a block click. - * @private - */ -Blockly.Gesture.prototype.doBlockClick_ = function() { - // Block click in an autoclosing flyout. - if (this.flyout_ && this.flyout_.autoClose) { - if (!this.targetBlock_.disabled) { - if (!Blockly.Events.getGroup()) { - Blockly.Events.setGroup(true); - } - var newBlock = this.flyout_.createBlock(this.targetBlock_); - newBlock.scheduleSnapAndBump(); - } - } else { - // A field is being edited if either the WidgetDiv or DropDownDiv is currently open. - // If a field is being edited, don't fire any click events. - var fieldEditing = Blockly.WidgetDiv.isVisible() || Blockly.DropDownDiv.isVisible(); - if (!fieldEditing) { - Blockly.Events.fire( - new Blockly.Events.Ui(this.startBlock_, 'click', undefined, undefined)); - // Scratch-specific: also fire a "stack click" event for this stack. - // This is used to toggle the stack when any block in the stack is clicked. - var rootBlock = this.startBlock_.getRootBlock(); - Blockly.Events.fire( - new Blockly.Events.Ui(rootBlock, 'stackclick', undefined, undefined)); - } - } - this.bringBlockToFront_(); - Blockly.Events.setGroup(false); -}; - -/** - * Execute a workspace click. - * @private - */ -Blockly.Gesture.prototype.doWorkspaceClick_ = function() { - if (Blockly.selected) { - Blockly.selected.unselect(); - } -}; - -/* End functions defining what actions to take to execute clicks on each type - * of target. */ - -// TODO (fenichel): Move bubbles to the front. -/** - * Move the dragged/clicked block to the front of the workspace so that it is - * not occluded by other blocks. - * @private - */ -Blockly.Gesture.prototype.bringBlockToFront_ = function() { - // Blocks in the flyout don't overlap, so skip the work. - if (this.targetBlock_ && !this.flyout_) { - this.targetBlock_.bringToFront(); - } -}; - -/* Begin functions for populating a gesture at mouse down. */ - -/** - * Record the field that a gesture started on. - * @param {Blockly.Field} field The field the gesture started on. - * @package - */ -Blockly.Gesture.prototype.setStartField = function(field) { - goog.asserts.assert(!this.hasStarted_, - 'Tried to call gesture.setStartField, but the gesture had already been ' + - 'started.'); - if (!this.startField_) { - this.startField_ = field; - } -}; - -/** - * Record the bubble that a gesture started on - * @param {Blockly.Bubble} bubble The bubble the gesture started on. - * @package - */ -Blockly.Gesture.prototype.setStartBubble = function(bubble) { - if (!this.startBubble_) { - this.startBubble_ = bubble; - } -}; - -/** - * Record the block that a gesture started on, and set the target block - * appropriately. - * @param {Blockly.BlockSvg} block The block the gesture started on. - * @package - */ -Blockly.Gesture.prototype.setStartBlock = function(block) { - // If the gesture already went through a bubble, don't set the start block. - if (!this.startBlock_ && !this.startBubble_) { - this.startBlock_ = block; - this.shouldDuplicateOnDrag_ = - Blockly.scratchBlocksUtils.isShadowArgumentReporter(block); - if (block.isInFlyout && block != block.getRootBlock()) { - this.setTargetBlock_(block.getRootBlock()); - } else { - this.setTargetBlock_(block); - } - } -}; - -/** - * Record the block that a gesture targets, meaning the block that will be - * dragged if this turns into a drag. If this block is a shadow, that will be - * its first non-shadow parent. - * @param {Blockly.BlockSvg} block The block the gesture targets. - * @private - */ -Blockly.Gesture.prototype.setTargetBlock_ = function(block) { - if (block.isShadow() && !this.shouldDuplicateOnDrag_) { - this.setTargetBlock_(block.getParent()); - } else { - this.targetBlock_ = block; - } -}; - -/** - * Record the workspace that a gesture started on. - * @param {Blockly.WorkspaceSvg} ws The workspace the gesture started on. - * @private - */ -Blockly.Gesture.prototype.setStartWorkspace_ = function(ws) { - if (!this.startWorkspace_) { - this.startWorkspace_ = ws; - } -}; - -/** - * Record the flyout that a gesture started on. - * @param {Blockly.Flyout} flyout The flyout the gesture started on. - * @private - */ -Blockly.Gesture.prototype.setStartFlyout_ = function(flyout) { - if (!this.flyout_) { - this.flyout_ = flyout; - } -}; - -/* End functions for populating a gesture at mouse down. */ - -/* Begin helper functions defining types of clicks. Any developer wanting - * to change the definition of a click should modify only this code. */ - -/** - * Whether this gesture is a click on a bubble. This should only be called when - * ending a gesture (mouse up, touch end). - * @return {boolean} whether this gesture was a click on a bubble. - * @private - */ -Blockly.Gesture.prototype.isBubbleClick_ = function() { - // A bubble click starts on a bubble and never escapes the drag radius. - var hasStartBubble = !!this.startBubble_; - return hasStartBubble && !this.hasExceededDragRadius_; -}; - -/** - * Whether this gesture is a click on a block. This should only be called when - * ending a gesture (mouse up, touch end). - * @return {boolean} whether this gesture was a click on a block. - * @private - */ -Blockly.Gesture.prototype.isBlockClick_ = function() { - // A block click starts on a block, never escapes the drag radius, and is not - // a field click. - var hasStartBlock = !!this.startBlock_; - return hasStartBlock && !this.hasExceededDragRadius_ && !this.isFieldClick_(); -}; - -/** - * Whether this gesture is a click on a field. This should only be called when - * ending a gesture (mouse up, touch end). - * @return {boolean} whether this gesture was a click on a field. - * @private - */ -Blockly.Gesture.prototype.isFieldClick_ = function() { - var fieldEditable = this.startField_ ? - this.startField_.isCurrentlyEditable() : false; - return fieldEditable && !this.hasExceededDragRadius_; -}; - -/** - * Whether this gesture is a click on a workspace. This should only be called - * when ending a gesture (mouse up, touch end). - * @return {boolean} whether this gesture was a click on a workspace. - * @private - */ -Blockly.Gesture.prototype.isWorkspaceClick_ = function() { - var onlyTouchedWorkspace = !this.startBlock_ && !this.startBubble_ && - !this.startField_; - return onlyTouchedWorkspace && !this.hasExceededDragRadius_; -}; - -/* End helper functions defining types of clicks. */ - -/** - * Whether this gesture is a drag of either a workspace or block. - * This function is called externally to block actions that cannot be taken - * mid-drag (e.g. using the keyboard to delete the selected blocks). - * @return {boolean} true if this gesture is a drag of a workspace or block. - * @package - */ -Blockly.Gesture.prototype.isDragging = function() { - return this.isDraggingWorkspace_ || this.isDraggingBlock_ || - this.isDraggingBubble_; -}; - -/** - * Whether this gesture has already been started. In theory every mouse down - * has a corresponding mouse up, but in reality it is possible to lose a - * mouse up, leaving an in-process gesture hanging. - * @return {boolean} whether this gesture was a click on a workspace. - * @package - */ -Blockly.Gesture.prototype.hasStarted = function() { - return this.hasStarted_; -}; - -/* Scratch-specific */ - -/** - * Don't even think about using this function before talking to rachel-fenichel. - * - * Force a drag to start without clicking and dragging the block itself. Used - * to attach duplicated blocks to the mouse pointer. - * @param {!Object} fakeEvent An object with the properties needed to start a - * drag, including clientX and clientY. - * @param {!Blockly.BlockSvg} block The block to start dragging. - * @package - */ -Blockly.Gesture.prototype.forceStartBlockDrag = function(fakeEvent, block) { - this.handleBlockStart(fakeEvent, block); - this.handleWsStart(fakeEvent, block.workspace); - this.isDraggingBlock_ = true; - this.hasExceededDragRadius_ = true; - this.startDraggingBlock_(); -}; - -/** - * Duplicate the target block and start dragging the duplicated block. - * This should be done once we are sure that it is a block drag, and no earlier. - * Specifically for argument reporters in custom block defintions. - * @private - */ -Blockly.Gesture.prototype.duplicateOnDrag_ = function() { - var newBlock = null; - Blockly.Events.disable(); - try { - // Note: targetBlock_ should have no children. If it has children we would - // need to update shadow block IDs to avoid problems in the VM. - // Resizes will be reenabled at the end of the drag. - this.startWorkspace_.setResizesEnabled(false); - var xmlBlock = Blockly.Xml.blockToDom(this.targetBlock_); - newBlock = Blockly.Xml.domToBlock(xmlBlock, this.startWorkspace_); - - // Move the duplicate to original position. - var xy = this.targetBlock_.getRelativeToSurfaceXY(); - newBlock.moveBy(xy.x, xy.y); - newBlock.setShadow(false); - } finally { - Blockly.Events.enable(); - } - if (!newBlock) { - // Something went wrong. - console.error('Something went wrong while duplicating a block.'); - return; - } - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); - } - newBlock.select(); - this.targetBlock_ = newBlock; -}; diff --git a/packages/scratch-blocks/core/grid.js b/packages/scratch-blocks/core/grid.js deleted file mode 100644 index 781bf2299..000000000 --- a/packages/scratch-blocks/core/grid.js +++ /dev/null @@ -1,227 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object for configuring and updating a workspace grid in - * Blockly. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Grid'); - -goog.require('Blockly.utils'); - -goog.require('goog.userAgent'); - - -/** - * Class for a workspace's grid. - * @param {!SVGElement} pattern The grid's SVG pattern, created during injection. - * @param {!Object} options A dictionary of normalized options for the grid. - * See grid documentation: - * https://developers.google.com/blockly/guides/configure/web/grid - * @constructor - */ -Blockly.Grid = function(pattern, options) { - /** - * The grid's SVG pattern, created during injection. - * @type {!SVGElement} - * @private - */ - this.gridPattern_ = pattern; - - /** - * The spacing of the grid lines (in px). - * @type {number} - * @private - */ - this.spacing_ = options['spacing']; - - /** - * How long the grid lines should be (in px). - * @type {number} - * @private - */ - this.length_ = options['length']; - - /** - * The horizontal grid line, if it exists. - * @type {SVGElement} - * @private - */ - this.line1_ = pattern.firstChild; - - /** - * The vertical grid line, if it exists. - * @type {SVGElement} - * @private - */ - this.line2_ = this.line1_ && this.line1_.nextSibling; - - /** - * Whether blocks should snap to the grid. - * @type {boolean} - * @private - */ - this.snapToGrid_ = options['snap']; -}; - -/** - * The scale of the grid, used to set stroke width on grid lines. - * This should always be the same as the workspace scale. - * @type {number} - * @private - */ -Blockly.Grid.prototype.scale_ = 1; - -/** - * Dispose of this grid and unlink from the DOM. - * @package - */ -Blockly.Grid.prototype.dispose = function() { - this.gridPattern_ = null; -}; - -/** - * Whether blocks should snap to the grid, based on the initial configuration. - * @return {boolean} True if blocks should snap, false otherwise. - * @package - */ -Blockly.Grid.prototype.shouldSnap = function() { - return this.snapToGrid_; -}; - -/** - * Get the spacing of the grid points (in px). - * @return {number} The spacing of the grid points. - * @package - */ -Blockly.Grid.prototype.getSpacing = function() { - return this.spacing_; -}; - -/** - * Get the id of the pattern element, which should be randomized to avoid - * conflicts with other Blockly instances on the page. - * @return {string} The pattern ID. - * @package - */ -Blockly.Grid.prototype.getPatternId = function() { - return this.gridPattern_.id; -}; - -/** - * Update the grid with a new scale. - * @param {number} scale The new workspace scale. - * @package - */ -Blockly.Grid.prototype.update = function(scale) { - this.scale_ = scale; - // MSIE freaks if it sees a 0x0 pattern, so set empty patterns to 100x100. - var safeSpacing = (this.spacing_ * scale) || 100; - - this.gridPattern_.setAttribute('width', safeSpacing); - this.gridPattern_.setAttribute('height', safeSpacing); - - var half = Math.floor(this.spacing_ / 2) + 0.5; - var start = half - this.length_ / 2; - var end = half + this.length_ / 2; - - half *= scale; - start *= scale; - end *= scale; - - this.setLineAttributes_(this.line1_, scale, start, end, half, half); - this.setLineAttributes_(this.line2_, scale, half, half, start, end); -}; - -/** - * Set the attributes on one of the lines in the grid. Use this to update the - * length and stroke width of the grid lines. - * @param {!SVGElement} line Which line to update. - * @param {number} width The new stroke size (in px). - * @param {number} x1 The new x start position of the line (in px). - * @param {number} x2 The new x end position of the line (in px). - * @param {number} y1 The new y start position of the line (in px). - * @param {number} y2 The new y end position of the line (in px). - * @private - */ -Blockly.Grid.prototype.setLineAttributes_ = function(line, width, x1, x2, y1, y2) { - if (line) { - line.setAttribute('stroke-width', width); - line.setAttribute('x1', x1); - line.setAttribute('y1', y1); - line.setAttribute('x2', x2); - line.setAttribute('y2', y2); - } -}; - -/** - * Move the grid to a new x and y position, and make sure that change is visible. - * @param {number} x The new x position of the grid (in px). - * @param {number} y The new y position ofthe grid (in px). - * @package - */ -Blockly.Grid.prototype.moveTo = function(x, y) { - this.gridPattern_.setAttribute('x', x); - this.gridPattern_.setAttribute('y', y); - - if (goog.userAgent.IE || goog.userAgent.EDGE) { - // IE/Edge doesn't notice that the x/y offsets have changed. - // Force an update. - this.update(this.scale_); - } -}; - -/** - * Create the DOM for the grid described by options. - * @param {string} rnd A random ID to append to the pattern's ID. - * @param {!Object} gridOptions The object containing grid configuration. - * @param {!SVGElement} defs The root SVG element for this workspace's defs. - * @return {!SVGElement} The SVG element for the grid pattern. - * @package - */ -Blockly.Grid.createDom = function(rnd, gridOptions, defs) { - /* - - - - - */ - var gridPattern = Blockly.utils.createSvgElement('pattern', - { - 'id': 'blocklyGridPattern' + rnd, - 'patternUnits': 'userSpaceOnUse' - }, defs); - if (gridOptions['length'] > 0 && gridOptions['spacing'] > 0) { - Blockly.utils.createSvgElement('line', - {'stroke': gridOptions['colour']}, gridPattern); - if (gridOptions['length'] > 1) { - Blockly.utils.createSvgElement('line', - {'stroke': gridOptions['colour']}, gridPattern); - } - // x1, y1, x1, x2 properties will be set later in update. - } else { - // Edge 16 doesn't handle empty patterns - Blockly.utils.createSvgElement('line', {}, gridPattern); - } - return gridPattern; -}; diff --git a/packages/scratch-blocks/core/icon.js b/packages/scratch-blocks/core/icon.js deleted file mode 100644 index b51d90efd..000000000 --- a/packages/scratch-blocks/core/icon.js +++ /dev/null @@ -1,205 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing an icon on a block. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Icon'); - -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); - - -/** - * Class for an icon. - * @param {Blockly.Block} block The block associated with this icon. - * @constructor - */ -Blockly.Icon = function(block) { - this.block_ = block; -}; - -/** - * Does this icon get hidden when the block is collapsed. - */ -Blockly.Icon.prototype.collapseHidden = true; - -/** - * Height and width of icons. - */ -Blockly.Icon.prototype.SIZE = 17; - -/** - * Bubble UI (if visible). - * @type {Blockly.Bubble} - * @protected - */ -Blockly.Icon.prototype.bubble_ = null; - -/** - * Absolute coordinate of icon's center. - * @type {goog.math.Coordinate} - * @protected - */ -Blockly.Icon.prototype.iconXY_ = null; - -/** - * Create the icon on the block. - */ -Blockly.Icon.prototype.createIcon = function() { - if (this.iconGroup_) { - // Icon already exists. - return; - } - /* Here's the markup that will be generated: - - ... - - */ - this.iconGroup_ = Blockly.utils.createSvgElement('g', - {'class': 'blocklyIconGroup'}, null); - if (this.block_.isInFlyout) { - Blockly.utils.addClass( - /** @type {!Element} */ (this.iconGroup_), 'blocklyIconGroupReadonly'); - } - this.drawIcon_(this.iconGroup_); - - this.block_.getSvgRoot().appendChild(this.iconGroup_); - Blockly.bindEventWithChecks_( - this.iconGroup_, 'mouseup', this, this.iconClick_); - this.updateEditable(); -}; - -/** - * Dispose of this icon. - */ -Blockly.Icon.prototype.dispose = function() { - // Dispose of and unlink the icon. - goog.dom.removeNode(this.iconGroup_); - this.iconGroup_ = null; - // Dispose of and unlink the bubble. - this.setVisible(false); - this.block_ = null; -}; - -/** - * Add or remove the UI indicating if this icon may be clicked or not. - */ -Blockly.Icon.prototype.updateEditable = function() { -}; - -/** - * Is the associated bubble visible? - * @return {boolean} True if the bubble is visible. - */ -Blockly.Icon.prototype.isVisible = function() { - return !!this.bubble_; -}; - -/** - * Clicking on the icon toggles if the bubble is visible. - * @param {!Event} e Mouse click event. - * @protected - */ -Blockly.Icon.prototype.iconClick_ = function(e) { - if (this.block_.workspace.isDragging()) { - // Drag operation is concluding. Don't open the editor. - return; - } - if (!this.block_.isInFlyout && !Blockly.utils.isRightButton(e)) { - this.setVisible(!this.isVisible()); - } -}; - -/** - * Change the colour of the associated bubble to match its block. - */ -Blockly.Icon.prototype.updateColour = function() { - if (this.isVisible()) { - this.bubble_.setColour(this.block_.getColour()); - } -}; - -/** - * Render the icon. - * @param {number} cursorX Horizontal offset at which to position the icon. - * @return {number} Horizontal offset for next item to draw. - */ -Blockly.Icon.prototype.renderIcon = function(cursorX) { - if (this.collapseHidden && this.block_.isCollapsed()) { - this.iconGroup_.setAttribute('display', 'none'); - return cursorX; - } - this.iconGroup_.setAttribute('display', 'block'); - - var TOP_MARGIN = 5; - var width = this.SIZE; - if (this.block_.RTL) { - cursorX -= width; - } - this.iconGroup_.setAttribute('transform', - 'translate(' + cursorX + ',' + TOP_MARGIN + ')'); - this.computeIconLocation(); - if (this.block_.RTL) { - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - } else { - cursorX += width + Blockly.BlockSvg.SEP_SPACE_X; - } - return cursorX; -}; - -/** - * Notification that the icon has moved. Update the arrow accordingly. - * @param {!goog.math.Coordinate} xy Absolute location in workspace coordinates. - */ -Blockly.Icon.prototype.setIconLocation = function(xy) { - this.iconXY_ = xy; - if (this.isVisible()) { - this.bubble_.setAnchorLocation(xy); - } -}; - -/** - * Notification that the icon has moved, but we don't really know where. - * Recompute the icon's location from scratch. - */ -Blockly.Icon.prototype.computeIconLocation = function() { - // Find coordinates for the centre of the icon and update the arrow. - var blockXY = this.block_.getRelativeToSurfaceXY(); - var iconXY = Blockly.utils.getRelativeXY(this.iconGroup_); - var newXY = new goog.math.Coordinate( - blockXY.x + iconXY.x + this.SIZE / 2, - blockXY.y + iconXY.y + this.SIZE / 2); - if (!goog.math.Coordinate.equals(this.getIconLocation(), newXY)) { - this.setIconLocation(newXY); - } -}; - -/** - * Returns the center of the block's icon relative to the surface. - * @return {!goog.math.Coordinate} Object with x and y properties in workspace - * coordinates. - */ -Blockly.Icon.prototype.getIconLocation = function() { - return this.iconXY_; -}; diff --git a/packages/scratch-blocks/core/inject.js b/packages/scratch-blocks/core/inject.js deleted file mode 100644 index 7b0dbddc7..000000000 --- a/packages/scratch-blocks/core/inject.js +++ /dev/null @@ -1,491 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Functions for injecting Blockly into a web page. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.inject'); - -goog.require('Blockly.BlockDragSurfaceSvg'); -goog.require('Blockly.Css'); -goog.require('Blockly.constants'); -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.Grid'); -goog.require('Blockly.Options'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('Blockly.WorkspaceDragSurfaceSvg'); -goog.require('goog.dom'); -goog.require('goog.ui.Component'); -goog.require('goog.userAgent'); - -/** - * Inject a Blockly editor into the specified container element (usually a div). - * @param {!Element|string} container Containing element, or its ID, - * or a CSS selector. - * @param {Object=} opt_options Optional dictionary of options. - * @return {!Blockly.Workspace} Newly created main workspace. - */ -Blockly.inject = function(container, opt_options) { - if (goog.isString(container)) { - container = document.getElementById(container) || - document.querySelector(container); - } - // Verify that the container is in document. - if (!goog.dom.contains(document, container)) { - throw 'Error: container is not in current document.'; - } - var options = new Blockly.Options(opt_options || {}); - var subContainer = goog.dom.createDom('div', 'injectionDiv'); - container.appendChild(subContainer); - - // Open the Field text cache and leave it open. See this issue for more information - // https://github.com/LLK/scratch-blocks/issues/1004 - Blockly.Field.startCache(); - - var svg = Blockly.createDom_(subContainer, options); - - // Create surfaces for dragging things. These are optimizations - // so that the broowser does not repaint during the drag. - var blockDragSurface = new Blockly.BlockDragSurfaceSvg(subContainer); - var workspaceDragSurface = new Blockly.WorkspaceDragSurfaceSvg(subContainer); - - var workspace = Blockly.createMainWorkspace_(svg, options, blockDragSurface, - workspaceDragSurface); - Blockly.init_(workspace); - Blockly.mainWorkspace = workspace; - - Blockly.svgResize(workspace); - return workspace; -}; - -/** - * Create the SVG image. - * @param {!Element} container Containing element. - * @param {!Blockly.Options} options Dictionary of options. - * @return {!Element} Newly created SVG image. - * @private - */ -Blockly.createDom_ = function(container, options) { - // Sadly browsers (Chrome vs Firefox) are currently inconsistent in laying - // out content in RTL mode. Therefore Blockly forces the use of LTR, - // then manually positions content in RTL as needed. - container.setAttribute('dir', 'LTR'); - // Closure can be trusted to create HTML widgets with the proper direction. - goog.ui.Component.setDefaultRightToLeft(options.RTL); - - // Load CSS. - Blockly.Css.inject(options.hasCss, options.pathToMedia); - - // Build the SVG DOM. - /* - - ... - - */ - var svg = Blockly.utils.createSvgElement('svg', { - 'xmlns': 'http://www.w3.org/2000/svg', - 'xmlns:html': 'http://www.w3.org/1999/xhtml', - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'class': 'blocklySvg' - }, container); - /* - - ... filters go here ... - - */ - var defs = Blockly.utils.createSvgElement('defs', {}, svg); - // Each filter/pattern needs a unique ID for the case of multiple Blockly - // instances on a page. Browser behaviour becomes undefined otherwise. - // https://neil.fraser.name/news/2015/11/01/ - // TODO (tmickel): Look into whether block highlighting still works. - // Reference commit: - // https://github.com/google/blockly/commit/144be4d49f36fdba260a26edbd170ae75bbc37a6 - var rnd = String(Math.random()).substring(2); - - // Using a dilate distorts the block shape. - // Instead use a gaussian blur, and then set all alpha to 1 with a transfer. - var stackGlowFilter = Blockly.utils.createSvgElement('filter', - { - 'id': 'blocklyStackGlowFilter' + rnd, - 'height': '160%', - 'width': '180%', - y: '-30%', - x: '-40%' - }, - defs); - options.stackGlowBlur = Blockly.utils.createSvgElement('feGaussianBlur', - { - 'in': 'SourceGraphic', - 'stdDeviation': Blockly.Colours.stackGlowSize - }, - stackGlowFilter); - // Set all gaussian blur pixels to 1 opacity before applying flood - var componentTransfer = Blockly.utils.createSvgElement('feComponentTransfer', {'result': 'outBlur'}, stackGlowFilter); - Blockly.utils.createSvgElement('feFuncA', - { - 'type': 'table', - 'tableValues': '0' + goog.string.repeat(' 1', 16) - }, - componentTransfer); - // Color the highlight - Blockly.utils.createSvgElement('feFlood', - { - 'flood-color': Blockly.Colours.stackGlow, - 'flood-opacity': Blockly.Colours.stackGlowOpacity, - 'result': 'outColor' - }, - stackGlowFilter); - Blockly.utils.createSvgElement('feComposite', - { - 'in': 'outColor', - 'in2': 'outBlur', - 'operator': 'in', - 'result': 'outGlow' - }, - stackGlowFilter); - Blockly.utils.createSvgElement('feComposite', - { - 'in': 'SourceGraphic', - 'in2': 'outGlow', - 'operator': 'over' - }, - stackGlowFilter); - - // Filter for replacement marker - var replacementGlowFilter = Blockly.utils.createSvgElement('filter', - { - 'id': 'blocklyReplacementGlowFilter' + rnd, - 'height': '160%', - 'width': '180%', - y: '-30%', - x: '-40%' - }, - defs); - Blockly.utils.createSvgElement('feGaussianBlur', - { - 'in': 'SourceGraphic', - 'stdDeviation': Blockly.Colours.replacementGlowSize - }, - replacementGlowFilter); - // Set all gaussian blur pixels to 1 opacity before applying flood - var componentTransfer = Blockly.utils.createSvgElement('feComponentTransfer', - {'result': 'outBlur'}, replacementGlowFilter); - Blockly.utils.createSvgElement('feFuncA', - { - 'type': 'table', - 'tableValues': '0' + goog.string.repeat(' 1', 16) - }, - componentTransfer); - // Color the highlight - Blockly.utils.createSvgElement('feFlood', - { - 'flood-color': Blockly.Colours.replacementGlow, - 'flood-opacity': Blockly.Colours.replacementGlowOpacity, - 'result': 'outColor' - }, - replacementGlowFilter); - Blockly.utils.createSvgElement('feComposite', - { - 'in': 'outColor', - 'in2': 'outBlur', - 'operator': 'in', - 'result': 'outGlow' - }, - replacementGlowFilter); - Blockly.utils.createSvgElement('feComposite', - { - 'in': 'SourceGraphic', - 'in2': 'outGlow', - 'operator': 'over' - }, - replacementGlowFilter); - /* - - - - - */ - var disabledPattern = Blockly.utils.createSvgElement('pattern', - { - 'id': 'blocklyDisabledPattern' + rnd, - 'patternUnits': 'userSpaceOnUse', - 'width': 10, - 'height': 10 - }, - defs); - Blockly.utils.createSvgElement('rect', - { - 'width': 10, - 'height': 10, - 'fill': '#aaa' - }, - disabledPattern); - Blockly.utils.createSvgElement('path', - { - 'd': 'M 0 0 L 10 10 M 10 0 L 0 10', - 'stroke': '#cc0' - }, - disabledPattern); - options.stackGlowFilterId = stackGlowFilter.id; - options.replacementGlowFilterId = replacementGlowFilter.id; - options.disabledPatternId = disabledPattern.id; - - options.gridPattern = Blockly.Grid.createDom(rnd, options.gridOptions, defs); - return svg; -}; - -/** - * Create a main workspace and add it to the SVG. - * @param {!Element} svg SVG element with pattern defined. - * @param {!Blockly.Options} options Dictionary of options. - * @param {!Blockly.BlockDragSurfaceSvg} blockDragSurface Drag surface SVG - * for the blocks. - * @param {!Blockly.WorkspaceDragSurfaceSvg} workspaceDragSurface Drag surface - * SVG for the workspace. - * @return {!Blockly.Workspace} Newly created main workspace. - * @private - */ -Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, workspaceDragSurface) { - options.parentWorkspace = null; - var mainWorkspace = new Blockly.WorkspaceSvg(options, blockDragSurface, workspaceDragSurface); - mainWorkspace.scale = options.zoomOptions.startScale; - svg.appendChild(mainWorkspace.createDom('blocklyMainBackground')); - - if (!options.hasCategories && options.languageTree) { - // Add flyout as an that is a sibling of the workspace svg. - var flyout = mainWorkspace.addFlyout_('svg'); - Blockly.utils.insertAfter(flyout, svg); - } - - // A null translation will also apply the correct initial scale. - mainWorkspace.translate(0, 0); - Blockly.mainWorkspace = mainWorkspace; - - if (!options.readOnly && !options.hasScrollbars) { - var workspaceChanged = function() { - if (!mainWorkspace.isDragging()) { - var metrics = mainWorkspace.getMetrics(); - var edgeLeft = metrics.viewLeft + metrics.absoluteLeft; - var edgeTop = metrics.viewTop + metrics.absoluteTop; - if (metrics.contentTop < edgeTop || - metrics.contentTop + metrics.contentHeight > - metrics.viewHeight + edgeTop || - metrics.contentLeft < - (options.RTL ? metrics.viewLeft : edgeLeft) || - metrics.contentLeft + metrics.contentWidth > (options.RTL ? - metrics.viewWidth : metrics.viewWidth + edgeLeft)) { - // One or more blocks may be out of bounds. Bump them back in. - var MARGIN = 25; - var blocks = mainWorkspace.getTopBlocks(false); - for (var b = 0, block; block = blocks[b]; b++) { - var blockXY = block.getRelativeToSurfaceXY(); - var blockHW = block.getHeightWidth(); - // Bump any block that's above the top back inside. - var overflowTop = edgeTop + MARGIN - blockHW.height - blockXY.y; - if (overflowTop > 0) { - block.moveBy(0, overflowTop); - } - // Bump any block that's below the bottom back inside. - var overflowBottom = - edgeTop + metrics.viewHeight - MARGIN - blockXY.y; - if (overflowBottom < 0) { - block.moveBy(0, overflowBottom); - } - // Bump any block that's off the left back inside. - var overflowLeft = MARGIN + edgeLeft - - blockXY.x - (options.RTL ? 0 : blockHW.width); - if (overflowLeft > 0) { - block.moveBy(overflowLeft, 0); - } - // Bump any block that's off the right back inside. - var overflowRight = edgeLeft + metrics.viewWidth - MARGIN - - blockXY.x + (options.RTL ? blockHW.width : 0); - if (overflowRight < 0) { - block.moveBy(overflowRight, 0); - } - } - } - } - }; - mainWorkspace.addChangeListener(workspaceChanged); - } - // The SVG is now fully assembled. - Blockly.svgResize(mainWorkspace); - Blockly.WidgetDiv.createDom(); - Blockly.DropDownDiv.createDom(); - Blockly.Tooltip.createDom(); - return mainWorkspace; -}; - -/** - * Initialize Blockly with various handlers. - * @param {!Blockly.Workspace} mainWorkspace Newly created main workspace. - * @private - */ -Blockly.init_ = function(mainWorkspace) { - var options = mainWorkspace.options; - var svg = mainWorkspace.getParentSvg(); - - // Suppress the browser's context menu. - Blockly.bindEventWithChecks_(svg.parentNode, 'contextmenu', null, - function(e) { - if (!Blockly.utils.isTargetInput(e)) { - e.preventDefault(); - } - }); - - var workspaceResizeHandler = Blockly.bindEventWithChecks_(window, 'resize', - null, - function() { - Blockly.hideChaffOnResize(true); - Blockly.svgResize(mainWorkspace); - }); - mainWorkspace.setResizeHandlerWrapper(workspaceResizeHandler); - - Blockly.inject.bindDocumentEvents_(); - - if (options.languageTree) { - if (mainWorkspace.toolbox_) { - mainWorkspace.toolbox_.init(mainWorkspace); - } else if (mainWorkspace.flyout_) { - // Build a fixed flyout with the root blocks. - mainWorkspace.flyout_.init(mainWorkspace); - mainWorkspace.flyout_.show(options.languageTree.childNodes); - mainWorkspace.flyout_.scrollToStart(); - // Translate the workspace to avoid the fixed flyout. - if (options.horizontalLayout) { - mainWorkspace.scrollY = mainWorkspace.flyout_.height_; - if (options.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - mainWorkspace.scrollY *= -1; - } - } else { - mainWorkspace.scrollX = mainWorkspace.flyout_.width_; - if (options.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - mainWorkspace.scrollX *= -1; - } - } - mainWorkspace.translate(mainWorkspace.scrollX, mainWorkspace.scrollY); - } - } - - if (options.hasScrollbars) { - mainWorkspace.scrollbar = new Blockly.ScrollbarPair(mainWorkspace); - mainWorkspace.scrollbar.resize(); - } - - // Load the sounds. - if (options.hasSounds) { - Blockly.inject.loadSounds_(options.pathToMedia, mainWorkspace); - } -}; - -/** - * Bind document events, but only once. Destroying and reinjecting Blockly - * should not bind again. - * Bind events for scrolling the workspace. - * Most of these events should be bound to the SVG's surface. - * However, 'mouseup' has to be on the whole document so that a block dragged - * out of bounds and released will know that it has been released. - * Also, 'keydown' has to be on the whole document since the browser doesn't - * understand a concept of focus on the SVG image. - * @private - */ -Blockly.inject.bindDocumentEvents_ = function() { - if (!Blockly.documentEventsBound_) { - Blockly.bindEventWithChecks_(document, 'keydown', null, Blockly.onKeyDown_); - // longStop needs to run to stop the context menu from showing up. It - // should run regardless of what other touch event handlers have run. - Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); - Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); - // Some iPad versions don't fire resize after portrait to landscape change. - if (goog.userAgent.IPAD) { - Blockly.bindEventWithChecks_(window, 'orientationchange', document, - function() { - // TODO(#397): Fix for multiple blockly workspaces. - Blockly.svgResize(Blockly.getMainWorkspace()); - }); - } - } - Blockly.documentEventsBound_ = true; -}; - -/** - * Load sounds for the given workspace. - * @param {string} pathToMedia The path to the media directory. - * @param {!Blockly.Workspace} workspace The workspace to load sounds for. - * @private - */ -Blockly.inject.loadSounds_ = function(pathToMedia, workspace) { - var audioMgr = workspace.getAudioManager(); - audioMgr.load( - [ - pathToMedia + 'click.mp3', - pathToMedia + 'click.wav', - pathToMedia + 'click.ogg' - ], - 'click'); - audioMgr.load( - [ - pathToMedia + 'delete.mp3', - pathToMedia + 'delete.ogg', - pathToMedia + 'delete.wav' - ], - 'delete'); - - // Bind temporary hooks that preload the sounds. - var soundBinds = []; - var unbindSounds = function() { - while (soundBinds.length) { - Blockly.unbindEvent_(soundBinds.pop()); - } - audioMgr.preload(); - }; - - // opt_noCaptureIdentifier is true because this is an action to take on a - // click, not a drag. - // Android ignores any sound not loaded as a result of a user action. - soundBinds.push( - Blockly.bindEventWithChecks_(document, 'mousemove', null, unbindSounds, - /* opt_noCaptureIdentifier */ true)); - soundBinds.push( - Blockly.bindEventWithChecks_(document, 'touchstart', null, unbindSounds, - /* opt_noCaptureIdentifier */ true)); -}; - -/** - * Modify the block tree on the existing toolbox. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - * @deprecated April 2015 - */ -Blockly.updateToolbox = function(tree) { - console.warn('Deprecated call to Blockly.updateToolbox, ' + - 'use workspace.updateToolbox instead.'); - Blockly.getMainWorkspace().updateToolbox(tree); -}; diff --git a/packages/scratch-blocks/core/input.js b/packages/scratch-blocks/core/input.js deleted file mode 100644 index 91bb4f12b..000000000 --- a/packages/scratch-blocks/core/input.js +++ /dev/null @@ -1,285 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing an input (value, statement, or dummy). - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Input'); - -goog.require('Blockly.Connection'); -goog.require('Blockly.FieldLabel'); -goog.require('goog.asserts'); - - -/** - * Class for an input with an optional field. - * @param {number} type The type of the input. - * @param {string} name Language-neutral identifier which may used to find this - * input again. - * @param {!Blockly.Block} block The block containing this input. - * @param {Blockly.Connection} connection Optional connection for this input. - * @constructor - */ -Blockly.Input = function(type, name, block, connection) { - if (type != Blockly.DUMMY_INPUT && !name) { - throw 'Value inputs and statement inputs must have non-empty name.'; - } - /** @type {number} */ - this.type = type; - /** @type {string} */ - this.name = name; - /** - * @type {!Blockly.Block} - * @private - */ - this.sourceBlock_ = block; - /** @type {Blockly.Connection} */ - this.connection = connection; - /** @type {!Array.} */ - this.fieldRow = []; - - /** - * The shape that is displayed when this input is rendered but not filled. - * @type {SVGElement} - * @package - */ - this.outlinePath = null; -}; - -/** - * Alignment of input's fields (left, right or centre). - * @type {number} - */ -Blockly.Input.prototype.align = Blockly.ALIGN_LEFT; - -/** - * Is the input visible? - * @type {boolean} - * @private - */ -Blockly.Input.prototype.visible_ = true; - -/** - * Add a field (or label from string), and all prefix and suffix fields, to the - * end of the input's field row. - * @param {string|!Blockly.Field} field Something to add as a field. - * @param {string=} opt_name Language-neutral identifier which may used to find - * this field again. Should be unique to the host block. - * @return {!Blockly.Input} The input being append to (to allow chaining). - */ -Blockly.Input.prototype.appendField = function(field, opt_name) { - this.insertFieldAt(this.fieldRow.length, field, opt_name); - return this; -}; - -/** - * Inserts a field (or label from string), and all prefix and suffix fields, at - * the location of the input's field row. - * @param {number} index The index at which to insert field. - * @param {string|!Blockly.Field} field Something to add as a field. - * @param {string=} opt_name Language-neutral identifier which may used to find - * this field again. Should be unique to the host block. - * @return {number} The index following the last inserted field. - */ -Blockly.Input.prototype.insertFieldAt = function(index, field, opt_name) { - if (index < 0 || index > this.fieldRow.length) { - throw new Error('index ' + index + ' out of bounds.'); - } - - // Empty string, Null or undefined generates no field, unless field is named. - if (!field && !opt_name) { - return this; - } - // Generate a FieldLabel when given a plain text field. - if (goog.isString(field)) { - field = new Blockly.FieldLabel(/** @type {string} */ (field)); - } - field.setSourceBlock(this.sourceBlock_); - if (this.sourceBlock_.rendered) { - field.init(); - } - field.name = opt_name; - - if (field.prefixField) { - // Add any prefix. - index = this.insertFieldAt(index, field.prefixField); - } - // Add the field to the field row. - this.fieldRow.splice(index, 0, field); - ++index; - if (field.suffixField) { - // Add any suffix. - index = this.insertFieldAt(index, field.suffixField); - } - - if (this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - // Adding a field will cause the block to change shape. - this.sourceBlock_.bumpNeighbours_(); - } - return index; -}; - -/** - * Remove a field from this input. - * @param {string} name The name of the field. - * @throws {goog.asserts.AssertionError} if the field is not present. - */ -Blockly.Input.prototype.removeField = function(name) { - for (var i = 0, field; field = this.fieldRow[i]; i++) { - if (field.name === name) { - field.dispose(); - this.fieldRow.splice(i, 1); - if (this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - // Removing a field will cause the block to change shape. - this.sourceBlock_.bumpNeighbours_(); - } - return; - } - } - goog.asserts.fail('Field "%s" not found.', name); -}; - -/** - * Gets whether this input is visible or not. - * @return {boolean} True if visible. - */ -Blockly.Input.prototype.isVisible = function() { - return this.visible_; -}; - -/** - * Sets whether this input is visible or not. - * Used to collapse/uncollapse a block. - * @param {boolean} visible True if visible. - * @return {!Array.} List of blocks to render. - */ -Blockly.Input.prototype.setVisible = function(visible) { - var renderList = []; - if (this.visible_ == visible) { - return renderList; - } - this.visible_ = visible; - - var display = visible ? 'block' : 'none'; - for (var y = 0, field; field = this.fieldRow[y]; y++) { - field.setVisible(visible); - } - if (this.connection) { - // Has a connection. - if (visible) { - renderList = this.connection.unhideAll(); - } else { - this.connection.hideAll(); - } - var child = this.connection.targetBlock(); - if (child) { - child.getSvgRoot().style.display = display; - if (!visible) { - child.rendered = false; - } - } - } - return renderList; -}; - -/** - * Change a connection's compatibility. - * @param {string|Array.|null} check Compatible value type or - * list of value types. Null if all types are compatible. - * @return {!Blockly.Input} The input being modified (to allow chaining). - */ -Blockly.Input.prototype.setCheck = function(check) { - if (!this.connection) { - throw 'This input does not have a connection.'; - } - this.connection.setCheck(check); - return this; -}; - -/** - * Change the alignment of the connection's field(s). - * @param {number} align One of Blockly.ALIGN_LEFT, ALIGN_CENTRE, ALIGN_RIGHT. - * In RTL mode directions are reversed, and ALIGN_RIGHT aligns to the left. - * @return {!Blockly.Input} The input being modified (to allow chaining). - */ -Blockly.Input.prototype.setAlign = function(align) { - this.align = align; - if (this.sourceBlock_.rendered) { - this.sourceBlock_.render(); - } - return this; -}; - -/** - * Initialize the fields on this input. - */ -Blockly.Input.prototype.init = function() { - if (!this.sourceBlock_.workspace.rendered) { - return; // Headless blocks don't need fields initialized. - } - for (var i = 0; i < this.fieldRow.length; i++) { - this.fieldRow[i].init(this.sourceBlock_); - } -}; - -/** - * Sever all links to this input. - */ -Blockly.Input.prototype.dispose = function() { - if (this.outlinePath) { - goog.dom.removeNode(this.outlinePath); - } - for (var i = 0, field; field = this.fieldRow[i]; i++) { - field.dispose(); - } - if (this.connection) { - this.connection.dispose(); - } - this.sourceBlock_ = null; -}; - -/** - * Create the input shape path element and attach it to the given SVG element. - * @param {!SVGElement} svgRoot The parent on which ot append the new element. - * @package - */ -Blockly.Input.prototype.initOutlinePath = function(svgRoot) { - if (!this.sourceBlock_.workspace.rendered) { - return; // Headless blocks don't need field outlines. - } - if (this.outlinePath) { - return; - } - if (this.type == Blockly.INPUT_VALUE) { - this.outlinePath = Blockly.utils.createSvgElement( - 'path', - { - 'class': 'blocklyPath', - 'style': 'visibility: hidden', // Hide by default - shown when not connected. - 'd': '' // IE doesn't like paths without the data definition, set an empty default - }, - svgRoot); - } -}; diff --git a/packages/scratch-blocks/core/insertion_marker_manager.js b/packages/scratch-blocks/core/insertion_marker_manager.js deleted file mode 100644 index 08dd6611e..000000000 --- a/packages/scratch-blocks/core/insertion_marker_manager.js +++ /dev/null @@ -1,667 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Class that controls updates to connections during drags. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.InsertionMarkerManager'); - -goog.require('Blockly.BlockAnimations'); -goog.require('Blockly.Events.BlockMove'); -goog.require('Blockly.RenderedConnection'); - -goog.require('goog.math.Coordinate'); - - -/** - * Class that controls updates to connections during drags. It is primarily - * responsible for finding the closest eligible connection and highlighting or - * unhiglighting it as needed during a drag. - * @param {!Blockly.BlockSvg} block The top block in the stack being dragged. - * @constructor - */ -Blockly.InsertionMarkerManager = function(block) { - Blockly.selected = block; - - /** - * The top block in the stack being dragged. - * Does not change during a drag. - * @type {!Blockly.Block} - * @private - */ - this.topBlock_ = block; - - /** - * The workspace on which these connections are being dragged. - * Does not change during a drag. - * @type {!Blockly.WorkspaceSvg} - * @private - */ - this.workspace_ = block.workspace; - - /** - * The last connection on the stack, if it's not the last connection on the - * first block. - * Set in initAvailableConnections, if at all. - * @type {Blockly.RenderedConnection} - * @private - */ - this.lastOnStack_ = null; - - /** - * The insertion marker corresponding to the last block in the stack, if - * that's not the same as the first block in the stack. - * Set in initAvailableConnections, if at all - * @type {Blockly.BlockSvg} - * @private - */ - this.lastMarker_ = null; - - /** - * The insertion marker that shows up between blocks to show where a block - * would go if dropped immediately. - * This is the scratch-blocks equivalent of connection highlighting. - * @type {Blockly.BlockSvg} - * @private - */ - this.firstMarker_ = this.createMarkerBlock_(this.topBlock_); - - /** - * The connection that this block would connect to if released immediately. - * Updated on every mouse move. - * This is not on any of the blocks that are being dragged. - * @type {Blockly.RenderedConnection} - * @private - */ - this.closestConnection_ = null; - - /** - * The connection that would connect to this.closestConnection_ if this block - * were released immediately. - * Updated on every mouse move. - * This is on the top block that is being dragged or the last block in the - * dragging stack. - * @type {Blockly.RenderedConnection} - * @private - */ - this.localConnection_ = null; - - /** - * Whether the block would be deleted if it were dropped immediately. - * Updated on every mouse move. - * @type {boolean} - * @private - */ - this.wouldDeleteBlock_ = false; - - /** - * Connection on the insertion marker block that corresponds to - * this.localConnection_ on the currently dragged block. - * This is part of the scratch-blocks equivalent of connection highlighting. - * @type {Blockly.RenderedConnection} - * @private - */ - this.markerConnection_ = null; - - /** - * Whether we are currently highlighting the block (shadow or real) that would - * be replaced if the drag were released immediately. - * @type {boolean} - * @private - */ - this.highlightingBlock_ = false; - - /** - * The block that is being highlighted for replacement, or null. - * @type {Blockly.BlockSvg} - * @private - */ - this.highlightedBlock_ = null; - - /** - * The connections on the dragging blocks that are available to connect to - * other blocks. This includes all open connections on the top block, as well - * as the last connection on the block stack. - * Does not change during a drag. - * @type {!Array.} - * @private - */ - this.availableConnections_ = this.initAvailableConnections_(); -}; - -/** - * Sever all links from this object. - * @package - */ -Blockly.InsertionMarkerManager.prototype.dispose = function() { - this.topBlock_ = null; - this.workspace_ = null; - this.availableConnections_.length = 0; - this.closestConnection_ = null; - this.localConnection_ = null; - - Blockly.Events.disable(); - try { - if (this.firstMarker_) { - this.firstMarker_.dispose(); - this.firstMarker_ = null; - } - if (this.lastMarker_) { - this.lastMarker_.dispose(); - this.lastMarker_ = null; - } - } finally { - Blockly.Events.enable(); - } - - this.highlightedBlock_ = null; -}; - -/** - * Return whether the block would be deleted if dropped immediately, based on - * information from the most recent move event. - * @return {boolean} true if the block would be deleted if dropped immediately. - * @package - */ -Blockly.InsertionMarkerManager.prototype.wouldDeleteBlock = function() { - return this.wouldDeleteBlock_; -}; - -/** - * Connect to the closest connection and render the results. - * This should be called at the end of a drag. - * @package - */ -Blockly.InsertionMarkerManager.prototype.applyConnections = function() { - if (this.closestConnection_) { - // Don't fire events for insertion markers. - Blockly.Events.disable(); - this.hidePreview_(); - Blockly.Events.enable(); - // Connect two blocks together. - this.localConnection_.connect(this.closestConnection_); - if (this.topBlock_.rendered) { - // Trigger a connection animation. - // Determine which connection is inferior (lower in the source stack). - var inferiorConnection = this.localConnection_.isSuperior() ? - this.closestConnection_ : this.localConnection_; - Blockly.BlockAnimations.connectionUiEffect( - inferiorConnection.getSourceBlock()); - // Bring the just-edited stack to the front. - var rootBlock = this.topBlock_.getRootBlock(); - rootBlock.bringToFront(); - } - } -}; - -/** - * Update highlighted connections based on the most recent move location. - * @param {!goog.math.Coordinate} dxy Position relative to drag start, - * in workspace units. - * @param {?number} deleteArea One of {@link Blockly.DELETE_AREA_TRASH}, - * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. - * @package - */ -Blockly.InsertionMarkerManager.prototype.update = function(dxy, deleteArea) { - var candidate = this.getCandidate_(dxy); - - this.wouldDeleteBlock_ = this.shouldDelete_(candidate, deleteArea); - var shouldUpdate = this.wouldDeleteBlock_ || - this.shouldUpdatePreviews_(candidate, dxy); - - if (shouldUpdate) { - // Don't fire events for insertion marker creation or movement. - Blockly.Events.disable(); - this.maybeHidePreview_(candidate); - this.maybeShowPreview_(candidate); - Blockly.Events.enable(); - } -}; - -/**** Begin initialization functions ****/ - -/** - * Create an insertion marker that represents the given block. - * @param {!Blockly.BlockSvg} sourceBlock The block that the insertion marker - * will represent. - * @return {!Blockly.BlockSvg} The insertion marker that represents the given - * block. - * @private - */ -Blockly.InsertionMarkerManager.prototype.createMarkerBlock_ = function(sourceBlock) { - var imType = sourceBlock.type; - - Blockly.Events.disable(); - try { - var result = this.workspace_.newBlock(imType); - result.setInsertionMarker(true, sourceBlock.width); - if (sourceBlock.mutationToDom) { - var oldMutationDom = sourceBlock.mutationToDom(); - if (oldMutationDom) { - result.domToMutation(oldMutationDom); - } - } - result.initSvg(); - } finally { - Blockly.Events.enable(); - } - - return result; -}; - -/** - * Populate the list of available connections on this block stack. This should - * only be called once, at the beginning of a drag. - * If the stack has more than one block, this function will populate - * lastOnStack_ and create the corresponding insertion marker. - * @return {!Array.} a list of available - * connections. - * @private - */ -Blockly.InsertionMarkerManager.prototype.initAvailableConnections_ = function() { - var available = this.topBlock_.getConnections_(false); - // Also check the last connection on this stack - var lastOnStack = this.topBlock_.lastConnectionInStack(); - if (lastOnStack && lastOnStack != this.topBlock_.nextConnection) { - available.push(lastOnStack); - this.lastOnStack_ = lastOnStack; - this.lastMarker_ = this.createMarkerBlock_(lastOnStack.sourceBlock_); - } - return available; -}; - -/**** End initialization functions ****/ - - -/** - * Whether the previews (insertion marker and replacement marker) should be - * updated based on the closest candidate and the current drag distance. - * @param {!Object} candidate An object containing a local connection, a closest - * connection, and a radius. Returned by getCandidate_. - * @param {!goog.math.Coordinate} dxy Position relative to drag start, - * in workspace units. - * @return {boolean} whether the preview should be updated. - * @private - */ -Blockly.InsertionMarkerManager.prototype.shouldUpdatePreviews_ = function( - candidate, dxy) { - var candidateLocal = candidate.local; - var candidateClosest = candidate.closest; - var radius = candidate.radius; - - // Found a connection! - if (candidateLocal && candidateClosest) { - if (candidateLocal.type == Blockly.OUTPUT_VALUE) { - // Always update previews for output connections. - return true; - } - // We're already showing an insertion marker. - // Decide whether the new connection has higher priority. - if (this.localConnection_ && this.closestConnection_) { - // The connection was the same as the current connection. - if (this.closestConnection_ == candidateClosest) { - return false; - } - var xDiff = this.localConnection_.x_ + dxy.x - this.closestConnection_.x_; - var yDiff = this.localConnection_.y_ + dxy.y - this.closestConnection_.y_; - var curDistance = Math.sqrt(xDiff * xDiff + yDiff * yDiff); - // Slightly prefer the existing preview over a new preview. - return !(candidateClosest && radius > curDistance - - Blockly.CURRENT_CONNECTION_PREFERENCE); - } else if (!this.localConnection_ && !this.closestConnection_) { - // We weren't showing a preview before, but we should now. - return true; - } else { - console.error('Only one of localConnection_ and closestConnection_ was set.'); - } - } else { // No connection found. - // Only need to update if we were showing a preview before. - return !!(this.localConnection_ && this.closestConnection_); - } - - console.error('Returning true from shouldUpdatePreviews, but it\'s not clear why.'); - return true; -}; - -/** - * Find the nearest valid connection, which may be the same as the current - * closest connection. - * @param {!goog.math.Coordinate} dxy Position relative to drag start, - * in workspace units. - * @return {!Object} candidate An object containing a local connection, a closest - * connection, and a radius. - */ -Blockly.InsertionMarkerManager.prototype.getCandidate_ = function(dxy) { - var radius = this.getStartRadius_(); - var candidateClosest = null; - var candidateLocal = null; - - for (var i = 0; i < this.availableConnections_.length; i++) { - var myConnection = this.availableConnections_[i]; - var neighbour = myConnection.closest(radius, dxy); - if (neighbour.connection) { - candidateClosest = neighbour.connection; - candidateLocal = myConnection; - radius = neighbour.radius; - } - } - return { - closest: candidateClosest, - local: candidateLocal, - radius: radius - }; -}; - -/** - * Decide the radius at which to start searching for the closest connection. - * @return {number} The radius at which to start the search for the closest - * connection. - * @private - */ -Blockly.InsertionMarkerManager.prototype.getStartRadius_ = function() { - // If there is already a connection highlighted, - // increase the radius we check for making new connections. - // Why? When a connection is highlighted, blocks move around when the insertion - // marker is created, which could cause the connection became out of range. - // By increasing radiusConnection when a connection already exists, - // we never "lose" the connection from the offset. - if (this.closestConnection_ && this.localConnection_) { - return Blockly.CONNECTING_SNAP_RADIUS; - } - return Blockly.SNAP_RADIUS; -}; - -/** - * Whether ending the drag would replace a block or insert a block. - * @return {boolean} True if dropping the block immediately would replace - * another block. False if dropping the block immediately would result in - * the block being inserted in a block stack. - * @private - */ -Blockly.InsertionMarkerManager.prototype.shouldReplace_ = function() { - var closest = this.closestConnection_; - var local = this.localConnection_; - - // Dragging a block over an existing block in an input should replace the - // existing block and bump it out. - if (local.type == Blockly.OUTPUT_VALUE) { - return true; // Replace. - } - - // Connecting to a statement input of c-block is an insertion, even if that - // c-block is terminal (e.g. forever). - if (local == local.sourceBlock_.getFirstStatementConnection()) { - return false; // Insert. - } - - // Dragging a terminal block over another (connected) terminal block will - // replace, not insert. - var isTerminalBlock = !this.topBlock_.nextConnection; - var isConnectedTerminal = isTerminalBlock && - local.type == Blockly.PREVIOUS_STATEMENT && closest.isConnected(); - if (isConnectedTerminal) { - return true; // Replace. - } - - // Otherwise it's an insertion. - return false; -}; - -/** - * Whether ending the drag would delete the block. - * @param {!Object} candidate An object containing a local connection, a closest - * connection, and a radius. - * @param {?number} deleteArea One of {@link Blockly.DELETE_AREA_TRASH}, - * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. - * @return {boolean} True if dropping the block immediately would replace - * delete the block. False otherwise. - * @private - */ -Blockly.InsertionMarkerManager.prototype.shouldDelete_ = function(candidate, - deleteArea) { - // Prefer connecting over dropping into the trash can, but prefer dragging to - // the toolbox over connecting to other blocks. - var wouldConnect = candidate && !!candidate.closest && - deleteArea != Blockly.DELETE_AREA_TOOLBOX; - var wouldDelete = !!deleteArea && !this.topBlock_.getParent() && - this.topBlock_.isDeletable(); - - return wouldDelete && !wouldConnect; -}; - -/**** Begin preview visibility functions ****/ - -/** - * Show an insertion marker or replacement highlighting during a drag, if - * needed. - * At the beginning of this function, this.localConnection_ and - * this.closestConnection_ should both be null. - * @param {!Object} candidate An object containing a local connection, a closest - * connection, and a radius. - * @private - */ -Blockly.InsertionMarkerManager.prototype.maybeShowPreview_ = function(candidate) { - // Nope, don't add a marker. - if (this.wouldDeleteBlock_) { - return; - } - var closest = candidate.closest; - var local = candidate.local; - - // Nothing to connect to. - if (!closest) { - return; - } - - // Something went wrong and we're trying to connect to an invalid connection. - if (closest == this.closestConnection_ || - closest.sourceBlock_.isInsertionMarker()) { - return; - } - // Add an insertion marker or replacement marker. - this.closestConnection_ = closest; - this.localConnection_ = local; - this.showPreview_(); -}; - -/** - * A preview should be shown. This function figures out if it should be a block - * highlight or an insertion marker, and shows the appropriate one. - * @private - */ -Blockly.InsertionMarkerManager.prototype.showPreview_ = function() { - if (this.shouldReplace_()) { - this.highlightBlock_(); - } else { // Should insert - this.connectMarker_(); - } -}; - -/** - * Show an insertion marker or replacement highlighting during a drag, if - * needed. - * At the end of this function, this.localConnection_ and - * this.closestConnection_ should both be null. - * @param {!Object} candidate An object containing a local connection, a closest - * connection, and a radius. - * @private - */ -Blockly.InsertionMarkerManager.prototype.maybeHidePreview_ = function(candidate) { - // If there's no new preview, remove the old one but don't bother deleting it. - // We might need it later, and this saves disposing of it and recreating it. - if (!candidate.closest) { - this.hidePreview_(); - } - // If there's a new preview and there was an preview before, and either - // connection has changed, remove the old preview. - var hadPreview = this.closestConnection_ && this.localConnection_; - var closestChanged = this.closestConnection_ != candidate.closest; - var localChanged = this.localConnection_ != candidate.local; - - // Also hide if we had a preview before but now we're going to delete instead. - if (hadPreview && (closestChanged || localChanged || this.wouldDeleteBlock_)) { - this.hidePreview_(); - } - - // Either way, clear out old state. - this.markerConnection_ = null; - this.closestConnection_ = null; - this.localConnection_ = null; -}; - -/** - * A preview should be hidden. This function figures out if it is a block - * highlight or an insertion marker, and hides the appropriate one. - * @private - */ -Blockly.InsertionMarkerManager.prototype.hidePreview_ = function() { - if (this.highlightingBlock_) { - this.unhighlightBlock_(); - } else if (this.markerConnection_) { - this.disconnectMarker_(); - } -}; - -/**** End preview visibility functions ****/ - -/**** Begin block highlighting functions ****/ - -/** - * Add highlighting showing which block will be replaced. - * Scratch-specific code, where "highlighting" applies to a block rather than - * a connection. - */ -Blockly.InsertionMarkerManager.prototype.highlightBlock_ = function() { - var closest = this.closestConnection_; - var local = this.localConnection_; - if (closest.targetBlock()) { - this.highlightedBlock_ = closest.targetBlock(); - closest.targetBlock().highlightForReplacement(true); - } else if(local.type == Blockly.OUTPUT_VALUE) { - this.highlightedBlock_ = closest.sourceBlock_; - closest.sourceBlock_.highlightShapeForInput(closest, true); - } - this.highlightingBlock_ = true; -}; - -/** - * Get rid of the highlighting marking the block that will be replaced. - * Scratch-specific code, where "highlighting" applies to a block rather than - * a connection. - */ -Blockly.InsertionMarkerManager.prototype.unhighlightBlock_ = function() { - var closest = this.closestConnection_; - // If there's no block in place, but we're still connecting to a value input, - // then we must have been highlighting an input shape. - if (closest.type == Blockly.INPUT_VALUE && !closest.isConnected()) { - this.highlightedBlock_.highlightShapeForInput(closest, false); - } else { - this.highlightedBlock_.highlightForReplacement(false); - } - this.highlightedBlock_ = null; - this.highlightingBlock_ = false; -}; - -/**** End block highlighting functions ****/ - -/**** Begin insertion marker display functions ****/ - -/** - * Disconnect the insertion marker block in a manner that returns the stack to - * original state. - * @private - */ -Blockly.InsertionMarkerManager.prototype.disconnectMarker_ = function() { - if (!this.markerConnection_) { - console.log('No insertion marker connection to disconnect'); - return; - } - - var imConn = this.markerConnection_; - var imBlock = imConn.sourceBlock_; - var markerNext = imBlock.nextConnection; - var markerPrev = imBlock.previousConnection; - - - // The insertion marker is the first block in a stack, either because it - // doesn't have a previous connection or because the previous connection is - // not connected. Unplug won't do anything in that case. Instead, unplug the - // following block. - if (imConn == markerNext && !(markerPrev && markerPrev.targetConnection)) { - imConn.targetBlock().unplug(false); - } - // Inside of a C-block, first statement connection. - else if (imConn.type == Blockly.NEXT_STATEMENT && imConn != markerNext) { - var innerConnection = imConn.targetConnection; - innerConnection.sourceBlock_.unplug(false); - - var previousBlockNextConnection = - markerPrev ? markerPrev.targetConnection : null; - - imBlock.unplug(true); - if (previousBlockNextConnection) { - previousBlockNextConnection.connect(innerConnection); - } - } else { - imBlock.unplug(true /* healStack */); - } - - if (imConn.targetConnection) { - throw 'markerConnection_ still connected at the end of disconnectInsertionMarker'; - } - - this.markerConnection_ = null; - imBlock.getSvgRoot().setAttribute('visibility', 'hidden'); -}; - -/** - * Add an insertion marker connected to the appropriate blocks. - * @private - */ -Blockly.InsertionMarkerManager.prototype.connectMarker_ = function() { - var local = this.localConnection_; - var closest = this.closestConnection_; - - var isLastInStack = this.lastOnStack_ && local == this.lastOnStack_; - var imBlock = isLastInStack ? this.lastMarker_ : this.firstMarker_; - var imConn = imBlock.getMatchingConnection(local.sourceBlock_, local); - - goog.asserts.assert(imConn != this.markerConnection_, - 'Made it to connectMarker_ even though the marker isn\'t changing'); - - // Render disconnected from everything else so that we have a valid - // connection location. - imBlock.render(); - imBlock.rendered = true; - imBlock.getSvgRoot().setAttribute('visibility', 'visible'); - - // TODO: positionNewBlock should be on Blockly.BlockSvg, not prototype, - // because it doesn't rely on anything in the block it's called on. - imBlock.positionNewBlock(imBlock, imConn, closest); - - // Connect() also renders the insertion marker. - imConn.connect(closest); - this.markerConnection_ = imConn; -}; - -/**** End insertion marker display functions ****/ diff --git a/packages/scratch-blocks/core/msg.js b/packages/scratch-blocks/core/msg.js deleted file mode 100644 index 4ebcad1ab..000000000 --- a/packages/scratch-blocks/core/msg.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Empty name space for the Message singleton. - * @author scr@google.com (Sheridan Rawlins) - */ -'use strict'; - -/** - * Name space for the Msg singleton. - * Msg gets populated in the message files. - */ -goog.provide('Blockly.Msg'); - - -/** - * Back up original getMsg function. - * @type {!Function} - */ -goog.getMsgOrig = goog.getMsg; - -/** - * Gets a localized message. - * Overrides the default Closure function to check for a Blockly.Msg first. - * Used infrequently, only known case is TODAY button in date picker. - * @param {string} str Translatable string, places holders in the form {$foo}. - * @param {Object=} opt_values Maps place holder name to value. - * @return {string} message with placeholders filled. - * @suppress {duplicate} - */ -goog.getMsg = function(str, opt_values) { - var key = goog.getMsg.blocklyMsgMap[str]; - if (key) { - str = Blockly.Msg[key]; - } - return goog.getMsgOrig(str, opt_values); -}; - -/** - * Mapping of Closure messages to Blockly.Msg names. - */ -goog.getMsg.blocklyMsgMap = { - 'Today': 'TODAY' -}; diff --git a/packages/scratch-blocks/core/mutator.js b/packages/scratch-blocks/core/mutator.js deleted file mode 100644 index b85afde17..000000000 --- a/packages/scratch-blocks/core/mutator.js +++ /dev/null @@ -1,426 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a mutator dialog. A mutator allows the - * user to change the shape of a block using a nested blocks editor. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Mutator'); - -goog.require('Blockly.Bubble'); -goog.require('Blockly.Events.BlockChange'); -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.Icon'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('goog.dom'); - - -/** - * Class for a mutator dialog. - * @param {!Array.} quarkNames List of names of sub-blocks for flyout. - * @extends {Blockly.Icon} - * @constructor - */ -Blockly.Mutator = function(quarkNames) { - Blockly.Mutator.superClass_.constructor.call(this, null); - this.quarkNames_ = quarkNames; -}; -goog.inherits(Blockly.Mutator, Blockly.Icon); - -/** - * Width of workspace. - * @private - */ -Blockly.Mutator.prototype.workspaceWidth_ = 0; - -/** - * Height of workspace. - * @private - */ -Blockly.Mutator.prototype.workspaceHeight_ = 0; - -/** - * Draw the mutator icon. - * @param {!Element} group The icon group. - * @private - */ -Blockly.Mutator.prototype.drawIcon_ = function(group) { - // Square with rounded corners. - Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyIconShape', - 'rx': '4', - 'ry': '4', - 'height': '16', - 'width': '16' - }, - group); - // Gear teeth. - Blockly.utils.createSvgElement('path', - { - 'class': 'blocklyIconSymbol', - 'd': 'm4.203,7.296 0,1.368 -0.92,0.677 -0.11,0.41 0.9,1.559 0.41,' + - '0.11 1.043,-0.457 1.187,0.683 0.127,1.134 0.3,0.3 1.8,0 0.3,' + - '-0.299 0.127,-1.138 1.185,-0.682 1.046,0.458 0.409,-0.11 0.9,' + - '-1.559 -0.11,-0.41 -0.92,-0.677 0,-1.366 0.92,-0.677 0.11,' + - '-0.41 -0.9,-1.559 -0.409,-0.109 -1.046,0.458 -1.185,-0.682 ' + - '-0.127,-1.138 -0.3,-0.299 -1.8,0 -0.3,0.3 -0.126,1.135 -1.187,' + - '0.682 -1.043,-0.457 -0.41,0.11 -0.899,1.559 0.108,0.409z' - }, - group); - // Axle hole. - Blockly.utils.createSvgElement( - 'circle', - { - 'class': 'blocklyIconShape', - 'r': '2.7', - 'cx': '8', - 'cy': '8' - }, - group); -}; - -/** - * Clicking on the icon toggles if the mutator bubble is visible. - * Disable if block is uneditable. - * @param {!Event} e Mouse click event. - * @private - * @override - */ -Blockly.Mutator.prototype.iconClick_ = function(e) { - if (this.block_.isEditable()) { - Blockly.Icon.prototype.iconClick_.call(this, e); - } -}; - -/** - * Create the editor for the mutator's bubble. - * @return {!Element} The top-level node of the editor. - * @private - */ -Blockly.Mutator.prototype.createEditor_ = function() { - /* Create the editor. Here's the markup that will be generated: - - [Workspace] - - */ - this.svgDialog_ = Blockly.utils.createSvgElement('svg', - {'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH}, - null); - // Convert the list of names into a list of XML objects for the flyout. - if (this.quarkNames_.length) { - var quarkXml = goog.dom.createDom('xml'); - for (var i = 0, quarkName; quarkName = this.quarkNames_[i]; i++) { - quarkXml.appendChild(goog.dom.createDom('block', {'type': quarkName})); - } - } else { - var quarkXml = null; - } - var workspaceOptions = { - languageTree: quarkXml, - parentWorkspace: this.block_.workspace, - pathToMedia: this.block_.workspace.options.pathToMedia, - RTL: this.block_.RTL, - toolboxPosition: this.block_.RTL ? Blockly.TOOLBOX_AT_RIGHT : - Blockly.TOOLBOX_AT_LEFT, - horizontalLayout: false, - getMetrics: this.getFlyoutMetrics_.bind(this), - setMetrics: null - }; - this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions, this.block_.workspace.dragSurface); - this.workspace_.isMutator = true; - - // Mutator flyouts go inside the mutator workspace's rather than in - // a top level svg. Instead of handling scale themselves, mutators - // inherit scale from the parent workspace. - // To fix this, scale needs to be applied at a different level in the dom. - var flyoutSvg = this.workspace_.addFlyout_('g'); - var background = this.workspace_.createDom('blocklyMutatorBackground'); - - // Insert the flyout after the but before the block canvas so that - // the flyout is underneath in z-order. This makes blocks layering during - // dragging work properly. - background.insertBefore(flyoutSvg, this.workspace_.svgBlockCanvas_); - this.svgDialog_.appendChild(background); - - return this.svgDialog_; -}; - -/** - * Add or remove the UI indicating if this icon may be clicked or not. - */ -Blockly.Mutator.prototype.updateEditable = function() { - if (!this.block_.isInFlyout) { - if (this.block_.isEditable()) { - if (this.iconGroup_) { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.iconGroup_), - 'blocklyIconGroupReadonly'); - } - } else { - // Close any mutator bubble. Icon is not clickable. - this.setVisible(false); - if (this.iconGroup_) { - Blockly.utils.addClass( - /** @type {!Element} */ (this.iconGroup_), - 'blocklyIconGroupReadonly'); - } - } - } - // Default behaviour for an icon. - Blockly.Icon.prototype.updateEditable.call(this); -}; - -/** - * Callback function triggered when the bubble has resized. - * Resize the workspace accordingly. - * @private - */ -Blockly.Mutator.prototype.resizeBubble_ = function() { - var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH; - var workspaceSize = this.workspace_.getCanvas().getBBox(); - var width; - if (this.block_.RTL) { - width = -workspaceSize.x; - } else { - width = workspaceSize.width + workspaceSize.x; - } - var height = workspaceSize.height + doubleBorderWidth * 3; - if (this.workspace_.flyout_) { - var flyoutMetrics = this.workspace_.flyout_.getMetrics_(); - height = Math.max(height, flyoutMetrics.contentHeight + 20); - } - width += doubleBorderWidth * 3; - // Only resize if the size difference is significant. Eliminates shuddering. - if (Math.abs(this.workspaceWidth_ - width) > doubleBorderWidth || - Math.abs(this.workspaceHeight_ - height) > doubleBorderWidth) { - // Record some layout information for getFlyoutMetrics_. - this.workspaceWidth_ = width; - this.workspaceHeight_ = height; - // Resize the bubble. - this.bubble_.setBubbleSize( - width + doubleBorderWidth, height + doubleBorderWidth); - this.svgDialog_.setAttribute('width', this.workspaceWidth_); - this.svgDialog_.setAttribute('height', this.workspaceHeight_); - } - - if (this.block_.RTL) { - // Scroll the workspace to always left-align. - var translation = 'translate(' + this.workspaceWidth_ + ',0)'; - this.workspace_.getCanvas().setAttribute('transform', translation); - } - this.workspace_.resize(); -}; - -/** - * Show or hide the mutator bubble. - * @param {boolean} visible True if the bubble should be visible. - */ -Blockly.Mutator.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - // No change. - return; - } - Blockly.Events.fire( - new Blockly.Events.Ui(this.block_, 'mutatorOpen', !visible, visible)); - if (visible) { - // Create the bubble. - this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), - this.createEditor_(), this.block_.svgPath_, this.iconXY_, null, null); - var tree = this.workspace_.options.languageTree; - if (tree) { - this.workspace_.flyout_.init(this.workspace_); - this.workspace_.flyout_.show(tree.childNodes); - } - - this.rootBlock_ = this.block_.decompose(this.workspace_); - var blocks = this.rootBlock_.getDescendants(false); - for (var i = 0, child; child = blocks[i]; i++) { - child.render(); - } - // The root block should not be dragable or deletable. - this.rootBlock_.setMovable(false); - this.rootBlock_.setDeletable(false); - if (this.workspace_.flyout_) { - var margin = this.workspace_.flyout_.CORNER_RADIUS * 2; - var x = this.workspace_.flyout_.width_ + margin; - } else { - var margin = 16; - var x = margin; - } - if (this.block_.RTL) { - x = -x; - } - this.rootBlock_.moveBy(x, margin); - // Save the initial connections, then listen for further changes. - if (this.block_.saveConnections) { - var thisMutator = this; - this.block_.saveConnections(this.rootBlock_); - this.sourceListener_ = function() { - thisMutator.block_.saveConnections(thisMutator.rootBlock_); - }; - this.block_.workspace.addChangeListener(this.sourceListener_); - } - this.resizeBubble_(); - // When the mutator's workspace changes, update the source block. - this.workspace_.addChangeListener(this.workspaceChanged_.bind(this)); - this.updateColour(); - } else { - // Dispose of the bubble. - this.svgDialog_ = null; - this.workspace_.dispose(); - this.workspace_ = null; - this.rootBlock_ = null; - this.bubble_.dispose(); - this.bubble_ = null; - this.workspaceWidth_ = 0; - this.workspaceHeight_ = 0; - if (this.sourceListener_) { - this.block_.workspace.removeChangeListener(this.sourceListener_); - this.sourceListener_ = null; - } - } -}; - -/** - * Update the source block when the mutator's blocks are changed. - * Bump down any block that's too high. - * Fired whenever a change is made to the mutator's workspace. - * @private - */ -Blockly.Mutator.prototype.workspaceChanged_ = function() { - if (!this.workspace_.isDragging()) { - var blocks = this.workspace_.getTopBlocks(false); - var MARGIN = 20; - for (var b = 0, block; block = blocks[b]; b++) { - var blockXY = block.getRelativeToSurfaceXY(); - var blockHW = block.getHeightWidth(); - if (blockXY.y + blockHW.height < MARGIN) { - // Bump any block that's above the top back inside. - block.moveBy(0, MARGIN - blockHW.height - blockXY.y); - } - } - } - - // When the mutator's workspace changes, update the source block. - if (this.rootBlock_.workspace == this.workspace_) { - Blockly.Events.setGroup(true); - var block = this.block_; - var oldMutationDom = block.mutationToDom(); - var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); - // Switch off rendering while the source block is rebuilt. - var savedRendered = block.rendered; - block.rendered = false; - // Allow the source block to rebuild itself. - block.compose(this.rootBlock_); - // Restore rendering and show the changes. - block.rendered = savedRendered; - // Mutation may have added some elements that need initializing. - block.initSvg(); - var newMutationDom = block.mutationToDom(); - var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); - if (oldMutation != newMutation) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - block, 'mutation', null, oldMutation, newMutation)); - // Ensure that any bump is part of this mutation's event group. - var group = Blockly.Events.getGroup(); - setTimeout(function() { - Blockly.Events.setGroup(group); - block.bumpNeighbours_(); - Blockly.Events.setGroup(false); - }, Blockly.BUMP_DELAY); - } - if (block.rendered) { - block.render(); - } - // Don't update the bubble until the drag has ended, to avoid moving blocks - // under the cursor. - if (!this.workspace_.isDragging()) { - this.resizeBubble_(); - } - Blockly.Events.setGroup(false); - } -}; - -/** - * Return an object with all the metrics required to size scrollbars for the - * mutator flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - * @return {!Object} Contains size and position metrics of mutator dialog's - * workspace. - * @private - */ -Blockly.Mutator.prototype.getFlyoutMetrics_ = function() { - return { - viewHeight: this.workspaceHeight_, - viewWidth: this.workspaceWidth_, - absoluteTop: 0, - absoluteLeft: 0 - }; -}; - -/** - * Dispose of this mutator. - */ -Blockly.Mutator.prototype.dispose = function() { - this.block_.mutator = null; - Blockly.Icon.prototype.dispose.call(this); -}; - -/** - * Reconnect an block to a mutated input. - * @param {Blockly.Connection} connectionChild Connection on child block. - * @param {!Blockly.Block} block Parent block. - * @param {string} inputName Name of input on parent block. - * @return {boolean} True iff a reconnection was made, false otherwise. - */ -Blockly.Mutator.reconnect = function(connectionChild, block, inputName) { - if (!connectionChild || !connectionChild.getSourceBlock().workspace) { - return false; // No connection or block has been deleted. - } - var connectionParent = block.getInput(inputName).connection; - var currentParent = connectionChild.targetBlock(); - if ((!currentParent || currentParent == block) && - connectionParent.targetConnection != connectionChild) { - if (connectionParent.isConnected()) { - // There's already something connected here. Get rid of it. - connectionParent.disconnect(); - } - connectionParent.connect(connectionChild); - return true; - } - return false; -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -if (!goog.global['Blockly']) { - goog.global['Blockly'] = {}; -} -if (!goog.global['Blockly']['Mutator']) { - goog.global['Blockly']['Mutator'] = {}; -} -goog.global['Blockly']['Mutator']['reconnect'] = Blockly.Mutator.reconnect; diff --git a/packages/scratch-blocks/core/names.js b/packages/scratch-blocks/core/names.js deleted file mode 100644 index b76978b62..000000000 --- a/packages/scratch-blocks/core/names.js +++ /dev/null @@ -1,198 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility functions for handling variables and procedure names. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Names'); - - -/** - * Class for a database of entity names (variables, functions, etc). - * @param {string} reservedWords A comma-separated string of words that are - * illegal for use as names in a language (e.g. 'new,if,this,...'). - * @param {string=} opt_variablePrefix Some languages need a '$' or a namespace - * before all variable names. - * @constructor - */ -Blockly.Names = function(reservedWords, opt_variablePrefix) { - this.variablePrefix_ = opt_variablePrefix || ''; - this.reservedDict_ = Object.create(null); - if (reservedWords) { - var splitWords = reservedWords.split(','); - for (var i = 0; i < splitWords.length; i++) { - this.reservedDict_[splitWords[i]] = true; - } - } - this.reset(); -}; - -/** - * Constant to separate developer variable names from user-defined variable - * names when running generators. - * A developer variable will be declared as a global in the generated code, but - * will never be shown to the user in the workspace or stored in the variable - * map. - */ -Blockly.Names.DEVELOPER_VARIABLE_TYPE = 'DEVELOPER_VARIABLE'; - -/** - * When JavaScript (or most other languages) is generated, variable 'foo' and - * procedure 'foo' would collide. However, Blockly has no such problems since - * variable get 'foo' and procedure call 'foo' are unambiguous. - * Therefore, Blockly keeps a separate type name to disambiguate. - * getName('foo', 'variable') -> 'foo' - * getName('foo', 'procedure') -> 'foo2' - */ - -/** - * Empty the database and start from scratch. The reserved words are kept. - */ -Blockly.Names.prototype.reset = function() { - this.db_ = Object.create(null); - this.dbReverse_ = Object.create(null); - this.variableMap_ = null; -}; - -/** - * Set the variable map that maps from variable name to variable object. - * @param {!Blockly.VariableMap} map The map to track. - * @package - */ -Blockly.Names.prototype.setVariableMap = function(map) { - this.variableMap_ = map; -}; - -/** - * Get the name for a user-defined variable, based on its ID. - * This should only be used for variables of type Blockly.Variables.NAME_TYPE. - * @param {string} id The ID to look up in the variable map. - * @return {?string} The name of the referenced variable, or null if there was - * no variable map or the variable was not found in the map. - * @private - */ -Blockly.Names.prototype.getNameForUserVariable_ = function(id) { - if (!this.variableMap_) { - console.log('Deprecated call to Blockly.Names.prototype.getName without ' + - 'defining a variable map. To fix, add the folowing code in your ' + - 'generator\'s init() function:\n' + - 'Blockly.YourGeneratorName.variableDB_.setVariableMap(' + - 'workspace.getVariableMap());'); - return null; - } - var variable = this.variableMap_.getVariableById(id); - if (variable) { - return variable.name; - } else { - return null; - } -}; - -/** - * Convert a Blockly entity name to a legal exportable entity name. - * @param {string} name The Blockly entity name (no constraints). - * @param {string} type The type of entity in Blockly - * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...). - * @return {string} An entity name that is legal in the exported language. - */ -Blockly.Names.prototype.getName = function(name, type) { - if (type == Blockly.Variables.NAME_TYPE) { - var varName = this.getNameForUserVariable_(name); - if (varName) { - name = varName; - } - } - var normalized = name.toLowerCase() + '_' + type; - - var isVarType = type == Blockly.Variables.NAME_TYPE || - type == Blockly.Names.DEVELOPER_VARIABLE_TYPE; - - var prefix = isVarType ? this.variablePrefix_ : ''; - if (normalized in this.db_) { - return prefix + this.db_[normalized]; - } - var safeName = this.getDistinctName(name, type); - this.db_[normalized] = safeName.substr(prefix.length); - return safeName; -}; - -/** - * Convert a Blockly entity name to a legal exportable entity name. - * Ensure that this is a new name not overlapping any previously defined name. - * Also check against list of reserved words for the current language and - * ensure name doesn't collide. - * @param {string} name The Blockly entity name (no constraints). - * @param {string} type The type of entity in Blockly - * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...). - * @return {string} An entity name that is legal in the exported language. - */ -Blockly.Names.prototype.getDistinctName = function(name, type) { - var safeName = this.safeName_(name); - var i = ''; - while (this.dbReverse_[safeName + i] || - (safeName + i) in this.reservedDict_) { - // Collision with existing name. Create a unique name. - i = i ? i + 1 : 2; - } - safeName += i; - this.dbReverse_[safeName] = true; - var isVarType = type == Blockly.Variables.NAME_TYPE || - type == Blockly.Names.DEVELOPER_VARIABLE_TYPE; - var prefix = isVarType ? this.variablePrefix_ : ''; - return prefix + safeName; -}; - -/** - * Given a proposed entity name, generate a name that conforms to the - * [_A-Za-z][_A-Za-z0-9]* format that most languages consider legal for - * variables. - * @param {string} name Potentially illegal entity name. - * @return {string} Safe entity name. - * @private - */ -Blockly.Names.prototype.safeName_ = function(name) { - if (!name) { - name = 'unnamed'; - } else { - // Unfortunately names in non-latin characters will look like - // _E9_9F_B3_E4_B9_90 which is pretty meaningless. - // https://github.com/google/blockly/issues/1654 - name = encodeURI(name.replace(/ /g, '_')).replace(/[^\w]/g, '_'); - // Most languages don't allow names with leading numbers. - if ('0123456789'.indexOf(name[0]) != -1) { - name = 'my_' + name; - } - } - return name; -}; - -/** - * Do the given two entity names refer to the same entity? - * Blockly names are case-insensitive. - * @param {string} name1 First name. - * @param {string} name2 Second name. - * @return {boolean} True if names are the same. - */ -Blockly.Names.equals = function(name1, name2) { - return name1.toLowerCase() == name2.toLowerCase(); -}; diff --git a/packages/scratch-blocks/core/options.js b/packages/scratch-blocks/core/options.js deleted file mode 100644 index 6e3b79e47..000000000 --- a/packages/scratch-blocks/core/options.js +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object that controls settings for the workspace. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Options'); -goog.require('Blockly.Colours'); - - -/** - * Parse the user-specified options, using reasonable defaults where behaviour - * is unspecified. - * @param {!Object} options Dictionary of options. Specification: - * https://developers.google.com/blockly/guides/get-started/web#configuration - * @constructor - */ -Blockly.Options = function(options) { - var readOnly = !!options['readOnly']; - if (readOnly) { - var languageTree = null; - var hasCategories = false; - var hasTrashcan = false; - var hasCollapse = false; - var hasComments = false; - var hasDisable = false; - var hasSounds = false; - } else { - if (!options['toolbox'] && Blockly.Blocks.defaultToolbox) { - var oParser = new DOMParser(); - var dom = oParser.parseFromString(Blockly.Blocks.defaultToolbox, 'text/xml'); - options['toolbox'] = dom.documentElement; - } - var languageTree = Blockly.Options.parseToolboxTree(options['toolbox']); - var hasCategories = Boolean(languageTree && - languageTree.getElementsByTagName('category').length); - var hasTrashcan = options['trashcan']; - if (hasTrashcan === undefined) { - hasTrashcan = false; - } - var hasCollapse = options['collapse']; - if (hasCollapse === undefined) { - hasCollapse = hasCategories; - } - var hasComments = options['comments']; - if (hasComments === undefined) { - hasComments = hasCategories; - } - var hasDisable = options['disable']; - if (hasDisable === undefined) { - hasDisable = hasCategories; - } - var hasSounds = options['sounds']; - if (hasSounds === undefined) { - hasSounds = true; - } - } - var rtl = !!options['rtl']; - var horizontalLayout = options['horizontalLayout']; - if (horizontalLayout === undefined) { - horizontalLayout = false; - } - var toolboxAtStart = options['toolboxPosition']; - if (toolboxAtStart === 'end') { - toolboxAtStart = false; - } else { - toolboxAtStart = true; - } - - if (horizontalLayout) { - var toolboxPosition = toolboxAtStart ? - Blockly.TOOLBOX_AT_TOP : Blockly.TOOLBOX_AT_BOTTOM; - } else { - var toolboxPosition = (toolboxAtStart == rtl) ? - Blockly.TOOLBOX_AT_RIGHT : Blockly.TOOLBOX_AT_LEFT; - } - - var hasScrollbars = options['scrollbars']; - if (hasScrollbars === undefined) { - hasScrollbars = hasCategories; - } - var hasCss = options['css']; - if (hasCss === undefined) { - hasCss = true; - } - var pathToMedia = 'https://blockly-demo.appspot.com/static/media/'; - if (options['media']) { - pathToMedia = options['media']; - } else if (options['path']) { - // 'path' is a deprecated option which has been replaced by 'media'. - pathToMedia = options['path'] + 'media/'; - } - if (options['oneBasedIndex'] === undefined) { - var oneBasedIndex = true; - } else { - var oneBasedIndex = !!options['oneBasedIndex']; - } - - Blockly.Colours.overrideColours(options['colours']); - - this.RTL = rtl; - this.oneBasedIndex = oneBasedIndex; - this.collapse = hasCollapse; - this.comments = hasComments; - this.disable = hasDisable; - this.readOnly = readOnly; - this.pathToMedia = pathToMedia; - this.hasCategories = hasCategories; - this.hasScrollbars = hasScrollbars; - this.hasTrashcan = hasTrashcan; - this.hasSounds = hasSounds; - this.hasCss = hasCss; - this.horizontalLayout = horizontalLayout; - this.languageTree = languageTree; - this.gridOptions = Blockly.Options.parseGridOptions_(options); - this.zoomOptions = Blockly.Options.parseZoomOptions_(options); - this.toolboxPosition = toolboxPosition; -}; - -/** - * The parent of the current workspace, or null if there is no parent workspace. - * @type {Blockly.Workspace} - **/ -Blockly.Options.prototype.parentWorkspace = null; - -/** - * If set, sets the translation of the workspace to match the scrollbars. - */ -Blockly.Options.prototype.setMetrics = null; - -/** - * Return an object with the metrics required to size the workspace. - * @return {Object} Contains size and position metrics, or null. - */ -Blockly.Options.prototype.getMetrics = null; - -/** - * Parse the user-specified zoom options, using reasonable defaults where - * behaviour is unspecified. See zoom documentation: - * https://developers.google.com/blockly/guides/configure/web/zoom - * @param {!Object} options Dictionary of options. - * @return {!Object} A dictionary of normalized options. - * @private - */ -Blockly.Options.parseZoomOptions_ = function(options) { - var zoom = options['zoom'] || {}; - var zoomOptions = {}; - if (zoom['controls'] === undefined) { - zoomOptions.controls = false; - } else { - zoomOptions.controls = !!zoom['controls']; - } - if (zoom['wheel'] === undefined) { - zoomOptions.wheel = false; - } else { - zoomOptions.wheel = !!zoom['wheel']; - } - if (zoom['startScale'] === undefined) { - zoomOptions.startScale = 1; - } else { - zoomOptions.startScale = parseFloat(zoom['startScale']); - } - if (zoom['maxScale'] === undefined) { - zoomOptions.maxScale = 3; - } else { - zoomOptions.maxScale = parseFloat(zoom['maxScale']); - } - if (zoom['minScale'] === undefined) { - zoomOptions.minScale = 0.3; - } else { - zoomOptions.minScale = parseFloat(zoom['minScale']); - } - if (zoom['scaleSpeed'] === undefined) { - zoomOptions.scaleSpeed = 1.2; - } else { - zoomOptions.scaleSpeed = parseFloat(zoom['scaleSpeed']); - } - return zoomOptions; -}; - -/** - * Parse the user-specified grid options, using reasonable defaults where - * behaviour is unspecified. See grid documentation: - * https://developers.google.com/blockly/guides/configure/web/grid - * @param {!Object} options Dictionary of options. - * @return {!Object} A dictionary of normalized options. - * @private - */ -Blockly.Options.parseGridOptions_ = function(options) { - var grid = options['grid'] || {}; - var gridOptions = {}; - gridOptions.spacing = parseFloat(grid['spacing']) || 0; - gridOptions.colour = grid['colour'] || '#888'; - gridOptions.length = parseFloat(grid['length']) || 1; - gridOptions.snap = gridOptions.spacing > 0 && !!grid['snap']; - return gridOptions; -}; - -/** - * Parse the provided toolbox tree into a consistent DOM format. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - * @return {Node} DOM tree of blocks, or null. - */ -Blockly.Options.parseToolboxTree = function(tree) { - if (tree) { - if (typeof tree != 'string') { - if (typeof XSLTProcessor == 'undefined' && tree.outerHTML) { - // In this case the tree will not have been properly built by the - // browser. The HTML will be contained in the element, but it will - // not have the proper DOM structure since the browser doesn't support - // XSLTProcessor (XML -> HTML). This is the case in IE 9+. - tree = tree.outerHTML; - } else if (!(tree instanceof Element)) { - tree = null; - } - } - if (typeof tree == 'string') { - tree = Blockly.Xml.textToDom(tree); - } - } else { - tree = null; - } - return tree; -}; diff --git a/packages/scratch-blocks/core/procedures.js b/packages/scratch-blocks/core/procedures.js deleted file mode 100644 index 5c4f81ef2..000000000 --- a/packages/scratch-blocks/core/procedures.js +++ /dev/null @@ -1,577 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility functions for handling procedures. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.Procedures - * @namespace - **/ -goog.provide('Blockly.Procedures'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.constants'); -goog.require('Blockly.Events.BlockChange'); -goog.require('Blockly.Field'); -goog.require('Blockly.Names'); -goog.require('Blockly.Workspace'); - - -/** - * Constant to separate procedure names from variables and generated functions - * when running generators. - * @deprecated Use Blockly.PROCEDURE_CATEGORY_NAME - */ -Blockly.Procedures.NAME_TYPE = Blockly.PROCEDURE_CATEGORY_NAME; - -/** - * Find all user-created procedure definitions in a workspace. - * @param {!Blockly.Workspace} root Root workspace. - * @return {!Array.>} Pair of arrays, the - * first contains procedures without return variables, the second with. - * Each procedure is defined by a three-element list of name, parameter - * list, and return value boolean. - */ -Blockly.Procedures.allProcedures = function(root) { - var blocks = root.getAllBlocks(); - var proceduresReturn = []; - var proceduresNoReturn = []; - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].getProcedureDef) { - var tuple = blocks[i].getProcedureDef(); - if (tuple) { - if (tuple[2]) { - proceduresReturn.push(tuple); - } else { - proceduresNoReturn.push(tuple); - } - } - } - } - proceduresNoReturn.sort(Blockly.Procedures.procTupleComparator_); - proceduresReturn.sort(Blockly.Procedures.procTupleComparator_); - return [proceduresNoReturn, proceduresReturn]; -}; - -/** - * Find all user-created procedure definition mutations in a workspace. - * @param {!Blockly.Workspace} root Root workspace. - * @return {!Array.} Array of mutation xml elements. - * @package - */ -Blockly.Procedures.allProcedureMutations = function(root) { - var blocks = root.getAllBlocks(); - var mutations = []; - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].type == Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE) { - var mutation = blocks[i].mutationToDom(/* opt_generateShadows */ true); - if (mutation) { - mutations.push(mutation); - } - } - } - return mutations; -}; - -/** - * Sorts an array of procedure definition mutations alphabetically. - * (Does not mutate the given array.) - * @param {!Array.} mutations Array of mutation xml elements. - * @return {!Array.} Sorted array of mutation xml elements. - * @private - */ -Blockly.Procedures.sortProcedureMutations_ = function(mutations) { - var newMutations = mutations.slice(); - - newMutations.sort(function(a, b) { - var procCodeA = a.getAttribute('proccode'); - var procCodeB = b.getAttribute('proccode'); - - return Blockly.scratchBlocksUtils.compareStrings(procCodeA, procCodeB); - }); - - return newMutations; -}; - -/** - * Comparison function for case-insensitive sorting of the first element of - * a tuple. - * @param {!Array} ta First tuple. - * @param {!Array} tb Second tuple. - * @return {number} -1, 0, or 1 to signify greater than, equality, or less than. - * @private - */ -Blockly.Procedures.procTupleComparator_ = function(ta, tb) { - return Blockly.scratchBlocksUtils.compareStrings(ta[0], tb[0]); -}; - -/** - * Ensure two identically-named procedures don't exist. - * @param {string} name Proposed procedure name. - * @param {!Blockly.Block} block Block to disambiguate. - * @return {string} Non-colliding name. - */ -Blockly.Procedures.findLegalName = function(name, block) { - if (block.isInFlyout) { - // Flyouts can have multiple procedures called 'do something'. - return name; - } - while (!Blockly.Procedures.isLegalName_(name, block.workspace, block)) { - // Collision with another procedure. - var r = name.match(/^(.*?)(\d+)$/); - if (!r) { - name += '2'; - } else { - name = r[1] + (parseInt(r[2], 10) + 1); - } - } - return name; -}; - -/** - * Does this procedure have a legal name? Illegal names include names of - * procedures already defined. - * @param {string} name The questionable name. - * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. - * @param {Blockly.Block=} opt_exclude Optional block to exclude from - * comparisons (one doesn't want to collide with oneself). - * @return {boolean} True if the name is legal. - * @private - */ -Blockly.Procedures.isLegalName_ = function(name, workspace, opt_exclude) { - return !Blockly.Procedures.isNameUsed(name, workspace, opt_exclude); -}; - -/** - * Return if the given name is already a procedure name. - * @param {string} name The questionable name. - * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. - * @param {Blockly.Block=} opt_exclude Optional block to exclude from - * comparisons (one doesn't want to collide with oneself). - * @return {boolean} True if the name is used, otherwise return false. - */ -Blockly.Procedures.isNameUsed = function(name, workspace, opt_exclude) { - var blocks = workspace.getAllBlocks(); - // Iterate through every block and check the name. - for (var i = 0; i < blocks.length; i++) { - if (blocks[i] == opt_exclude) { - continue; - } - if (blocks[i].getProcedureDef) { - var procName = blocks[i].getProcedureDef(); - if (Blockly.Names.equals(procName[0], name)) { - return false; - } - } - } - return true; -}; - -/** - * Rename a procedure. Called by the editable field. - * @param {string} name The proposed new name. - * @return {string} The accepted name. - * @this {Blockly.Field} - */ -Blockly.Procedures.rename = function(name) { - // Strip leading and trailing whitespace. Beyond this, all names are legal. - name = name.replace(/^[\s\xa0]+|[\s\xa0]+$/g, ''); - - // Ensure two identically-named procedures don't exist. - var legalName = Blockly.Procedures.findLegalName(name, this.sourceBlock_); - var oldName = this.text_; - if (oldName != name && oldName != legalName) { - // Rename any callers. - var blocks = this.sourceBlock_.workspace.getAllBlocks(); - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].renameProcedure) { - blocks[i].renameProcedure(oldName, legalName); - } - } - } - return legalName; -}; - -/** - * Construct the blocks required by the flyout for the procedure category. - * @param {!Blockly.Workspace} workspace The workspace contianing procedures. - * @return {!Array.} Array of XML block elements. - */ -Blockly.Procedures.flyoutCategory = function(workspace) { - var xmlList = []; - - Blockly.Procedures.addCreateButton_(workspace, xmlList); - - // Create call blocks for each procedure defined in the workspace - var mutations = Blockly.Procedures.allProcedureMutations(workspace); - mutations = Blockly.Procedures.sortProcedureMutations_(mutations); - for (var i = 0; i < mutations.length; i++) { - var mutation = mutations[i]; - // - // - // - var block = goog.dom.createDom('block'); - block.setAttribute('type', 'procedures_call'); - block.setAttribute('gap', 16); - block.appendChild(mutation); - xmlList.push(block); - } - return xmlList; -}; - -/** - * Create the "Make a Block..." button. - * @param {!Blockly.Workspace} workspace The workspace contianing procedures. - * @param {!Array.} xmlList Array of XML block elements to add to. - * @private - */ -Blockly.Procedures.addCreateButton_ = function(workspace, xmlList) { - var button = goog.dom.createDom('button'); - var msg = Blockly.Msg.NEW_PROCEDURE; - var callbackKey = 'CREATE_PROCEDURE'; - var callback = function() { - Blockly.Procedures.createProcedureDefCallback_(workspace); - }; - button.setAttribute('text', msg); - button.setAttribute('callbackKey', callbackKey); - workspace.registerButtonCallback(callbackKey, callback); - xmlList.push(button); -}; - -/** - * Find all callers of a named procedure. - * @param {string} name Name of procedure (procCode in scratch-blocks). - * @param {!Blockly.Workspace} ws The workspace to find callers in. - * @param {!Blockly.Block} definitionRoot The root of the stack where the - * procedure is defined. - * @param {boolean} allowRecursive True if the search should include recursive - * procedure calls. False if the search should ignore the stack starting - * with definitionRoot. - * @return {!Array.} Array of caller blocks. - * @package - */ -Blockly.Procedures.getCallers = function(name, ws, definitionRoot, - allowRecursive) { - var allBlocks = []; - var topBlocks = ws.getTopBlocks(); - - // Start by deciding which stacks to investigate. - for (var i = 0; i < topBlocks.length; i++) { - var block = topBlocks[i]; - if (block.id == definitionRoot.id && !allowRecursive) { - continue; - } - allBlocks.push.apply(allBlocks, block.getDescendants(false)); - } - - var callers = []; - for (var i = 0; i < allBlocks.length; i++) { - var block = allBlocks[i]; - if (block.type == Blockly.PROCEDURES_CALL_BLOCK_TYPE ) { - var procCode = block.getProcCode(); - if (procCode && procCode == name) { - callers.push(block); - } - } - } - return callers; -}; - -/** - * Find and edit all callers with a procCode using a new mutation. - * @param {string} name Name of procedure (procCode in scratch-blocks). - * @param {!Blockly.Workspace} ws The workspace to find callers in. - * @param {!Element} mutation New mutation for the callers. - * @package - */ -Blockly.Procedures.mutateCallersAndPrototype = function(name, ws, mutation) { - var defineBlock = Blockly.Procedures.getDefineBlock(name, ws); - var prototypeBlock = Blockly.Procedures.getPrototypeBlock(name, ws); - if (defineBlock && prototypeBlock) { - var callers = Blockly.Procedures.getCallers(name, - defineBlock.workspace, defineBlock, true /* allowRecursive */); - callers.push(prototypeBlock); - Blockly.Events.setGroup(true); - for (var i = 0, caller; caller = callers[i]; i++) { - var oldMutationDom = caller.mutationToDom(); - var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom); - caller.domToMutation(mutation); - var newMutationDom = caller.mutationToDom(); - var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); - if (oldMutation != newMutation) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - caller, 'mutation', null, oldMutation, newMutation)); - } - } - Blockly.Events.setGroup(false); - } else { - alert('No define block on workspace'); // TODO decide what to do about this. - } -}; - -/** - * Find the definition block for the named procedure. - * @param {string} procCode The identifier of the procedure. - * @param {!Blockly.Workspace} workspace The workspace to search. - * @return {Blockly.Block} The procedure definition block, or null not found. - * @package - */ -Blockly.Procedures.getDefineBlock = function(procCode, workspace) { - // Assume that a procedure definition is a top block. - var blocks = workspace.getTopBlocks(false); - for (var i = 0; i < blocks.length; i++) { - if (blocks[i].type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE) { - var prototypeBlock = blocks[i].getInput('custom_block').connection.targetBlock(); - if (prototypeBlock.getProcCode && prototypeBlock.getProcCode() == procCode) { - return blocks[i]; - } - } - } - return null; -}; - -/** - * Find the prototype block for the named procedure. - * @param {string} procCode The identifier of the procedure. - * @param {!Blockly.Workspace} workspace The workspace to search. - * @return {Blockly.Block} The procedure prototype block, or null not found. - * @package - */ -Blockly.Procedures.getPrototypeBlock = function(procCode, workspace) { - var defineBlock = Blockly.Procedures.getDefineBlock(procCode, workspace); - if (defineBlock) { - return defineBlock.getInput('custom_block').connection.targetBlock(); - } - return null; -}; - -/** - * Create a mutation for a brand new custom procedure. - * @return {Element} The mutation for a new custom procedure - * @package - */ -Blockly.Procedures.newProcedureMutation = function() { - var mutationText = '' + - '' + - '' + - ''; - return Blockly.Xml.textToDom(mutationText).firstChild; -}; - -/** - * Callback to create a new procedure custom command block. - * @param {!Blockly.Workspace} workspace The workspace to create the new procedure on. - * @private - */ -Blockly.Procedures.createProcedureDefCallback_ = function(workspace) { - Blockly.Procedures.externalProcedureDefCallback( - Blockly.Procedures.newProcedureMutation(), - Blockly.Procedures.createProcedureCallbackFactory_(workspace) - ); -}; - -/** - * Callback factory for adding a new custom procedure from a mutation. - * @param {!Blockly.Workspace} workspace The workspace to create the new procedure on. - * @return {function(?Element)} callback for creating the new custom procedure. - * @private - */ -Blockly.Procedures.createProcedureCallbackFactory_ = function(workspace) { - return function(mutation) { - if (mutation) { - var blockText = '' + - '' + - '' + - '' + - Blockly.Xml.domToText(mutation) + - '' + - '' + - '' + - ''; - var blockDom = Blockly.Xml.textToDom(blockText).firstChild; - Blockly.Events.setGroup(true); - var block = Blockly.Xml.domToBlock(blockDom, workspace); - var scale = workspace.scale; // To convert from pixel units to workspace units - // Position the block so that it is at the top left of the visible workspace, - // padded from the edge by 30 units. Position in the top right if RTL. - var posX = -workspace.scrollX; - if (workspace.RTL) { - posX += workspace.getMetrics().contentWidth - 30; - } else { - posX += 30; - } - block.moveBy(posX / scale, (-workspace.scrollY + 30) / scale); - block.scheduleSnapAndBump(); - Blockly.Events.setGroup(false); - } - }; -}; - -/** - * Callback to open the modal for editing custom procedures. - * @param {!Blockly.Block} block The block that was right-clicked. - * @private - */ -Blockly.Procedures.editProcedureCallback_ = function(block) { - // Edit can come from one of three block types (call, define, prototype) - // Normalize by setting the block to the prototype block for the procedure. - if (block.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE) { - var input = block.getInput('custom_block'); - if (!input) { - alert('Bad input'); // TODO: Decide what to do about this. - return; - } - var conn = input.connection; - if (!conn) { - alert('Bad connection'); // TODO: Decide what to do about this. - return; - } - var innerBlock = conn.targetBlock(); - if (!innerBlock || - !innerBlock.type == Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE) { - alert('Bad inner block'); // TODO: Decide what to do about this. - return; - } - block = innerBlock; - } else if (block.type == Blockly.PROCEDURES_CALL_BLOCK_TYPE) { - // This is a call block, find the prototype corresponding to the procCode. - // Make sure to search the correct workspace, call block can be in flyout. - var workspaceToSearch = block.workspace.isFlyout ? - block.workspace.targetWorkspace : block.workspace; - block = Blockly.Procedures.getPrototypeBlock( - block.getProcCode(), workspaceToSearch); - } - // Block now refers to the procedure prototype block, it is safe to proceed. - Blockly.Procedures.externalProcedureDefCallback( - block.mutationToDom(), - Blockly.Procedures.editProcedureCallbackFactory_(block) - ); -}; - -/** - * Callback factory for editing an existing custom procedure. - * @param {!Blockly.Block} block The procedure prototype block being edited. - * @return {function(?Element)} Callback for editing the custom procedure. - * @private - */ -Blockly.Procedures.editProcedureCallbackFactory_ = function(block) { - return function(mutation) { - if (mutation) { - Blockly.Procedures.mutateCallersAndPrototype(block.getProcCode(), - block.workspace, mutation); - } - }; -}; - -/** - * Callback to create a new procedure custom command block. - * @public - */ -Blockly.Procedures.externalProcedureDefCallback = function(/** mutator, callback */) { - alert('External procedure editor must be override Blockly.Procedures.externalProcedureDefCallback'); -}; - -/** - * Make a context menu option for editing a custom procedure. - * This appears in the context menu for procedure definitions and procedure - * calls. - * @param {!Blockly.BlockSvg} block The block where the right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.Procedures.makeEditOption = function(block) { - var editOption = { - enabled: true, - text: Blockly.Msg.EDIT_PROCEDURE, - callback: function() { - Blockly.Procedures.editProcedureCallback_(block); - } - }; - return editOption; -}; - -/** - * Callback to show the procedure definition corresponding to a custom command - * block. - * TODO(#1136): Implement. - * @param {!Blockly.Block} block The block that was right-clicked. - * @private - */ -Blockly.Procedures.showProcedureDefCallback_ = function(block) { - alert('TODO(#1136): implement showing procedure definition (procCode was "' + - block.procCode_ + '")'); -}; - -/** - * Make a context menu option for showing the definition for a custom procedure, - * based on a right-click on a custom command block. - * @param {!Blockly.BlockSvg} block The block where the right-click originated. - * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package - */ -Blockly.Procedures.makeShowDefinitionOption = function(block) { - var option = { - enabled: true, - text: Blockly.Msg.SHOW_PROCEDURE_DEFINITION, - callback: function() { - Blockly.Procedures.showProcedureDefCallback_(block); - } - }; - return option; -}; - -/** - * Callback to try to delete a custom block definitions. - * @param {string} procCode The identifier of the procedure to delete. - * @param {!Blockly.Block} definitionRoot The root block of the stack that - * defines the custom procedure. - * @return {boolean} True if the custom procedure was deleted, false otherwise. - * @package - */ -Blockly.Procedures.deleteProcedureDefCallback = function(procCode, - definitionRoot) { - var callers = Blockly.Procedures.getCallers(procCode, - definitionRoot.workspace, definitionRoot, false /* allowRecursive */); - if (callers.length > 0) { - return false; - } - - var workspace = definitionRoot.workspace; - - // Delete the whole stack. - Blockly.Events.setGroup(true); - definitionRoot.dispose(); - Blockly.Events.setGroup(false); - - // TODO (#1354) Update this function when '_' is removed - // Refresh toolbox, so caller doesn't appear there anymore - workspace.refreshToolboxSelection_(); - - return true; -}; diff --git a/packages/scratch-blocks/core/rendered_connection.js b/packages/scratch-blocks/core/rendered_connection.js deleted file mode 100644 index 2d56842a5..000000000 --- a/packages/scratch-blocks/core/rendered_connection.js +++ /dev/null @@ -1,417 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Components for creating connections between blocks. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.RenderedConnection'); - -goog.require('Blockly.Connection'); - - -/** - * Class for a connection between blocks that may be rendered on screen. - * @param {!Blockly.Block} source The block establishing this connection. - * @param {number} type The type of the connection. - * @extends {Blockly.Connection} - * @constructor - */ -Blockly.RenderedConnection = function(source, type) { - Blockly.RenderedConnection.superClass_.constructor.call(this, source, type); - - /** - * Workspace units, (0, 0) is top left of block. - * @type {!goog.math.Coordinate} - * @private - */ - this.offsetInBlock_ = new goog.math.Coordinate(0, 0); -}; -goog.inherits(Blockly.RenderedConnection, Blockly.Connection); - -/** - * Returns the distance between this connection and another connection in - * workspace units. - * @param {!Blockly.Connection} otherConnection The other connection to measure - * the distance to. - * @return {number} The distance between connections, in workspace units. - */ -Blockly.RenderedConnection.prototype.distanceFrom = function(otherConnection) { - var xDiff = this.x_ - otherConnection.x_; - var yDiff = this.y_ - otherConnection.y_; - return Math.sqrt(xDiff * xDiff + yDiff * yDiff); -}; - -/** - * Move the block(s) belonging to the connection to a point where they don't - * visually interfere with the specified connection. - * @param {!Blockly.Connection} staticConnection The connection to move away - * from. - * @private - */ -Blockly.RenderedConnection.prototype.bumpAwayFrom_ = function(staticConnection) { - if (this.sourceBlock_.workspace.isDragging()) { - // Don't move blocks around while the user is doing the same. - return; - } - // Move the root block. - var rootBlock = this.sourceBlock_.getRootBlock(); - if (rootBlock.isInFlyout) { - // Don't move blocks around in a flyout. - return; - } - var reverse = false; - if (!rootBlock.isMovable()) { - // Can't bump an uneditable block away. - // Check to see if the other block is movable. - rootBlock = staticConnection.getSourceBlock().getRootBlock(); - if (!rootBlock.isMovable()) { - return; - } - // Swap the connections and move the 'static' connection instead. - staticConnection = this; - reverse = true; - } - // Raise it to the top for extra visibility. - var selected = Blockly.selected == rootBlock; - selected || rootBlock.addSelect(); - var dx = (staticConnection.x_ + Blockly.SNAP_RADIUS) - this.x_; - var dy = (staticConnection.y_ + Blockly.SNAP_RADIUS) - this.y_; - if (reverse) { - // When reversing a bump due to an uneditable block, bump up. - dy = -dy; - } - if (rootBlock.RTL) { - dx = -dx; - } - rootBlock.moveBy(dx, dy); - selected || rootBlock.removeSelect(); -}; - -/** - * Change the connection's coordinates. - * @param {number} x New absolute x coordinate, in workspace coordinates. - * @param {number} y New absolute y coordinate, in workspace coordinates. - */ -Blockly.RenderedConnection.prototype.moveTo = function(x, y) { - // Remove it from its old location in the database (if already present) - if (this.inDB_) { - this.db_.removeConnection_(this); - } - this.x_ = x; - this.y_ = y; - // Insert it into its new location in the database. - if (!this.hidden_) { - this.db_.addConnection(this); - } -}; - -/** - * Change the connection's coordinates. - * @param {number} dx Change to x coordinate, in workspace units. - * @param {number} dy Change to y coordinate, in workspace units. - */ -Blockly.RenderedConnection.prototype.moveBy = function(dx, dy) { - this.moveTo(this.x_ + dx, this.y_ + dy); -}; - -/** - * Move this connection to the location given by its offset within the block and - * the location of the block's top left corner. - * @param {!goog.math.Coordinate} blockTL The location of the top left corner - * of the block, in workspace coordinates. - */ -Blockly.RenderedConnection.prototype.moveToOffset = function(blockTL) { - this.moveTo(blockTL.x + this.offsetInBlock_.x, - blockTL.y + this.offsetInBlock_.y); -}; - -/** - * Set the offset of this connection relative to the top left of its block. - * @param {number} x The new relative x, in workspace units. - * @param {number} y The new relative y, in workspace units. - */ -Blockly.RenderedConnection.prototype.setOffsetInBlock = function(x, y) { - this.offsetInBlock_.x = x; - this.offsetInBlock_.y = y; -}; - -/** - * Move the blocks on either side of this connection right next to each other. - * @private - */ -Blockly.RenderedConnection.prototype.tighten_ = function() { - var dx = this.targetConnection.x_ - this.x_; - var dy = this.targetConnection.y_ - this.y_; - if (dx != 0 || dy != 0) { - var block = this.targetBlock(); - var svgRoot = block.getSvgRoot(); - if (!svgRoot) { - throw 'block is not rendered.'; - } - // Workspace coordinates. - var xy = Blockly.utils.getRelativeXY(svgRoot); - block.getSvgRoot().setAttribute('transform', - 'translate(' + (xy.x - dx) + ',' + (xy.y - dy) + ')'); - block.moveConnections_(-dx, -dy); - } -}; - -/** - * Find the closest compatible connection to this connection. - * All parameters are in workspace units. - * @param {number} maxLimit The maximum radius to another connection. - * @param {!goog.math.Coordinate} dxy Offset between this connection's location - * in the database and the current location (as a result of dragging). - * @return {!{connection: ?Blockly.Connection, radius: number}} Contains two - * properties: 'connection' which is either another connection or null, - * and 'radius' which is the distance. - */ -Blockly.RenderedConnection.prototype.closest = function(maxLimit, dxy) { - return this.dbOpposite_.searchForClosest(this, maxLimit, dxy); -}; - -/** - * Add highlighting around this connection. - */ -Blockly.RenderedConnection.prototype.highlight = function() { - var steps; - steps = 'm -20,0 h 5 ' + Blockly.BlockSvg.NOTCH_PATH_LEFT + ' h 5'; - var xy = this.sourceBlock_.getRelativeToSurfaceXY(); - var x = this.x_ - xy.x; - var y = this.y_ - xy.y; - Blockly.Connection.highlightedPath_ = Blockly.utils.createSvgElement( - 'path', - { - 'class': 'blocklyHighlightedConnectionPath', - 'd': steps, - transform: 'translate(' + x + ',' + y + ')' + - (this.sourceBlock_.RTL ? ' scale(-1 1)' : '') - }, - this.sourceBlock_.getSvgRoot()); -}; - -/** - * Unhide this connection, as well as all down-stream connections on any block - * attached to this connection. This happens when a block is expanded. - * Also unhides down-stream comments. - * @return {!Array.} List of blocks to render. - */ -Blockly.RenderedConnection.prototype.unhideAll = function() { - this.setHidden(false); - // All blocks that need unhiding must be unhidden before any rendering takes - // place, since rendering requires knowing the dimensions of lower blocks. - // Also, since rendering a block renders all its parents, we only need to - // render the leaf nodes. - var renderList = []; - if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { - // Only spider down. - return renderList; - } - var block = this.targetBlock(); - if (block) { - var connections; - if (block.isCollapsed()) { - // This block should only be partially revealed since it is collapsed. - connections = []; - block.outputConnection && connections.push(block.outputConnection); - block.nextConnection && connections.push(block.nextConnection); - block.previousConnection && connections.push(block.previousConnection); - } else { - // Show all connections of this block. - connections = block.getConnections_(true); - } - for (var i = 0; i < connections.length; i++) { - renderList.push.apply(renderList, connections[i].unhideAll()); - } - if (!renderList.length) { - // Leaf block. - renderList[0] = block; - } - } - return renderList; -}; - -/** - * Remove the highlighting around this connection. - */ -Blockly.RenderedConnection.prototype.unhighlight = function() { - goog.dom.removeNode(Blockly.Connection.highlightedPath_); - delete Blockly.Connection.highlightedPath_; -}; - -/** - * Set whether this connections is hidden (not tracked in a database) or not. - * @param {boolean} hidden True if connection is hidden. - */ -Blockly.RenderedConnection.prototype.setHidden = function(hidden) { - this.hidden_ = hidden; - if (hidden && this.inDB_) { - this.db_.removeConnection_(this); - } else if (!hidden && !this.inDB_) { - this.db_.addConnection(this); - } -}; - -/** - * Hide this connection, as well as all down-stream connections on any block - * attached to this connection. This happens when a block is collapsed. - * Also hides down-stream comments. - */ -Blockly.RenderedConnection.prototype.hideAll = function() { - this.setHidden(true); - if (this.targetConnection) { - var blocks = this.targetBlock().getDescendants(false); - for (var i = 0; i < blocks.length; i++) { - var block = blocks[i]; - // Hide all connections of all children. - var connections = block.getConnections_(true); - for (var j = 0; j < connections.length; j++) { - connections[j].setHidden(true); - } - // Close all bubbles of all children. - var icons = block.getIcons(); - for (var j = 0; j < icons.length; j++) { - icons[j].setVisible(false); - } - } - } -}; - -/** - * Check if the two connections can be dragged to connect to each other. - * @param {!Blockly.Connection} candidate A nearby connection to check. - * @param {number} maxRadius The maximum radius allowed for connections, in - * workspace units. - * @return {boolean} True if the connection is allowed, false otherwise. - */ -Blockly.RenderedConnection.prototype.isConnectionAllowed = function(candidate, - maxRadius) { - if (this.distanceFrom(candidate) > maxRadius) { - return false; - } - - return Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this, - candidate); -}; - -/** - * Disconnect two blocks that are connected by this connection. - * @param {!Blockly.Block} parentBlock The superior block. - * @param {!Blockly.Block} childBlock The inferior block. - * @private - */ -Blockly.RenderedConnection.prototype.disconnectInternal_ = function(parentBlock, - childBlock) { - Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this, - parentBlock, childBlock); - // Rerender the parent so that it may reflow. - if (parentBlock.rendered) { - parentBlock.render(); - } - if (childBlock.rendered) { - childBlock.updateDisabled(); - childBlock.render(); - } -}; - -/** - * Respawn the shadow block if there was one connected to the this connection. - * Render/rerender blocks as needed. - * @private - */ -Blockly.RenderedConnection.prototype.respawnShadow_ = function() { - var parentBlock = this.getSourceBlock(); - // Respawn the shadow block if there is one. - var shadow = this.getShadowDom(); - if (parentBlock.workspace && shadow && Blockly.Events.recordUndo) { - Blockly.RenderedConnection.superClass_.respawnShadow_.call(this); - var blockShadow = this.targetBlock(); - if (!blockShadow) { - throw 'Couldn\'t respawn the shadow block that should exist here.'; - } - blockShadow.initSvg(); - blockShadow.render(false); - if (parentBlock.rendered) { - parentBlock.render(); - } - } -}; - -/** - * Find all nearby compatible connections to this connection. - * Type checking does not apply, since this function is used for bumping. - * @param {number} maxLimit The maximum radius to another connection, in - * workspace units. - * @return {!Array.} List of connections. - * @private - */ -Blockly.RenderedConnection.prototype.neighbours_ = function(maxLimit) { - return this.dbOpposite_.getNeighbours(this, maxLimit); -}; - -/** - * Connect two connections together. This is the connection on the superior - * block. Rerender blocks as needed. - * @param {!Blockly.Connection} childConnection Connection on inferior block. - * @private - */ -Blockly.RenderedConnection.prototype.connect_ = function(childConnection) { - Blockly.RenderedConnection.superClass_.connect_.call(this, childConnection); - - var parentConnection = this; - var parentBlock = parentConnection.getSourceBlock(); - var childBlock = childConnection.getSourceBlock(); - - if (parentBlock.rendered) { - parentBlock.updateDisabled(); - } - if (childBlock.rendered) { - childBlock.updateDisabled(); - } - if (parentBlock.rendered && childBlock.rendered) { - if (parentConnection.type == Blockly.NEXT_STATEMENT || - parentConnection.type == Blockly.PREVIOUS_STATEMENT) { - // Child block may need to square off its corners if it is in a stack. - // Rendering a child will render its parent. - childBlock.render(); - } else { - // Child block does not change shape. Rendering the parent node will - // move its connected children into position. - parentBlock.render(); - } - } -}; - -/** - * Function to be called when this connection's compatible types have changed. - * @private - */ -Blockly.RenderedConnection.prototype.onCheckChanged_ = function() { - // The new value type may not be compatible with the existing connection. - if (this.isConnected() && !this.checkType_(this.targetConnection)) { - var child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_; - child.unplug(); - // Bump away. - this.sourceBlock_.bumpNeighbours_(); - } -}; diff --git a/packages/scratch-blocks/core/scratch_block_comment.js b/packages/scratch-blocks/core/scratch_block_comment.js deleted file mode 100644 index bb60524e6..000000000 --- a/packages/scratch-blocks/core/scratch_block_comment.js +++ /dev/null @@ -1,653 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a code comment. - * @author kchadha@scratch.mit.edu (Karishma Chadha) - */ -'use strict'; - -goog.provide('Blockly.ScratchBlockComment'); - -goog.require('Blockly.Comment'); -goog.require('Blockly.Events.BlockChange'); -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.Icon'); -goog.require('Blockly.ScratchBubble'); - -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); - - -/** - * Class for a comment. - * @param {!Blockly.Block} block The block associated with this comment. - * @param {string} text The text content of this comment. - * @param {string=} id Optional uid for comment; a new one will be generated if - * not provided. - * @param {number=} x Initial x position for comment, in workspace coordinates. - * @param {number=} y Initial y position for comment, in workspace coordinates. - * @param {boolean=} minimized Whether or not this comment is minimized - * (only the top bar displays), defaults to false. - * @extends {Blockly.Comment} - * @constructor - */ -Blockly.ScratchBlockComment = function(block, text, id, x, y, minimized) { - Blockly.ScratchBlockComment.superClass_.constructor.call(this, block); - /** - * The text content of this comment. - * @type {string} - * @private - */ - this.text_ = text; - - var xIsValidNumber = typeof x == 'number' && !isNaN(x); - var yIsValidNumber = typeof y == 'number' && !isNaN(y); - - /** - * Whether this comment needs to be auto-positioned (based on provided values - * for x and y position). - * @type {boolean} - * @private - */ - this.needsAutoPositioning_ = !xIsValidNumber && !yIsValidNumber; - // If both of the given x and y params are invalid, this comment needs to be auto positioned. - - /** - * The x position of this comment in workspace coordinates. Default to 0 if - * x position is not provided or is not a valid number. - * @type {number} - * @private - */ - this.x_ = xIsValidNumber ? x : 0; - /** - * The y position of this comment in workspace coordinates. Default to 0 if - * y position is not provided or is not a valid number. - * @type {number} - * @private - */ - this.y_ = yIsValidNumber ? y : 0; - /** - * Whether this comment is minimized. - * @type {boolean} - * @private - */ - this.isMinimized_ = minimized || false; - - /** - * The workspace this comment belongs to. - * @type {Blockly.Workspace} - * @package - */ - this.workspace = block.workspace; - /** - * The unique identifier for this comment. - * @type {string} - * @package - */ - this.id = goog.isString(id) && !this.workspace.getCommentById(id) ? - id : Blockly.utils.genUid(); - this.workspace.addTopComment(this); - - /** - * The id of the block this comment belongs to. - * @type {string} - * @package - */ - this.blockId = block.id; - - if (!block.rendered) { - Blockly.ScratchBlockComment.fireCreateEvent(this); - } - // If the block is rendered, fire event the create event when the comment is made - // visible -}; -goog.inherits(Blockly.ScratchBlockComment, Blockly.Comment); - -/** - * Width of bubble. - * @private - */ -Blockly.ScratchBlockComment.prototype.width_ = 200; - -/** - * Height of bubble. - * @private - */ -Blockly.ScratchBlockComment.prototype.height_ = 200; - -/** - * Comment Icon Size. - * @package - */ -Blockly.ScratchBlockComment.prototype.SIZE = 0; - -/** - * Offset for text area in comment bubble. - * @private - */ -Blockly.ScratchBlockComment.TEXTAREA_OFFSET = 12; - -/** - * Maximum lable length (actual label length will include - * one additional character, the ellipsis). - * @private - */ -Blockly.ScratchBlockComment.MAX_LABEL_LENGTH = 12; - -/** - * Maximum character length for comment text. - * @private - */ -Blockly.ScratchBlockComment.COMMENT_TEXT_LIMIT = 8000; - -/** - * Width that a minimized comment should have. - * @private - */ -Blockly.ScratchBlockComment.MINIMIZE_WIDTH = 200; - -/** - * Draw the comment icon. - * @param {!Element} _group The icon group. - * @private - */ -Blockly.ScratchBlockComment.prototype.drawIcon_ = function(_group) { - // NO-OP -- Don't render a comment icon for Scratch block comments -}; - -// Override renderIcon from Blocky.Icon so that the comment bubble is -// anchored correctly on the block. This function takes in the top margin -// as an input instead of setting an arbitrary one. -/** - * Render the icon. - * @param {number} cursorX Horizontal offset at which to position the icon. - * @param {number} topMargin Vertical offset from the top of the block to position the icon. - * @return {number} Horizontal offset for next item to draw. - * @package - */ -Blockly.ScratchBlockComment.prototype.renderIcon = function(cursorX, topMargin) { - if (this.collapseHidden && this.block_.isCollapsed()) { - this.iconGroup_.setAttribute('display', 'none'); - return cursorX; - } - this.iconGroup_.setAttribute('display', 'block'); - - var width = this.SIZE; - if (this.block_.RTL) { - cursorX -= width; - } - this.iconGroup_.setAttribute('transform', - 'translate(' + cursorX + ',' + topMargin + ')'); - this.computeIconLocation(); - if (this.block_.RTL) { - cursorX -= Blockly.BlockSvg.SEP_SPACE_X; - } else { - cursorX += width + Blockly.BlockSvg.SEP_SPACE_X; - } - return cursorX; -}; - -/** - * Create the editor for the comment's bubble. - * @return {{commentEditor: !Element, labelText: !string}} The components used - * to render the comment editing/writing area and the truncated label text - * to display in the minimized comment top bar. - * @private - */ -Blockly.ScratchBlockComment.prototype.createEditor_ = function() { - this.foreignObject_ = Blockly.utils.createSvgElement('foreignObject', - { - 'x': Blockly.ScratchBubble.BORDER_WIDTH, - 'y': Blockly.ScratchBubble.BORDER_WIDTH + Blockly.ScratchBubble.TOP_BAR_HEIGHT, - 'class': 'scratchCommentForeignObject' - }, - null); - var body = document.createElementNS(Blockly.HTML_NS, 'body'); - body.setAttribute('xmlns', Blockly.HTML_NS); - body.className = 'blocklyMinimalBody scratchCommentBody'; - var textarea = document.createElementNS(Blockly.HTML_NS, 'textarea'); - textarea.className = 'scratchCommentTextarea scratchCommentText'; - textarea.setAttribute('dir', this.block_.RTL ? 'RTL' : 'LTR'); - textarea.setAttribute('maxlength', Blockly.ScratchBlockComment.COMMENT_TEXT_LIMIT); - textarea.setAttribute('placeholder', Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT); - body.appendChild(textarea); - this.textarea_ = textarea; - this.textarea_.style.margin = (Blockly.ScratchBlockComment.TEXTAREA_OFFSET) + 'px'; - this.foreignObject_.appendChild(body); - Blockly.bindEventWithChecks_(textarea, 'mousedown', this, - this.textareaFocus_, true, true); // noCapture and do not prevent default - // Don't zoom with mousewheel. - Blockly.bindEventWithChecks_(textarea, 'wheel', this, function(e) { - e.stopPropagation(); - }); - Blockly.bindEventWithChecks_(textarea, 'change', this, function(_e) { - if (this.text_ != textarea.value) { - Blockly.Events.fire(new Blockly.Events.CommentChange( - this, {text: this.text_}, {text: textarea.value})); - this.text_ = textarea.value; - } - }); - - // Label for comment top bar when comment is minimized - this.label_ = this.getLabelText(); - - return { - commentEditor: this.foreignObject_, - labelText: this.label_ - }; -}; - -/** - * Handle text area click, make sure to stop propagation to allow default selection behavior. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.ScratchBlockComment.prototype.textareaFocus_ = function(e) { - Blockly.ScratchBlockComment.superClass_.textareaFocus_.call(this, e); - // Stop event from propagating to the workspace to make sure preventDefault _is not called_. - e.stopPropagation(); -}; - - -/** - * Callback function triggered when the bubble has resized. - * Resize the text area accordingly. - * @private - */ -Blockly.ScratchBlockComment.prototype.resizeBubble_ = function() { - if (this.isVisible() && !this.isMinimized_) { - var size = this.bubble_.getBubbleSize(); - var doubleBorderWidth = 2 * Blockly.ScratchBubble.BORDER_WIDTH; - var textOffset = Blockly.ScratchBlockComment.TEXTAREA_OFFSET * 2; - this.foreignObject_.setAttribute('width', size.width - doubleBorderWidth); - this.foreignObject_.setAttribute('height', size.height - doubleBorderWidth - Blockly.ScratchBubble.TOP_BAR_HEIGHT); - this.textarea_.style.width = (size.width - textOffset) + 'px'; - this.textarea_.style.height = (size.height - doubleBorderWidth - - Blockly.ScratchBubble.TOP_BAR_HEIGHT - textOffset) + 'px'; - - // Actually set the size! - this.width_ = size.width; - this.height_ = size.height; - } -}; - -/** - * Change the colour of the associated bubble to match its block. - * @package - */ -Blockly.ScratchBlockComment.prototype.updateColour = function() { - if (this.isVisible()) { - this.bubble_.setColour(this.block_.getColourTertiary()); - } -}; - -/** - * Auto position this comment given information about the block that owns this - * comment and the comment state, if this block needs auto positioning. - * @private - */ -Blockly.ScratchBlockComment.prototype.autoPosition_ = function() { - if (!this.needsAutoPositioning_) return; - if (this.isMinimized_) { - var minimizedOffset = 4 * Blockly.BlockSvg.GRID_UNIT; - this.x_ = this.block_.RTL ? - this.iconXY_.x - this.getBubbleSize().width - minimizedOffset : - this.iconXY_.x + minimizedOffset; - this.y_ = this.iconXY_.y - (Blockly.ScratchBubble.TOP_BAR_HEIGHT / 2); - } else { - // Position comment so that the expanded bubble does not overlap - // blocks below it in the stack that are wider than this block - // Overhang is the difference between this blocks trailing edge and - // the largest block below (zero if this block is the widest) - var thisBlockWidth = Math.floor(this.block_.svgPath_.getBBox().width); - var fullStackWidth = Math.floor(this.block_.getHeightWidth().width); - var overhang = fullStackWidth - thisBlockWidth; - var offset = 8 * Blockly.BlockSvg.GRID_UNIT; - this.x_ = this.block_.RTL ? - this.iconXY_.x - this.width_ - overhang - offset : - this.iconXY_.x + overhang + offset; - this.y_ = this.iconXY_.y - (Blockly.ScratchBubble.TOP_BAR_HEIGHT / 2); - } -}; - -/** - * Show or hide the comment bubble. - * @param {boolean} visible True if the bubble should be visible. - * @package - */ -Blockly.ScratchBlockComment.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - // No change. - return; - } - if ((!this.block_.isEditable() && !this.textarea_) || goog.userAgent.IE) { - // Steal the code from warnings to make an uneditable text bubble. - // MSIE does not support foreignobject; textareas are impossible. - // http://msdn.microsoft.com/en-us/library/hh834675%28v=vs.85%29.aspx - // Always treat comments in IE as uneditable. - Blockly.Warning.prototype.setVisible.call(this, visible); - return; - } - // Save the bubble stats before the visibility switch. - var text = this.getText(); - var size = this.getBubbleSize(); - if (visible) { - // Auto position this comment, if necessary. - if (this.needsAutoPositioning_) { - this.autoPosition_(); - // This comment has been auto-positioned so reset the flag - this.needsAutoPositioning_ = false; - } - - // Create the bubble. - this.bubble_ = new Blockly.ScratchBubble( - this, /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), - this.createEditor_(), this.iconXY_, this.width_, this.height_, - this.x_, this.y_, this.isMinimized_); - this.bubble_.setAutoLayout(false); - this.bubble_.registerResizeEvent(this.resizeBubble_.bind(this)); - this.bubble_.registerMinimizeToggleEvent(this.toggleMinimize_.bind(this)); - this.bubble_.registerDeleteEvent(this.dispose.bind(this)); - this.bubble_.registerContextMenuCallback(this.showContextMenu_.bind(this)); - this.updateColour(); - } else { - // Dispose of the bubble. - this.bubble_.dispose(); - this.bubble_ = null; - this.textarea_ = null; - this.foreignObject_ = null; - this.label_ = null; - } - // Restore the bubble stats after the visibility switch. - this.setText(text); - this.setBubbleSize(size.width, size.height); - if (visible) { - Blockly.ScratchBlockComment.fireCreateEvent(this); - } -}; - -/** - * Toggle the minimization state of this comment. - * @private - */ -Blockly.ScratchBlockComment.prototype.toggleMinimize_ = function() { - this.setMinimized(!this.isMinimized_); -}; - -/** - * Set the minimized state for this comment. - * @param {boolean} minimize Whether the comment should be minimized - * @package - */ -Blockly.ScratchBlockComment.prototype.setMinimized = function(minimize) { - if (this.isMinimized_ == minimize) { - return; - } - Blockly.Events.fire(new Blockly.Events.CommentChange(this, - {minimized: this.isMinimized_}, {minimized: minimize})); - this.isMinimized_ = minimize; - if (minimize) { - this.bubble_.setMinimized(true, this.getLabelText()); - this.setBubbleSize(Blockly.ScratchBlockComment.MINIMIZE_WIDTH, - Blockly.ScratchBubble.TOP_BAR_HEIGHT); - // Note we are not updating this.width_ or this.height_ here - // because we want to keep track of the width/height of the - // maximized comment - } else { - this.bubble_.setMinimized(false); - this.setText(this.text_); - this.setBubbleSize(this.width_, this.height_); - } -}; - -/** - * Size this comment's bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - * @package - */ -Blockly.ScratchBlockComment.prototype.setBubbleSize = function(width, height) { - if (this.bubble_) { - if (this.isMinimized_) { - this.bubble_.setBubbleSize(Blockly.ScratchBlockComment.MINIMIZE_WIDTH, - Blockly.ScratchBubble.TOP_BAR_HEIGHT); - } else { - this.bubble_.setBubbleSize(width, height); - } - } -}; - -/** - * Set the un-minimized size of this comment. If the comment has an un-minimized - * bubble, also set the bubble's size. - * @param {number} width Width of the unminimized comment. - * @param {number} height Height of the unminimized comment. - * @package - */ -Blockly.ScratchBlockComment.prototype.setSize = function(width, height) { - var oldWidth = this.width_; - var oldHeight = this.height_; - - if (!this.isMinimized_) { - this.setBubbleSize(width, height); - } - - this.height_ = height; - this.width_ = width; - - if (oldWidth != this.width_ || oldHeight != this.height_) { - Blockly.Events.fire(new Blockly.Events.CommentChange( - this, - {width: oldWidth, height: oldHeight}, - {width: this.width_, height: this.height_})); - } -}; - -/** - * Get the truncated text for this comment to display in the minimized - * top bar. - * @return {string} The truncated comment text - * @package - */ -Blockly.ScratchBlockComment.prototype.getLabelText = function() { - if (this.text_.length > Blockly.ScratchBlockComment.MAX_LABEL_LENGTH) { - if (this.block_.RTL) { - return '\u2026' + this.text_.slice(0, Blockly.ScratchBlockComment.MAX_LABEL_LENGTH); - } - return this.text_.slice(0, Blockly.ScratchBlockComment.MAX_LABEL_LENGTH) + '\u2026'; - } else { - return this.text_; - } -}; - -/** - * Set this comment's text. - * @param {string} text Comment text. - * @package - */ -Blockly.ScratchBlockComment.prototype.setText = function(text) { - if (this.text_ != text) { - Blockly.Events.fire(new Blockly.Events.CommentChange( - this, {text: this.text_}, {text: text})); - this.text_ = text; - } - if (this.textarea_) { - this.textarea_.value = text; - } -}; - -/** - * Move this comment to a position given x and y coordinates. - * @param {number} x The x-coordinate on the workspace. - * @param {number} y The y-coordinate on the workspace. - * @package - */ -Blockly.ScratchBlockComment.prototype.moveTo = function(x, y) { - var event = new Blockly.Events.CommentMove(this); - if (this.bubble_) { - this.bubble_.moveTo(x, y); - } - this.x_ = x; - this.y_ = y; - event.recordNew(); - Blockly.Events.fire(event); -}; - -/** - * Get the x and y position of this comment. - * @return {goog.math.Coordinate} The XY position - * @package - */ -Blockly.ScratchBlockComment.prototype.getXY = function() { - if (this.bubble_) { - return this.bubble_.getRelativeToSurfaceXY(); - } - // Auto position this comment if iconXY_ is provided - // (auto positioning will only occur if it is necessary). - if (this.needsAutoPositioning_ && this.iconXY_) { - this.autoPosition_(); - // Do not reset the needsAutoPositioning flag here. This will be reset - // after the comment has been made visible and the re-auto positioned, - // because the block may have moved by that point. - } - return new goog.math.Coordinate(this.x_, this.y_); -}; - -/** - * Get the height and width of this comment. - * Note: this does not use the current bubble size because - * the bubble may be minimized. - * @return {{height: number, width: number}} The height and width of - * this comment when it is full size. These numbers do not change - * as the workspace zoom changes. - * @package - */ -Blockly.ScratchBlockComment.prototype.getHeightWidth = function() { - return {height: this.height_, width: this.width_}; -}; - -/** - * Returns the coordinates of a bounding box describing the dimensions of this - * comment. - * Coordinate system: workspace coordinates. - * @return {!{topLeft: goog.math.Coordinate, bottomRight: goog.math.Coordinate}} - * Object with top left and bottom right coordinates of the bounding box. - * @package - */ -Blockly.ScratchBlockComment.prototype.getBoundingRectangle = function() { - var commentXY = this.getXY(); - var commentBounds = this.getBubbleSize(); - var topLeft; - var bottomRight; - if (this.workspace.RTL) { - // TODO (#1562) for some reason this doesn't work with workspace scroll in RTL - topLeft = new goog.math.Coordinate(commentXY.x - commentBounds.width, - commentXY.y); - bottomRight = new goog.math.Coordinate(commentXY.x, - commentXY.y + commentBounds.height); - } else { - topLeft = new goog.math.Coordinate(commentXY.x, commentXY.y); - bottomRight = new goog.math.Coordinate(commentXY.x + commentBounds.width, - commentXY.y + commentBounds.height); - } - return {topLeft: topLeft, bottomRight: bottomRight}; -}; - -/** - * Check whether this comment is currently minimized. - * @return {boolean} True if minimized - * @package - */ -Blockly.ScratchBlockComment.prototype.isMinimized = function() { - return this.isMinimized_; -}; - -/** - * Show the context menu for this comment's bubble. - * @param {!Event} e The mouse event - * @private - */ -Blockly.ScratchBlockComment.prototype.showContextMenu_ = function(e) { - var menuOptions = []; - menuOptions.push(Blockly.ContextMenu.commentDeleteOption(this, Blockly.Msg.DELETE)); - Blockly.ContextMenu.show(e, menuOptions, this.block_.RTL); -}; - -/** - * Encode a comment subtree as XML with XY coordinates. - * @param {boolean=} opt_noId True if the encoder should skip the comment id. - * @return {!Element} Tree of XML elements. - * @package - */ -Blockly.ScratchBlockComment.prototype.toXmlWithXY = function() { - var element = goog.dom.createDom('comment'); - element.setAttribute('id', this.id); - element.textContent = this.text_; - element.setAttribute('x', Math.round( - this.workspace.RTL ? this.workspace.getWidth() - this.x_ : this.x_)); - element.setAttribute('y', Math.round(this.y_)); - element.setAttribute('h', this.height_); - element.setAttribute('w', this.width_); - return element; -}; - -/** - * Fire a create event for the given workspace comment, if comments are enabled. - * @param {!Blockly.WorkspaceComment} comment The comment that was just created. - * @package - */ -Blockly.ScratchBlockComment.fireCreateEvent = function(comment) { - if (Blockly.Events.isEnabled()) { - var existingGroup = Blockly.Events.getGroup(); - if (!existingGroup) { - Blockly.Events.setGroup(true); - } - try { - Blockly.Events.fire(new Blockly.Events.CommentCreate(comment)); - } finally { - if (!existingGroup) { - Blockly.Events.setGroup(false); - } - } - } -}; - -/** - * Dispose of this comment. - */ -Blockly.ScratchBlockComment.prototype.dispose = function() { - if (Blockly.Events.isEnabled()) { - // Emit delete event before disposal begins so that the - // event's reference to this comment contains all the relevant - // information (for undoing this event) - Blockly.Events.fire(new Blockly.Events.CommentDelete(this)); - } - this.block_.comment = null; - this.workspace.removeTopComment(this); - Blockly.Icon.prototype.dispose.call(this); -}; - -/** - * Focus this comments textarea. - */ -Blockly.ScratchBlockComment.prototype.focus = function() { - this.textarea_.focus(); -}; diff --git a/packages/scratch-blocks/core/scratch_blocks_utils.js b/packages/scratch-blocks/core/scratch_blocks_utils.js deleted file mode 100644 index 99f492b42..000000000 --- a/packages/scratch-blocks/core/scratch_blocks_utils.js +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility methods for Scratch Blocks but not Blockly. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -/** - * @name Blockly.scratchBlocksUtils - * @namespace - **/ -goog.provide('Blockly.scratchBlocksUtils'); - - -/** - * Measure some text using a canvas in-memory. - * Does not exist in Blockly, but needed in scratch-blocks - * @param {string} fontSize E.g., '10pt' - * @param {string} fontFamily E.g., 'Arial' - * @param {string} fontWeight E.g., '600' - * @param {string} text The actual text to measure - * @return {number} Width of the text in px. - * @package - */ -Blockly.scratchBlocksUtils.measureText = function(fontSize, fontFamily, - fontWeight, text) { - var canvas = document.createElement('canvas'); - var context = canvas.getContext('2d'); - context.font = fontWeight + ' ' + fontSize + ' ' + fontFamily; - return context.measureText(text).width; -}; - -/** - * Encode a string's HTML entities. - * E.g., -> <a> - * Does not exist in Blockly, but needed in scratch-blocks - * @param {string} rawStr Unencoded raw string to encode. - * @return {string} String with HTML entities encoded. - * @package - */ -Blockly.scratchBlocksUtils.encodeEntities = function(rawStr) { - // CC-BY-SA https://stackoverflow.com/questions/18749591/encode-html-entities-in-javascript - return rawStr.replace(/[\u00A0-\u9999<>&]/gim, function(i) { - return '&#' + i.charCodeAt(0) + ';'; - }); -}; - -/** - * Re-assign obscured shadow blocks new IDs to prevent collisions - * Scratch specific to help the VM handle deleting obscured shadows. - * @param {Blockly.Block} block the root block to be processed. - * @package - */ -Blockly.scratchBlocksUtils.changeObscuredShadowIds = function(block) { - var blocks = block.getDescendants(false); - for (var i = blocks.length - 1; i >= 0; i--) { - var descendant = blocks[i]; - for (var j = 0; j < descendant.inputList.length; j++) { - var connection = descendant.inputList[j].connection; - if (connection) { - var shadowDom = connection.getShadowDom(); - if (shadowDom) { - shadowDom.setAttribute('id', Blockly.utils.genUid()); - connection.setShadowDom(shadowDom); - } - } - } - } -}; - -/** - * Whether a block is both a shadow block and an argument reporter. These - * blocks have special behaviour in scratch-blocks: they're duplicated when - * dragged, and they are rendered slightly differently from normal shadow - * blocks. - * @param {!Blockly.BlockSvg} block The block that should be used to make this - * decision. - * @return {boolean} True if the block should be duplicated on drag. - * @package - */ -Blockly.scratchBlocksUtils.isShadowArgumentReporter = function(block) { - return (block.isShadow() && (block.type == 'argument_reporter_boolean' || - block.type == 'argument_reporter_string_number')); -}; - -/** - * Compare strings with natural number sorting. - * @param {string} str1 First input. - * @param {string} str2 Second input. - * @return {number} -1, 0, or 1 to signify greater than, equality, or less than. - */ -Blockly.scratchBlocksUtils.compareStrings = function(str1, str2) { - return str1.localeCompare(str2, [], { - sensitivity: 'base', - numeric: true - }); -}; - -/** - * Determine if this block can be recycled in the flyout. Blocks that have no - * variablees and are not dynamic shadows can be recycled. - * @param {Blockly.Block} block The block to check. - * @return {boolean} True if the block can be recycled. - * @package - */ -Blockly.scratchBlocksUtils.blockIsRecyclable = function(block) { - // If the block needs to parse mutations, never recycle. - if (block.mutationToDom && block.domToMutation) { - return false; - } - - for (var i = 0; i < block.inputList.length; i++) { - var input = block.inputList[i]; - for (var j = 0; j < input.fieldRow.length; j++) { - var field = input.fieldRow[j]; - // No variables. - if (field instanceof Blockly.FieldVariable || - field instanceof Blockly.FieldVariableGetter) { - return false; - } - if (field instanceof Blockly.FieldDropdown || - field instanceof Blockly.FieldNumberDropdown || - field instanceof Blockly.FieldTextDropdown) { - if (field.isOptionListDynamic()) { - return false; - } - } - } - // Check children. - if (input.connection) { - var child = input.connection.targetBlock(); - if (child && !Blockly.scratchBlocksUtils.blockIsRecyclable(child)) { - return false; - } - } - } - return true; -}; - - -/** - * Creates a callback function for a click on the "duplicate" context menu - * option in Scratch Blocks. The block is duplicated and attached to the mouse, - * which acts as though it were pressed and mid-drag. Clicking the mouse - * releases the new dragging block. - * @param {!Blockly.BlockSvg} oldBlock The block that will be duplicated. - * @param {!Event} event Event that caused the context menu to open. - * @return {Function} A callback function that duplicates the block and starts a - * drag. - * @package - */ -Blockly.scratchBlocksUtils.duplicateAndDragCallback = function(oldBlock, event) { - var isMouseEvent = Blockly.Touch.getTouchIdentifierFromEvent(event) === 'mouse'; - return function(e) { - // Give the context menu a chance to close. - setTimeout(function() { - var ws = oldBlock.workspace; - var svgRootOld = oldBlock.getSvgRoot(); - if (!svgRootOld) { - throw new Error('oldBlock is not rendered.'); - } - - // Create the new block by cloning the block in the flyout (via XML). - var xml = Blockly.Xml.blockToDom(oldBlock); - // The target workspace would normally resize during domToBlock, which - // will lead to weird jumps. - // Resizing will be enabled when the drag ends. - ws.setResizesEnabled(false); - - // Disable events and manually emit events after the block has been - // positioned and has had its shadow IDs fixed (Scratch-specific). - Blockly.Events.disable(); - try { - // Using domToBlock instead of domToWorkspace means that the new block - // will be placed at position (0, 0) in main workspace units. - var newBlock = Blockly.Xml.domToBlock(xml, ws); - - // Scratch-specific: Give shadow dom new IDs to prevent duplicating on paste - Blockly.scratchBlocksUtils.changeObscuredShadowIds(newBlock); - - var svgRootNew = newBlock.getSvgRoot(); - if (!svgRootNew) { - throw new Error('newBlock is not rendered.'); - } - - // The position of the old block in workspace coordinates. - var oldBlockPosWs = oldBlock.getRelativeToSurfaceXY(); - - // Place the new block as the same position as the old block. - // TODO: Offset by the difference between the mouse position and the upper - // left corner of the block. - newBlock.moveBy(oldBlockPosWs.x, oldBlockPosWs.y); - if (!isMouseEvent) { - var offsetX = ws.RTL ? -100 : 100; - var offsetY = 100; - newBlock.moveBy(offsetX, offsetY); // Just offset the block for touch. - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); - } - - if (isMouseEvent) { - // e is not a real mouseEvent/touchEvent/pointerEvent. It's an event - // created by the context menu and has the coordinates of the mouse - // click that opened the context menu. - var fakeEvent = { - clientX: event.clientX, - clientY: event.clientY, - type: 'mousedown', - preventDefault: function() { - e.preventDefault(); - }, - stopPropagation: function() { - e.stopPropagation(); - }, - target: e.target - }; - ws.startDragWithFakeEvent(fakeEvent, newBlock); - } - }, 0); - }; -}; diff --git a/packages/scratch-blocks/core/scratch_bubble.js b/packages/scratch-blocks/core/scratch_bubble.js deleted file mode 100644 index 8c80345d7..000000000 --- a/packages/scratch-blocks/core/scratch_bubble.js +++ /dev/null @@ -1,696 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a UI bubble. - * @author kchadha@scratch.mit.edu (Karishma Chadha) - */ -'use strict'; - -goog.provide('Blockly.ScratchBubble'); - -goog.require('Blockly.Touch'); -goog.require('Blockly.Workspace'); -goog.require('goog.dom'); -goog.require('goog.math'); -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); - - -/** - * Class for Scratch comment UI bubble. - * @param {!Blockly.ScratchBlockComment} comment The comment this bubble belongs - * to. - * @param {!Blockly.WorkspaceSvg} workspace The workspace on which to draw the - * bubble. - * @param {!Element} content SVG content for the bubble. - * @param {!goog.math.Coordinate} anchorXY Absolute position of bubble's anchor - * point. - * @param {?number} bubbleWidth Width of bubble, or null if not resizable. - * @param {?number} bubbleHeight Height of bubble, or null if not resizable. - * @param {?number} bubbleX X position of bubble - * @param {?number} bubbleY Y position of bubble - * @param {?boolean} minimized Whether or not this comment bubble is minimized - * (only the top bar displays), defaults to false if not provided. - * @extends {Blockly.Bubble} - * @constructor - */ -Blockly.ScratchBubble = function(comment, workspace, content, anchorXY, - bubbleWidth, bubbleHeight, bubbleX, bubbleY, minimized) { - - // Needed for Events - /** - * The comment this bubble belongs to. - * @type {Blockly.ScratchBlockComment} - * @package - */ - this.comment = comment; - - this.workspace_ = workspace; - this.content_ = content; - this.x = bubbleX; - this.y = bubbleY; - this.isMinimized_ = minimized || false; - var canvas = workspace.getBubbleCanvas(); - canvas.appendChild(this.createDom_(content, !!(bubbleWidth && bubbleHeight), - this.isMinimized_)); - - this.setAnchorLocation(anchorXY); - if (!bubbleWidth || !bubbleHeight) { - var bBox = /** @type {SVGLocatable} */ (this.content_).getBBox(); - bubbleWidth = bBox.width + 2 * Blockly.ScratchBubble.BORDER_WIDTH; - bubbleHeight = bBox.height + 2 * Blockly.ScratchBubble.BORDER_WIDTH; - } - this.setBubbleSize(bubbleWidth, bubbleHeight); - - // Render the bubble. - this.positionBubble_(); - this.renderArrow_(); - this.rendered_ = true; - - if (!workspace.options.readOnly) { - Blockly.bindEventWithChecks_( - this.minimizeArrow_, 'mousedown', this, this.minimizeArrowMouseDown_, true); - Blockly.bindEventWithChecks_( - this.minimizeArrow_, 'mouseout', this, this.minimizeArrowMouseOut_, true); - Blockly.bindEventWithChecks_( - this.minimizeArrow_, 'mouseup', this, this.minimizeArrowMouseUp_, true); - Blockly.bindEventWithChecks_( - this.deleteIcon_, 'mousedown', this, this.deleteMouseDown_, true); - Blockly.bindEventWithChecks_( - this.deleteIcon_, 'mouseout', this, this.deleteMouseOut_, true); - Blockly.bindEventWithChecks_( - this.deleteIcon_, 'mouseup', this, this.deleteMouseUp_, true); - Blockly.bindEventWithChecks_( - this.commentTopBar_, 'mousedown', this, this.bubbleMouseDown_); - Blockly.bindEventWithChecks_( - this.bubbleBack_, 'mousedown', this, this.bubbleMouseDown_); - if (this.resizeGroup_) { - Blockly.bindEventWithChecks_( - this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); - Blockly.bindEventWithChecks_( - this.resizeGroup_, 'mouseup', this, this.resizeMouseUp_); - } - } - - this.setAutoLayout(false); - this.moveTo(this.x, this.y); -}; -goog.inherits(Blockly.ScratchBubble, Blockly.Bubble); - -/** - * Width of the border around the bubble. - * @package - */ -Blockly.ScratchBubble.BORDER_WIDTH = 1; - -/** - * Thickness of the line connecting the bubble - * to the block. - * @private - */ -Blockly.ScratchBubble.LINE_THICKNESS = 1; - -/** - * The height of the comment top bar. - * @package - */ -Blockly.ScratchBubble.TOP_BAR_HEIGHT = 32; - -/** - * The size of the minimize arrow icon in the comment top bar. - * @private - */ -Blockly.ScratchBubble.MINIMIZE_ICON_SIZE = 32; - -/** - * The size of the delete icon in the comment top bar. - * @private - */ -Blockly.ScratchBubble.DELETE_ICON_SIZE = 32; - -/** - * The inset for the top bar icons. - * @private - */ -Blockly.ScratchBubble.TOP_BAR_ICON_INSET = 0; - - -/** - * The inset for the top bar icons. - * @private - */ -Blockly.ScratchBubble.RESIZE_SIZE = 16; - -/** - * The bottom corner padding of the resize handle touch target. - * Extends slightly outside the comment box. - * @private - */ -Blockly.ScratchBubble.RESIZE_CORNER_PAD = 4; - -/** - * The top/side padding around resize handle touch target. - * Extends about one extra "diagonal" above resize handle. - * @private - */ -Blockly.ScratchBubble.RESIZE_OUTER_PAD = 8; - -/** - * Create the bubble's DOM. - * @param {!Element} content SVG content for the bubble. - * @param {boolean} hasResize Add diagonal resize gripper if true. - * @param {boolean} minimized Whether the bubble is minimized - * @return {!Element} The bubble's SVG group. - * @private - */ -Blockly.ScratchBubble.prototype.createDom_ = function(content, hasResize, minimized) { - this.bubbleGroup_ = Blockly.utils.createSvgElement('g', {}, null); - this.bubbleArrow_ = Blockly.utils.createSvgElement('line', - {'stroke-linecap': 'round'}, - this.bubbleGroup_); - this.bubbleBack_ = Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyDraggable scratchCommentRect', - 'x': 0, - 'y': 0, - 'rx': 4 * Blockly.ScratchBubble.BORDER_WIDTH, - 'ry': 4 * Blockly.ScratchBubble.BORDER_WIDTH - }, - this.bubbleGroup_); - - this.labelText_ = content.labelText; - this.createCommentTopBar_(); - - // Comment Text Editor - this.commentEditor_ = content.commentEditor; - this.bubbleGroup_.appendChild(this.commentEditor_); - - // Comment Resize Handle - if (hasResize) { - this.createResizeHandle_(); - } else { - this.resizeGroup_ = null; - } - - // Show / hide relevant things based on minimized state - if (minimized) { - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-up.svg'); - this.commentEditor_.setAttribute('display', 'none'); - this.resizeGroup_.setAttribute('display', 'none'); - } else { - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-down.svg'); - this.topBarLabel_.setAttribute('display', 'none'); - } - - return this.bubbleGroup_; -}; - -/** - * Create the comment top bar and its contents. - * @private - */ -Blockly.ScratchBubble.prototype.createCommentTopBar_ = function() { - this.commentTopBar_ = Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyDraggable scratchCommentTopBar', - 'rx': Blockly.ScratchBubble.BORDER_WIDTH, - 'ry': Blockly.ScratchBubble.BORDER_WIDTH, - 'height': Blockly.ScratchBubble.TOP_BAR_HEIGHT - }, this.bubbleGroup_); - - this.createTopBarIcons_(); - this.createTopBarLabel_(); -}; - -/** - * Create the minimize toggle and delete icons that in the comment top bar. - * @private - */ -Blockly.ScratchBubble.prototype.createTopBarIcons_ = function() { - var topBarMiddleY = (Blockly.ScratchBubble.TOP_BAR_HEIGHT / 2) + - Blockly.ScratchBubble.BORDER_WIDTH; - - // Minimize Toggle Icon in Comment Top Bar - var xInset = Blockly.ScratchBubble.TOP_BAR_ICON_INSET; - this.minimizeArrow_ = Blockly.utils.createSvgElement('image', - { - 'x': xInset, - 'y': topBarMiddleY - Blockly.ScratchBubble.MINIMIZE_ICON_SIZE / 2, - 'width': Blockly.ScratchBubble.MINIMIZE_ICON_SIZE, - 'height': Blockly.ScratchBubble.MINIMIZE_ICON_SIZE - }, this.bubbleGroup_); - - // Delete Icon in Comment Top Bar - this.deleteIcon_ = Blockly.utils.createSvgElement('image', - { - 'x': xInset, - 'y': topBarMiddleY - Blockly.ScratchBubble.DELETE_ICON_SIZE / 2, - 'width': Blockly.ScratchBubble.DELETE_ICON_SIZE, - 'height': Blockly.ScratchBubble.DELETE_ICON_SIZE - }, this.bubbleGroup_); - this.deleteIcon_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'delete-x.svg'); -}; - -/** - * Create the comment top bar label. This is the truncated comment text - * that shows when comment is minimized. - * @private - */ -Blockly.ScratchBubble.prototype.createTopBarLabel_ = function() { - this.topBarLabel_ = Blockly.utils.createSvgElement('text', - { - 'class': 'scratchCommentText', - 'x': this.width_ / 2, - 'y': (Blockly.ScratchBubble.TOP_BAR_HEIGHT / 2) + Blockly.ScratchBubble.BORDER_WIDTH, - 'text-anchor': 'middle', - 'dominant-baseline': 'middle' - }, this.bubbleGroup_); - - var labelTextNode = document.createTextNode(this.labelText_); - this.topBarLabel_.appendChild(labelTextNode); -}; - -/** - * Create the comment resize handle. - * @private - */ -Blockly.ScratchBubble.prototype.createResizeHandle_ = function() { - this.resizeGroup_ = Blockly.utils.createSvgElement('g', - {'class': this.workspace_.RTL ? - 'scratchCommentResizeSW' : 'scratchCommentResizeSE'}, - this.bubbleGroup_); - var resizeSize = Blockly.ScratchBubble.RESIZE_SIZE; - var outerPad = Blockly.ScratchBubble.RESIZE_OUTER_PAD; - var cornerPad = Blockly.ScratchBubble.RESIZE_CORNER_PAD; - // Build an (invisible) triangle that will catch resizes. It is padded on the - // top/left by outerPad, and padded down/right by cornerPad. - Blockly.utils.createSvgElement('polygon', - { - 'points': [ - -outerPad, resizeSize + cornerPad, - resizeSize + cornerPad, resizeSize + cornerPad, - resizeSize + cornerPad, -outerPad - ].join(' ') - }, - this.resizeGroup_); - Blockly.utils.createSvgElement('line', - { - 'class': 'blocklyResizeLine', - 'x1': resizeSize / 3, 'y1': resizeSize - 1, - 'x2': resizeSize - 1, 'y2': resizeSize / 3 - }, this.resizeGroup_); - Blockly.utils.createSvgElement('line', - { - 'class': 'blocklyResizeLine', - 'x1': resizeSize * 2 / 3, - 'y1': resizeSize - 1, - 'x2': resizeSize - 1, - 'y2': resizeSize * 2 / 3 - }, this.resizeGroup_); -}; - -/** - * Show the context menu for this bubble. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.ScratchBubble.prototype.showContextMenu_ = function(e) { - if (this.workspace_.options.readOnly) { - return; - } - - if (this.contextMenuCallback_) { - this.contextMenuCallback_(e); - } -}; - -/** - * Handle a mouse-down on bubble's minimize icon. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.ScratchBubble.prototype.minimizeArrowMouseDown_ = function(e) { - // Set a property indicating that this comment's minimize arrow got a mouse - // down event. This property will get reset if the mouse leaves the icon or - // when a mouse up occurs on this icon after this mouse down. - this.shouldToggleMinimize_ = true; - e.stopPropagation(); -}; - -/** - * Handle a mouse-out on bubble's minimize icon. - * @param {!Event} _e Mouse up event. - * @private - */ -Blockly.ScratchBubble.prototype.minimizeArrowMouseOut_ = function(_e) { - // If the mouse has left the minimize arrow icon, the - // shouldToggleMinimize property should get reset to false. - this.shouldToggleMinimize_ = false; -}; - -/** - * Handle a mouse-up on bubble's minimize icon. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.ScratchBubble.prototype.minimizeArrowMouseUp_ = function(e) { - // First check if this icon had a mouse down event - // on it and that the mouse never left the icon - if (this.shouldToggleMinimize_) { - this.shouldToggleMinimize_ = false; - - if (this.minimizeToggleCallback_) { - this.minimizeToggleCallback_.call(this); - } - } - e.stopPropagation(); -}; - -/** - * Handle a mouse-down on bubble's delete icon. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.ScratchBubble.prototype.deleteMouseDown_ = function(e) { - this.shouldDelete_ = true; - e.stopPropagation(); -}; - -/** - * Handle a mouse-out on bubble's delete icon. - * @param {!Event} _e Mouse out event. - * @private - */ -Blockly.ScratchBubble.prototype.deleteMouseOut_ = function(_e) { - // If the mouse has left the delete icon, the shouldDelete_ property - // should get reset to false. - this.shouldDelete_ = false; -}; - -/** - * Handle a mouse-up on bubble's delete icon. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.ScratchBubble.prototype.deleteMouseUp_ = function(e) { - // First check that this is actually the same icon that had a mouse down event - // on it and that the mouse never left the icon - if (this.shouldDelete_) { - this.shouldDelete_ = false; - - if (this.deleteCallback_) { - this.deleteCallback_.call(this); - } - } - e.stopPropagation(); -}; - -/** - * Handle a mouse-down on bubble's resize corner. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.ScratchBubble.prototype.resizeMouseDown_ = function(e) { - this.resizeStartSize_ = {width: this.width_, height: this.height_}; - this.workspace_.setResizesEnabled(false); - Blockly.ScratchBubble.superClass_.resizeMouseDown_.call(this, e); -}; - -/** - * Handle a mouse-up on bubble's resize corner. - * @param {!Event} _e Mouse up event. - * @private - */ -Blockly.ScratchBubble.prototype.resizeMouseUp_ = function(_e) { - var oldHW = this.resizeStartSize_; - this.resizeStartSize_ = null; - if (this.width_ == oldHW.width && this.height_ == oldHW.height) { - return; - } - // Fire a change event for the new width/height after - // resize mouse up - Blockly.Events.fire(new Blockly.Events.CommentChange( - this.comment, {width: oldHW.width , height: oldHW.height}, - {width: this.width_, height: this.height_})); - - this.workspace_.setResizesEnabled(true); -}; - -/** - * Set the minimized state of the bubble. - * @param {boolean} minimize Whether the bubble should be minimized - * @param {?string} labelText Optional label text for the comment top bar - * when it is minimized. - * @package - */ -Blockly.ScratchBubble.prototype.setMinimized = function(minimize, labelText) { - if (minimize == this.isMinimized_) { - return; - } - if (minimize) { - this.isMinimized_ = true; - // Change minimize icon - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-up.svg'); - // Hide text area - this.commentEditor_.setAttribute('display', 'none'); - // Hide resize handle if it exists - if (this.resizeGroup_) { - this.resizeGroup_.setAttribute('display', 'none'); - } - if (labelText && this.labelText_ != labelText) { - // Update label and display - this.topBarLabel_.textContent = labelText; - } - Blockly.utils.removeAttribute(this.topBarLabel_, 'display'); - } else { - this.isMinimized_ = false; - // Change minimize icon - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-down.svg'); - // Hide label - this.topBarLabel_.setAttribute('display', 'none'); - // Show text area - Blockly.utils.removeAttribute(this.commentEditor_, 'display'); - // Display resize handle if it exists - if (this.resizeGroup_) { - Blockly.utils.removeAttribute(this.resizeGroup_, 'display'); - } - } -}; - -/** - * Register a function as a callback event for when the bubble is minimized. - * @param {!Function} callback The function to call on resize. - * @package - */ -Blockly.ScratchBubble.prototype.registerMinimizeToggleEvent = function(callback) { - this.minimizeToggleCallback_ = callback; -}; - -/** - * Register a function as a callback event for when the bubble is resized. - * @param {!Function} callback The function to call on resize. - * @package - */ -Blockly.ScratchBubble.prototype.registerDeleteEvent = function(callback) { - this.deleteCallback_ = callback; -}; - -/** - * Register a function as a callback to show the context menu for this comment. - * @param {!Function} callback The function to call on resize. - * @package - */ -Blockly.ScratchBubble.prototype.registerContextMenuCallback = function(callback) { - this.contextMenuCallback_ = callback; -}; - -/** - * Notification that the anchor has moved. - * Update the arrow and bubble accordingly. - * @param {!goog.math.Coordinate} xy Absolute location. - * @package - */ -Blockly.ScratchBubble.prototype.setAnchorLocation = function(xy) { - this.anchorXY_ = xy; - if (this.rendered_) { - this.positionBubble_(); - } -}; - -/** - * Move the bubble group to the specified location in workspace coordinates. - * @param {number} x The x position to move to. - * @param {number} y The y position to move to. - * @package - */ -Blockly.ScratchBubble.prototype.moveTo = function(x, y) { - Blockly.ScratchBubble.superClass_.moveTo.call(this, x, y); - this.updatePosition_(x, y); -}; - -/** - * Size this bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - * @package - */ -Blockly.ScratchBubble.prototype.setBubbleSize = function(width, height) { - var doubleBorderWidth = 2 * Blockly.ScratchBubble.BORDER_WIDTH; - // Minimum size of a bubble. - width = Math.max(width, doubleBorderWidth + 50); - height = Math.max(height, Blockly.ScratchBubble.TOP_BAR_HEIGHT); - this.width_ = width; - this.height_ = height; - this.bubbleBack_.setAttribute('width', width); - this.bubbleBack_.setAttribute('height', height); - this.commentTopBar_.setAttribute('width', width); - this.commentTopBar_.setAttribute('height', Blockly.ScratchBubble.TOP_BAR_HEIGHT); - if (this.workspace_.RTL) { - this.minimizeArrow_.setAttribute('x', width - - (Blockly.ScratchBubble.MINIMIZE_ICON_SIZE) - - Blockly.ScratchBubble.TOP_BAR_ICON_INSET); - } else { - this.deleteIcon_.setAttribute('x', width - - Blockly.ScratchBubble.DELETE_ICON_SIZE - - Blockly.ScratchBubble.TOP_BAR_ICON_INSET); - } - if (this.resizeGroup_) { - var resizeSize = Blockly.ScratchBubble.RESIZE_SIZE; - if (this.workspace_.RTL) { - // Mirror the resize group. - this.resizeGroup_.setAttribute('transform', 'translate(' + - (resizeSize + doubleBorderWidth) + ',' + - (this.height_ - doubleBorderWidth - resizeSize) + ') scale(-1, 1)'); - } else { - this.resizeGroup_.setAttribute('transform', 'translate(' + - (this.width_ - doubleBorderWidth - resizeSize) + ',' + - (this.height_ - doubleBorderWidth - resizeSize) + ')'); - } - } - if (this.isMinimized_) { - this.topBarLabel_.setAttribute('x', this.width_ / 2); - this.topBarLabel_.setAttribute('y', this.height_ / 2); - } - if (this.rendered_) { - this.positionBubble_(); - this.renderArrow_(); - } - // Allow the contents to resize. - if (this.resizeCallback_) { - this.resizeCallback_(); - } -}; - -/** - * Draw the line between the bubble and the origin. - * @private - */ -Blockly.ScratchBubble.prototype.renderArrow_ = function() { - // Find the relative coordinates of the top bar center of the bubble. - var relBubbleX = this.width_ / 2; - var relBubbleY = Blockly.ScratchBubble.TOP_BAR_HEIGHT / 2; - // Find the relative coordinates of the center of the anchor. - var relAnchorX = -this.relativeLeft_; - var relAnchorY = -this.relativeTop_; - if (relBubbleX != relAnchorX || relBubbleY != relAnchorY) { - // Compute the angle of the arrow's line. - var rise = relAnchorY - relBubbleY; - var run = relAnchorX - relBubbleX; - if (this.workspace_.RTL) { - run *= -1; - run -= this.width_; - } - - var baseX1 = relBubbleX; - var baseY1 = relBubbleY; - - this.bubbleArrow_.setAttribute('x1', baseX1); - this.bubbleArrow_.setAttribute('y1', baseY1); - this.bubbleArrow_.setAttribute('x2', baseX1 + run); - this.bubbleArrow_.setAttribute('y2', baseY1 + rise); - this.bubbleArrow_.setAttribute('stroke-width', Blockly.ScratchBubble.LINE_THICKNESS); - } -}; - -/** - * Change the colour of a bubble. - * @param {string} hexColour Hex code of colour. - * @package - */ -Blockly.ScratchBubble.prototype.setColour = function(hexColour) { - this.bubbleBack_.setAttribute('stroke', hexColour); - this.bubbleArrow_.setAttribute('stroke', hexColour); -}; - -/** - * Move this bubble during a drag, taking into account whether or not there is - * a drag surface. - * @param {?Blockly.BlockDragSurfaceSvg} dragSurface The surface that carries - * rendered items during a drag, or null if no drag surface is in use. - * @param {!goog.math.Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ -Blockly.ScratchBubble.prototype.moveDuringDrag = function(dragSurface, newLoc) { - if (dragSurface) { - dragSurface.translateSurface(newLoc.x, newLoc.y); - this.updatePosition_(newLoc.x, newLoc.y); - } else { - this.moveTo(newLoc.x, newLoc.y); - } -}; - -/** - * Update the relative left and top of the bubble after a move. - * @param {number} x The x position of the bubble - * @param {number} y The y position of the bubble - * @private - */ -Blockly.ScratchBubble.prototype.updatePosition_ = function(x, y) { - // Relative left is the distance *and* direction to get from the comment - // anchor position on the block to the starting edge of the comment (e.g. - // the left edge of the comment in LTR and the right edge of the comment in RTL) - if (this.workspace_.RTL) { - // we want relativeLeft_ to actually be the distance from the anchor point to the *right* edge of the comment in RTL - this.relativeLeft_ = this.anchorXY_.x - x; - } else { - this.relativeLeft_ = x - this.anchorXY_.x; - } - this.relativeTop_ = y - this.anchorXY_.y; - this.renderArrow_(); -}; - -/** - * Dispose of this bubble. - * @package - */ -Blockly.ScratchBubble.prototype.dispose = function() { - Blockly.ScratchBubble.superClass_.dispose.call(this); - this.topBarLabel_ = null; - this.commentTopBar_ = null; - this.minimizeArrow_ = null; - this.deleteIcon_ = null; -}; diff --git a/packages/scratch-blocks/core/scratch_events.js b/packages/scratch-blocks/core/scratch_events.js deleted file mode 100644 index 56f340bdc..000000000 --- a/packages/scratch-blocks/core/scratch_events.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Events fired as a result of UI actions in a Scratch-Blocks - * editor that are not fired in Blockly. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Events.DragBlockOutside'); -goog.provide('Blockly.Events.EndBlockDrag'); - -goog.require('Blockly.Events'); -goog.require('Blockly.Events.BlockBase'); - -goog.require('goog.array'); -goog.require('goog.math.Coordinate'); - -/** - * Class for a block drag event. Fired when block dragged into or out of - * the blocks UI. - * @param {Blockly.Block} block The moved block. Null for a blank event. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.DragBlockOutside = function(block) { - if (!block) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.DragBlockOutside.superClass_.constructor.call(this, block); - this.recordUndo = false; -}; -goog.inherits(Blockly.Events.DragBlockOutside, Blockly.Events.BlockBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.DragBlockOutside.prototype.type = Blockly.Events.DRAG_OUTSIDE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.DragBlockOutside.prototype.toJson = function() { - var json = Blockly.Events.DragBlockOutside.superClass_.toJson.call(this); - if (this.isOutside) { - json['isOutside'] = this.isOutside; - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.DragBlockOutside.prototype.fromJson = function(json) { - Blockly.Events.DragBlockOutside.superClass_.fromJson.call(this, json); - this.isOutside = json['isOutside']; -}; - -/** - * Class for a block end drag event. - * @param {Blockly.Block} block The moved block. Null for a blank event. - * @param {boolean} isOutside True if the moved block is outside of the - * blocks workspace. - * @extends {Blockly.Events.BlockBase} - * @constructor - */ -Blockly.Events.EndBlockDrag = function(block, isOutside) { - if (!block) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.EndBlockDrag.superClass_.constructor.call(this, block); - this.isOutside = isOutside; - // If drag ends outside the blocks workspace, send the block XML - if (isOutside) { - this.xml = Blockly.Xml.blockToDom(block, true /* opt_noId */); - } - this.recordUndo = false; -}; -goog.inherits(Blockly.Events.EndBlockDrag, Blockly.Events.BlockBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.EndBlockDrag.prototype.type = Blockly.Events.END_DRAG; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.EndBlockDrag.prototype.toJson = function() { - var json = Blockly.Events.EndBlockDrag.superClass_.toJson.call(this); - if (this.isOutside) { - json['isOutside'] = this.isOutside; - } - if (this.xml) { - json['xml'] = this.xml; - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.EndBlockDrag.prototype.fromJson = function(json) { - Blockly.Events.EndBlockDrag.superClass_.fromJson.call(this, json); - this.isOutside = json['isOutside']; - this.xml = json['xml']; -}; diff --git a/packages/scratch-blocks/core/scratch_msgs.js b/packages/scratch-blocks/core/scratch_msgs.js deleted file mode 100644 index f59588f84..000000000 --- a/packages/scratch-blocks/core/scratch_msgs.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Scratch Messages singleton, with function to override Blockly.Msg values. - * @author chrisg@media.mit.edu (Chris Garrity) - */ -'use strict'; - -/** - * Name space for the ScratchMsgs singleton. - * Msg gets populated in the message files. - */ -goog.provide('Blockly.ScratchMsgs'); - -goog.require('Blockly.Msg'); - - -/** - * The object containing messages for all locales - loaded from msg/scratch_msgs. - * @type {Object} - */ -Blockly.ScratchMsgs.locales = {}; - -/** - * The current locale. - * @type {String} - * @private - */ -Blockly.ScratchMsgs.currentLocale_ = 'en'; - -/** - * Change the Blockly.Msg strings to a new Locale - * Does not exist in Blockly, but needed in scratch-blocks - * @param {string} locale E.g., 'de', or 'zh-tw' - * @package - */ -Blockly.ScratchMsgs.setLocale = function(locale) { - if (Object.keys(Blockly.ScratchMsgs.locales).includes(locale)) { - Blockly.ScratchMsgs.currentLocale_ = locale; - Blockly.Msg = Object.assign({}, Blockly.Msg, Blockly.ScratchMsgs.locales[locale]); - } else { - // keep current locale - console.warn('Ignoring unrecognized locale: ' + locale); - } -}; - -/** - * Gets a localized message, for use in the Scratch VM with json init. - * Does not interpolate placeholders. Provided to allow default values in - * dynamic menus, for example, 'next backdrop', or 'random position' - * @param {string} msgId id for the message, key in Msg table. - * @param {string} defaultMsg string to use if the id isn't found. - * @param {string} useLocale optional locale to use in place of currentLocale_. - * @return {string} message with placeholders filled. - * @package - */ -Blockly.ScratchMsgs.translate = function(msgId, defaultMsg, useLocale) { - var locale = useLocale || Blockly.ScratchMsgs.currentLocale_; - - if (Object.keys(Blockly.ScratchMsgs.locales).includes(locale)) { - var messages = Blockly.ScratchMsgs.locales[locale]; - if (Object.keys(messages).includes(msgId)) { - return messages[msgId]; - } - } - return defaultMsg; -}; diff --git a/packages/scratch-blocks/core/scrollbar.js b/packages/scratch-blocks/core/scrollbar.js deleted file mode 100644 index c5431291a..000000000 --- a/packages/scratch-blocks/core/scrollbar.js +++ /dev/null @@ -1,875 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Library for creating scrollbars. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Scrollbar'); -goog.provide('Blockly.ScrollbarPair'); - -goog.require('goog.dom'); -goog.require('goog.events'); - - -/** - * A note on units: most of the numbers that are in CSS pixels are scaled if the - * scrollbar is in a mutator. - */ - -/** - * Class for a pair of scrollbars. Horizontal and vertical. - * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbars to. - * @constructor - */ -Blockly.ScrollbarPair = function(workspace) { - this.workspace_ = workspace; - this.hScroll = new Blockly.Scrollbar( - workspace, true, true, 'blocklyMainWorkspaceScrollbar'); - this.vScroll = new Blockly.Scrollbar( - workspace, false, true, 'blocklyMainWorkspaceScrollbar'); - this.corner_ = Blockly.utils.createSvgElement( - 'rect', - { - 'height': Blockly.Scrollbar.scrollbarThickness, - 'width': Blockly.Scrollbar.scrollbarThickness, - 'class': 'blocklyScrollbarBackground' - }, - null); - Blockly.utils.insertAfter(this.corner_, workspace.getBubbleCanvas()); -}; - -/** - * Previously recorded metrics from the workspace. - * @type {Object} - * @private - */ -Blockly.ScrollbarPair.prototype.oldHostMetrics_ = null; - -/** - * Dispose of this pair of scrollbars. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.ScrollbarPair.prototype.dispose = function() { - goog.dom.removeNode(this.corner_); - this.corner_ = null; - this.workspace_ = null; - this.oldHostMetrics_ = null; - this.hScroll.dispose(); - this.hScroll = null; - this.vScroll.dispose(); - this.vScroll = null; -}; - -/** - * Recalculate both of the scrollbars' locations and lengths. - * Also reposition the corner rectangle. - */ -Blockly.ScrollbarPair.prototype.resize = function() { - // Look up the host metrics once, and use for both scrollbars. - var hostMetrics = this.workspace_.getMetrics(); - if (!hostMetrics) { - // Host element is likely not visible. - return; - } - - // Only change the scrollbars if there has been a change in metrics. - var resizeH = false; - var resizeV = false; - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || - this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || - this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop || - this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { - // The window has been resized or repositioned. - resizeH = true; - resizeV = true; - } else { - // Has the content been resized or moved? - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.contentWidth != hostMetrics.contentWidth || - this.oldHostMetrics_.viewLeft != hostMetrics.viewLeft || - this.oldHostMetrics_.contentLeft != hostMetrics.contentLeft) { - resizeH = true; - } - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.contentHeight != hostMetrics.contentHeight || - this.oldHostMetrics_.viewTop != hostMetrics.viewTop || - this.oldHostMetrics_.contentTop != hostMetrics.contentTop) { - resizeV = true; - } - } - if (resizeH) { - this.hScroll.resize(hostMetrics); - } - if (resizeV) { - this.vScroll.resize(hostMetrics); - } - - // Reposition the corner square. - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || - this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { - this.corner_.setAttribute('x', this.vScroll.position_.x); - } - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || - this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop) { - this.corner_.setAttribute('y', this.hScroll.position_.y); - } - - // Cache the current metrics to potentially short-cut the next resize event. - this.oldHostMetrics_ = hostMetrics; -}; - -/** - * Set the handles of both scrollbars to be at a certain position in CSS pixels - * relative to their parents. - * @param {number} x Horizontal scroll value. - * @param {number} y Vertical scroll value. - */ -Blockly.ScrollbarPair.prototype.set = function(x, y) { - // This function is equivalent to: - // this.hScroll.set(x); - // this.vScroll.set(y); - // However, that calls setMetrics twice which causes a chain of - // getAttribute->setAttribute->getAttribute resulting in an extra layout pass. - // Combining them speeds up rendering. - var xyRatio = {}; - - var hHandlePosition = x * this.hScroll.ratio_; - var vHandlePosition = y * this.vScroll.ratio_; - - var hBarLength = this.hScroll.scrollViewSize_; - var vBarLength = this.vScroll.scrollViewSize_; - - xyRatio.x = this.getRatio_(hHandlePosition, hBarLength); - xyRatio.y = this.getRatio_(vHandlePosition, vBarLength); - this.workspace_.setMetrics(xyRatio); - - this.hScroll.setHandlePosition(hHandlePosition); - this.vScroll.setHandlePosition(vHandlePosition); -}; - -/** - * Helper to calculate the ratio of handle position to scrollbar view size. - * @param {number} handlePosition The value of the handle. - * @param {number} viewSize The total size of the scrollbar's view. - * @return {number} Ratio. - * @private - */ -Blockly.ScrollbarPair.prototype.getRatio_ = function(handlePosition, viewSize) { - var ratio = handlePosition / viewSize; - if (isNaN(ratio)) { - return 0; - } - return ratio; -}; - -// -------------------------------------------------------------------- - -/** - * Class for a pure SVG scrollbar. - * This technique offers a scrollbar that is guaranteed to work, but may not - * look or behave like the system's scrollbars. - * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbar to. - * @param {boolean} horizontal True if horizontal, false if vertical. - * @param {boolean=} opt_pair True if scrollbar is part of a horiz/vert pair. - * @param {string=} opt_class A class to be applied to this scrollbar. - * @constructor - */ -Blockly.Scrollbar = function(workspace, horizontal, opt_pair, opt_class) { - this.workspace_ = workspace; - this.pair_ = opt_pair || false; - this.horizontal_ = horizontal; - this.oldHostMetrics_ = null; - - this.createDom_(opt_class); - - /** - * The upper left corner of the scrollbar's SVG group in CSS pixels relative - * to the scrollbar's origin. This is usually relative to the injection div - * origin. - * @type {goog.math.Coordinate} - * @private - */ - this.position_ = new goog.math.Coordinate(0, 0); - - // Store the thickness in a temp variable for readability. - var scrollbarThickness = Blockly.Scrollbar.scrollbarThickness; - if (horizontal) { - this.svgBackground_.setAttribute('height', scrollbarThickness); - this.outerSvg_.setAttribute('height', scrollbarThickness); - this.svgHandle_.setAttribute('height', scrollbarThickness - 5); - this.svgHandle_.setAttribute('y', 2.5); - - this.lengthAttribute_ = 'width'; - this.positionAttribute_ = 'x'; - } else { - this.svgBackground_.setAttribute('width', scrollbarThickness); - this.outerSvg_.setAttribute('width', scrollbarThickness); - this.svgHandle_.setAttribute('width', scrollbarThickness - 5); - this.svgHandle_.setAttribute('x', 2.5); - - this.lengthAttribute_ = 'height'; - this.positionAttribute_ = 'y'; - } - var scrollbar = this; - this.onMouseDownBarWrapper_ = Blockly.bindEventWithChecks_( - this.svgBackground_, 'mousedown', scrollbar, scrollbar.onMouseDownBar_); - this.onMouseDownHandleWrapper_ = Blockly.bindEventWithChecks_(this.svgHandle_, - 'mousedown', scrollbar, scrollbar.onMouseDownHandle_); -}; - -/** - * The location of the origin of the workspace that the scrollbar is in, - * measured in CSS pixels relative to the injection div origin. This is usually - * (0, 0). When the scrollbar is in a flyout it may have a different origin. - * @type {goog.math.Coordinate} - * @private - */ -Blockly.Scrollbar.prototype.origin_ = new goog.math.Coordinate(0, 0); - -/** - * Whether or not the origin of the scrollbar has changed. Used - * to help decide whether or not the reflow/resize calls need to happen. - * @type {boolean} - * @private - */ -Blockly.Scrollbar.prototype.originHasChanged_ = true; - -/** - * The size of the area within which the scrollbar handle can move, in CSS - * pixels. - * @type {number} - * @private - */ -Blockly.Scrollbar.prototype.scrollViewSize_ = 0; - -/** - * The length of the scrollbar handle in CSS pixels. - * @type {number} - * @private - */ -Blockly.Scrollbar.prototype.handleLength_ = 0; - -/** - * The offset of the start of the handle from the scrollbar position, in CSS - * pixels. - * @type {number} - * @private - */ -Blockly.Scrollbar.prototype.handlePosition_ = 0; - -/** - * Whether the scrollbar handle is visible. - * @type {boolean} - * @private - */ -Blockly.Scrollbar.prototype.isVisible_ = true; - -/** - * Whether the workspace containing this scrollbar is visible. - * @type {boolean} - * @private - */ -Blockly.Scrollbar.prototype.containerVisible_ = true; - -/** - * Width of vertical scrollbar or height of horizontal scrollbar in CSS pixels. - * Scrollbars should be larger on touch devices. - */ -Blockly.Scrollbar.scrollbarThickness = 11; -if (goog.events.BrowserFeature.TOUCH_ENABLED) { - Blockly.Scrollbar.scrollbarThickness = 14; -} - -/** - * @param {!Object} first An object containing computed measurements of a - * workspace. - * @param {!Object} second Another object containing computed measurements of a - * workspace. - * @return {boolean} Whether the two sets of metrics are equivalent. - * @private - */ -Blockly.Scrollbar.metricsAreEquivalent_ = function(first, second) { - if (!(first && second)) { - return false; - } - - if (first.viewWidth != second.viewWidth || - first.viewHeight != second.viewHeight || - first.viewLeft != second.viewLeft || - first.viewTop != second.viewTop || - first.absoluteTop != second.absoluteTop || - first.absoluteLeft != second.absoluteLeft || - first.contentWidth != second.contentWidth || - first.contentHeight != second.contentHeight || - first.contentLeft != second.contentLeft || - first.contentTop != second.contentTop) { - return false; - } - - return true; -}; - -/** - * Dispose of this scrollbar. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Scrollbar.prototype.dispose = function() { - this.cleanUp_(); - Blockly.unbindEvent_(this.onMouseDownBarWrapper_); - this.onMouseDownBarWrapper_ = null; - Blockly.unbindEvent_(this.onMouseDownHandleWrapper_); - this.onMouseDownHandleWrapper_ = null; - - goog.dom.removeNode(this.outerSvg_); - this.outerSvg_ = null; - this.svgGroup_ = null; - this.svgBackground_ = null; - this.svgHandle_ = null; - this.workspace_ = null; -}; - -/** - * Set the length of the scrollbar's handle and change the SVG attribute - * accordingly. - * @param {number} newLength The new scrollbar handle length in CSS pixels. - */ -Blockly.Scrollbar.prototype.setHandleLength_ = function(newLength) { - this.handleLength_ = newLength; - this.svgHandle_.setAttribute(this.lengthAttribute_, this.handleLength_); -}; - -/** - * Set the offset of the scrollbar's handle from the scrollbar's position, and - * change the SVG attribute accordingly. - * @param {number} newPosition The new scrollbar handle offset in CSS pixels. - */ -Blockly.Scrollbar.prototype.setHandlePosition = function(newPosition) { - this.handlePosition_ = newPosition; - this.svgHandle_.setAttribute(this.positionAttribute_, this.handlePosition_); -}; - -/** - * Set the size of the scrollbar's background and change the SVG attribute - * accordingly. - * @param {number} newSize The new scrollbar background length in CSS pixels. - * @private - */ -Blockly.Scrollbar.prototype.setScrollViewSize_ = function(newSize) { - this.scrollViewSize_ = newSize; - this.outerSvg_.setAttribute(this.lengthAttribute_, this.scrollViewSize_); - this.svgBackground_.setAttribute(this.lengthAttribute_, this.scrollViewSize_); -}; - -/** - * Set whether this scrollbar's container is visible. - * @param {boolean} visible Whether the container is visible. - */ -Blockly.ScrollbarPair.prototype.setContainerVisible = function(visible) { - this.hScroll.setContainerVisible(visible); - this.vScroll.setContainerVisible(visible); -}; - -/** - * Set the position of the scrollbar's SVG group in CSS pixels relative to the - * scrollbar's origin. This sets the scrollbar's location within the workspace. - * @param {number} x The new x coordinate. - * @param {number} y The new y coordinate. - * @private - */ -Blockly.Scrollbar.prototype.setPosition_ = function(x, y) { - this.position_.x = x; - this.position_.y = y; - - var tempX = this.position_.x + this.origin_.x; - var tempY = this.position_.y + this.origin_.y; - var transform = 'translate(' + tempX + 'px,' + tempY + 'px)'; - Blockly.utils.setCssTransform(this.outerSvg_, transform); -}; - -/** - * Recalculate the scrollbar's location and its length. - * @param {Object=} opt_metrics A data structure of from the describing all the - * required dimensions. If not provided, it will be fetched from the host - * object. - */ -Blockly.Scrollbar.prototype.resize = function(opt_metrics) { - // Determine the location, height and width of the host element. - var hostMetrics = opt_metrics; - if (!hostMetrics) { - hostMetrics = this.workspace_.getMetrics(); - if (!hostMetrics) { - // Host element is likely not visible. - return; - } - } - - // If the origin has changed (e.g. the toolbox is moving from start to end) - // we want to continue with the resize even if workspace metrics haven't. - if (this.originHasChanged_) { - this.originHasChanged_ = false; - } else if (Blockly.Scrollbar.metricsAreEquivalent_(hostMetrics, - this.oldHostMetrics_)) { - return; - } - this.oldHostMetrics_ = hostMetrics; - - /* hostMetrics is an object with the following properties. - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the content, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .viewLeft: Offset of left edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - */ - if (this.horizontal_) { - this.resizeHorizontal_(hostMetrics); - } else { - this.resizeVertical_(hostMetrics); - } - // Resizing may have caused some scrolling. - this.onScroll_(); -}; - -/** - * Recalculate a horizontal scrollbar's location and length. - * @param {!Object} hostMetrics A data structure describing all the - * required dimensions, possibly fetched from the host object. - * @private - */ -Blockly.Scrollbar.prototype.resizeHorizontal_ = function(hostMetrics) { - // TODO: Inspect metrics to determine if we can get away with just a content - // resize. - this.resizeViewHorizontal(hostMetrics); -}; - -/** - * Recalculate a horizontal scrollbar's location on the screen and path length. - * This should be called when the layout or size of the window has changed. - * @param {!Object} hostMetrics A data structure describing all the - * required dimensions, possibly fetched from the host object. - */ -Blockly.Scrollbar.prototype.resizeViewHorizontal = function(hostMetrics) { - var viewSize = hostMetrics.viewWidth - 1; - if (this.pair_) { - // Shorten the scrollbar to make room for the corner square. - viewSize -= Blockly.Scrollbar.scrollbarThickness; - } - this.setScrollViewSize_(Math.max(0, viewSize)); - - var xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (this.pair_ && this.workspace_.RTL) { - xCoordinate += Blockly.Scrollbar.scrollbarThickness; - } - - // Horizontal toolbar should always be just above the bottom of the workspace. - var yCoordinate = hostMetrics.absoluteTop + hostMetrics.viewHeight - - Blockly.Scrollbar.scrollbarThickness - 0.5; - this.setPosition_(xCoordinate, yCoordinate); - - // If the view has been resized, a content resize will also be necessary. The - // reverse is not true. - this.resizeContentHorizontal(hostMetrics); -}; - -/** - * Recalculate a horizontal scrollbar's location within its path and length. - * This should be called when the contents of the workspace have changed. - * @param {!Object} hostMetrics A data structure describing all the - * required dimensions, possibly fetched from the host object. - */ -Blockly.Scrollbar.prototype.resizeContentHorizontal = function(hostMetrics) { - if (!this.pair_) { - // Only show the scrollbar if needed. - // Ideally this would also apply to scrollbar pairs, but that's a bigger - // headache (due to interactions with the corner square). - this.setVisible(this.scrollViewSize_ < hostMetrics.contentWidth); - } - - this.ratio_ = this.scrollViewSize_ / hostMetrics.contentWidth; - if (this.ratio_ == -Infinity || this.ratio_ == Infinity || - isNaN(this.ratio_)) { - this.ratio_ = 0; - } - - var handleLength = hostMetrics.viewWidth * this.ratio_; - this.setHandleLength_(Math.max(0, handleLength)); - - var handlePosition = (hostMetrics.viewLeft - hostMetrics.contentLeft) * - this.ratio_; - this.setHandlePosition(this.constrainHandle_(handlePosition)); -}; - -/** - * Recalculate a vertical scrollbar's location and length. - * @param {!Object} hostMetrics A data structure describing all the - * required dimensions, possibly fetched from the host object. - * @private - */ -Blockly.Scrollbar.prototype.resizeVertical_ = function(hostMetrics) { - // TODO: Inspect metrics to determine if we can get away with just a content - // resize. - this.resizeViewVertical(hostMetrics); -}; - -/** - * Recalculate a vertical scrollbar's location on the screen and path length. - * This should be called when the layout or size of the window has changed. - * @param {!Object} hostMetrics A data structure describing all the - * required dimensions, possibly fetched from the host object. - */ -Blockly.Scrollbar.prototype.resizeViewVertical = function(hostMetrics) { - var viewSize = hostMetrics.viewHeight - 1; - if (this.pair_) { - // Shorten the scrollbar to make room for the corner square. - viewSize -= Blockly.Scrollbar.scrollbarThickness; - } - this.setScrollViewSize_(Math.max(0, viewSize)); - - var xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (!this.workspace_.RTL) { - xCoordinate += hostMetrics.viewWidth - - Blockly.Scrollbar.scrollbarThickness - 1; - } - var yCoordinate = hostMetrics.absoluteTop + 0.5; - this.setPosition_(xCoordinate, yCoordinate); - - // If the view has been resized, a content resize will also be necessary. The - // reverse is not true. - this.resizeContentVertical(hostMetrics); -}; - -/** - * Recalculate a vertical scrollbar's location within its path and length. - * This should be called when the contents of the workspace have changed. - * @param {!Object} hostMetrics A data structure describing all the - * required dimensions, possibly fetched from the host object. - */ -Blockly.Scrollbar.prototype.resizeContentVertical = function(hostMetrics) { - if (!this.pair_) { - // Only show the scrollbar if needed. - this.setVisible(this.scrollViewSize_ < hostMetrics.contentHeight); - } - - this.ratio_ = this.scrollViewSize_ / hostMetrics.contentHeight; - if (this.ratio_ == -Infinity || this.ratio_ == Infinity || - isNaN(this.ratio_)) { - this.ratio_ = 0; - } - - var handleLength = hostMetrics.viewHeight * this.ratio_; - this.setHandleLength_(Math.max(0, handleLength)); - - var handlePosition = (hostMetrics.viewTop - hostMetrics.contentTop) * - this.ratio_; - this.setHandlePosition(this.constrainHandle_(handlePosition)); -}; - -/** - * Create all the DOM elements required for a scrollbar. - * The resulting widget is not sized. - * @param {string=} opt_class A class to be applied to this scrollbar. - * @private - */ -Blockly.Scrollbar.prototype.createDom_ = function(opt_class) { - /* Create the following DOM: - - - - - - - */ - var className = 'blocklyScrollbar' + - (this.horizontal_ ? 'Horizontal' : 'Vertical'); - if (opt_class) { - className += ' ' + opt_class; - } - this.outerSvg_ = Blockly.utils.createSvgElement( - 'svg', {'class': className}, null); - this.svgGroup_ = Blockly.utils.createSvgElement('g', {}, this.outerSvg_); - this.svgBackground_ = Blockly.utils.createSvgElement( - 'rect', {'class': 'blocklyScrollbarBackground'}, this.svgGroup_); - var radius = Math.floor((Blockly.Scrollbar.scrollbarThickness - 5) / 2); - this.svgHandle_ = Blockly.utils.createSvgElement( - 'rect', - { - 'class': 'blocklyScrollbarHandle', - 'rx': radius, - 'ry': radius - }, - this.svgGroup_); - Blockly.utils.insertAfter(this.outerSvg_, this.workspace_.getParentSvg()); -}; - -/** - * Is the scrollbar visible. Non-paired scrollbars disappear when they aren't - * needed. - * @return {boolean} True if visible. - */ -Blockly.Scrollbar.prototype.isVisible = function() { - return this.isVisible_; -}; - -/** - * Set whether the scrollbar's container is visible and update - * display accordingly if visibility has changed. - * @param {boolean} visible Whether the container is visible - */ -Blockly.Scrollbar.prototype.setContainerVisible = function(visible) { - var visibilityChanged = (visible != this.containerVisible_); - - this.containerVisible_ = visible; - if (visibilityChanged) { - this.updateDisplay_(); - } -}; - -/** - * Set whether the scrollbar is visible. - * Only applies to non-paired scrollbars. - * @param {boolean} visible True if visible. - */ -Blockly.Scrollbar.prototype.setVisible = function(visible) { - var visibilityChanged = (visible != this.isVisible()); - - // Ideally this would also apply to scrollbar pairs, but that's a bigger - // headache (due to interactions with the corner square). - if (this.pair_) { - throw 'Unable to toggle visibility of paired scrollbars.'; - } - this.isVisible_ = visible; - if (visibilityChanged) { - this.updateDisplay_(); - } -}; - -/** - * Update visibility of scrollbar based on whether it thinks it should - * be visible and whether its containing workspace is visible. - * We cannot rely on the containing workspace being hidden to hide us - * because it is not necessarily our parent in the DOM. - */ -Blockly.Scrollbar.prototype.updateDisplay_ = function() { - var show = true; - // Check whether our parent/container is visible. - if (!this.containerVisible_) { - show = false; - } else { - show = this.isVisible(); - } - if (show) { - this.outerSvg_.setAttribute('display', 'block'); - } else { - this.outerSvg_.setAttribute('display', 'none'); - } -}; - -/** - * Scroll by one pageful. - * Called when scrollbar background is clicked. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Scrollbar.prototype.onMouseDownBar_ = function(e) { - this.workspace_.markFocused(); - Blockly.Touch.clearTouchIdentifier(); // This is really a click. - this.cleanUp_(); - if (Blockly.utils.isRightButton(e)) { - // Right-click. - // Scrollbars have no context menu. - e.stopPropagation(); - return; - } - var mouseXY = Blockly.utils.mouseToSvg(e, this.workspace_.getParentSvg(), - this.workspace_.getInverseScreenCTM()); - var mouseLocation = this.horizontal_ ? mouseXY.x : mouseXY.y; - - var handleXY = Blockly.utils.getInjectionDivXY_(this.svgHandle_); - var handleStart = this.horizontal_ ? handleXY.x : handleXY.y; - var handlePosition = this.handlePosition_; - - var pageLength = this.handleLength_ * 0.95; - if (mouseLocation <= handleStart) { - // Decrease the scrollbar's value by a page. - handlePosition -= pageLength; - } else if (mouseLocation >= handleStart + this.handleLength_) { - // Increase the scrollbar's value by a page. - handlePosition += pageLength; - } - // When the scrollbars are clicked, hide the WidgetDiv/DropDownDiv without - // animation in anticipation of a workspace move. - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - - this.setHandlePosition(this.constrainHandle_(handlePosition)); - this.onScroll_(); - e.stopPropagation(); - e.preventDefault(); -}; - -/** - * Start a dragging operation. - * Called when scrollbar handle is clicked. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.Scrollbar.prototype.onMouseDownHandle_ = function(e) { - this.workspace_.markFocused(); - this.cleanUp_(); - if (Blockly.utils.isRightButton(e)) { - // Right-click. - // Scrollbars have no context menu. - e.stopPropagation(); - return; - } - // Look up the current translation and record it. - this.startDragHandle = this.handlePosition_; - - // Tell the workspace to setup its drag surface since it is about to move. - // onMouseMoveHandle will call onScroll which actually tells the workspace - // to move. - this.workspace_.setupDragSurface(); - - // Record the current mouse position. - this.startDragMouse_ = this.horizontal_ ? e.clientX : e.clientY; - Blockly.Scrollbar.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, - 'mouseup', this, this.onMouseUpHandle_); - Blockly.Scrollbar.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, - 'mousemove', this, this.onMouseMoveHandle_); - // When the scrollbars are clicked, hide the WidgetDiv/DropDownDiv without - // animation in anticipation of a workspace move. - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - - e.stopPropagation(); - e.preventDefault(); -}; - -/** - * Drag the scrollbar's handle. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.Scrollbar.prototype.onMouseMoveHandle_ = function(e) { - var currentMouse = this.horizontal_ ? e.clientX : e.clientY; - var mouseDelta = currentMouse - this.startDragMouse_; - var handlePosition = this.startDragHandle + mouseDelta; - // Position the bar. - this.setHandlePosition(this.constrainHandle_(handlePosition)); - this.onScroll_(); -}; - -/** - * Release the scrollbar handle and reset state accordingly. - * @private - */ -Blockly.Scrollbar.prototype.onMouseUpHandle_ = function() { - // Tell the workspace to clean up now that the workspace is done moving. - this.workspace_.resetDragSurface(); - Blockly.Touch.clearTouchIdentifier(); - this.cleanUp_(); -}; - -/** - * Hide chaff and stop binding to mouseup and mousemove events. Call this to - * wrap up lose ends associated with the scrollbar. - * @private - */ -Blockly.Scrollbar.prototype.cleanUp_ = function() { - Blockly.hideChaff(true); - if (Blockly.Scrollbar.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_); - Blockly.Scrollbar.onMouseUpWrapper_ = null; - } - if (Blockly.Scrollbar.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.Scrollbar.onMouseMoveWrapper_); - Blockly.Scrollbar.onMouseMoveWrapper_ = null; - } -}; - -/** - * Constrain the handle's position within the minimum (0) and maximum - * (length of scrollbar) values allowed for the scrollbar. - * @param {number} value Value that is potentially out of bounds, in CSS pixels. - * @return {number} Constrained value, in CSS pixels. - * @private - */ -Blockly.Scrollbar.prototype.constrainHandle_ = function(value) { - if (value <= 0 || isNaN(value) || this.scrollViewSize_ < this.handleLength_) { - value = 0; - } else { - value = Math.min(value, this.scrollViewSize_ - this.handleLength_); - } - return value; -}; - -/** - * Called when scrollbar is moved. - * @private - */ -Blockly.Scrollbar.prototype.onScroll_ = function() { - var ratio = this.handlePosition_ / this.scrollViewSize_; - if (isNaN(ratio)) { - ratio = 0; - } - var xyRatio = {}; - if (this.horizontal_) { - xyRatio.x = ratio; - } else { - xyRatio.y = ratio; - } - this.workspace_.setMetrics(xyRatio); -}; - -/** - * Set the scrollbar handle's position. - * @param {number} value The distance from the top/left end of the bar, in CSS - * pixels. It may be larger than the maximum allowable position of the - * scrollbar handle. - */ -Blockly.Scrollbar.prototype.set = function(value) { - this.setHandlePosition(this.constrainHandle_(value * this.ratio_)); - this.onScroll_(); -}; - -/** - * Record the origin of the workspace that the scrollbar is in, in pixels - * relative to the injection div origin. This is for times when the scrollbar is - * used in an object whose origin isn't the same as the main workspace - * (e.g. in a flyout.) - * @param {number} x The x coordinate of the scrollbar's origin, in CSS pixels. - * @param {number} y The y coordinate of the scrollbar's origin, in CSS pixels. - */ -Blockly.Scrollbar.prototype.setOrigin = function(x, y) { - if (x != this.origin_.x || y != this.origin_.y) { - this.origin_ = new goog.math.Coordinate(x, y); - this.originHasChanged_ = true; - } -}; diff --git a/packages/scratch-blocks/core/toolbox.js b/packages/scratch-blocks/core/toolbox.js deleted file mode 100644 index 67fcb0338..000000000 --- a/packages/scratch-blocks/core/toolbox.js +++ /dev/null @@ -1,801 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Toolbox from whence to create blocks. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Toolbox'); - -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.HorizontalFlyout'); -goog.require('Blockly.Touch'); -goog.require('Blockly.VerticalFlyout'); -goog.require('goog.dom'); -goog.require('goog.dom.TagName'); -goog.require('goog.events'); -goog.require('goog.events.BrowserFeature'); -goog.require('goog.html.SafeHtml'); -goog.require('goog.html.SafeStyle'); -goog.require('goog.math.Rect'); -goog.require('goog.style'); -goog.require('goog.ui.tree.TreeControl'); -goog.require('goog.ui.tree.TreeNode'); - - -/** - * Class for a Toolbox. - * Creates the toolbox's DOM. - * @param {!Blockly.Workspace} workspace The workspace in which to create new - * blocks. - * @constructor - */ -Blockly.Toolbox = function(workspace) { - /** - * @type {!Blockly.Workspace} - * @private - */ - this.workspace_ = workspace; - - /** - * Whether toolbox categories should be represented by icons instead of text. - * @type {boolean} - * @private - */ - this.iconic_ = false; - - /** - * Is RTL vs LTR. - * @type {boolean} - */ - this.RTL = workspace.options.RTL; - - /** - * Whether the toolbox should be laid out horizontally. - * @type {boolean} - * @private - */ - this.horizontalLayout_ = workspace.options.horizontalLayout; - - /** - * Position of the toolbox and flyout relative to the workspace. - * @type {number} - */ - this.toolboxPosition = workspace.options.toolboxPosition; - -}; - -/** - * Width of the toolbox, which changes only in vertical layout. - * This is the sum of the width of the flyout (250) and the category menu (60). - * @type {number} - */ -Blockly.Toolbox.prototype.width = 310; - -/** - * Height of the toolbox, which changes only in horizontal layout. - * @type {number} - */ -Blockly.Toolbox.prototype.height = 0; - -Blockly.Toolbox.prototype.selectedItem_ = null; - -/** - * Initializes the toolbox. - */ -Blockly.Toolbox.prototype.init = function() { - var workspace = this.workspace_; - var svg = this.workspace_.getParentSvg(); - - /** - * HTML container for the Toolbox menu. - * @type {Element} - */ - this.HtmlDiv = - goog.dom.createDom(goog.dom.TagName.DIV, 'blocklyToolboxDiv'); - this.HtmlDiv.setAttribute('dir', workspace.RTL ? 'RTL' : 'LTR'); - svg.parentNode.insertBefore(this.HtmlDiv, svg); - - // Clicking on toolbox closes popups. - Blockly.bindEventWithChecks_(this.HtmlDiv, 'mousedown', this, - function(e) { - // Cancel any gestures in progress. - this.workspace_.cancelCurrentGesture(); - if (Blockly.utils.isRightButton(e) || e.target == this.HtmlDiv) { - // Close flyout. - Blockly.hideChaff(false); - } else { - // Just close popups. - Blockly.hideChaff(true); - } - Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. - }, /*opt_noCaptureIdentifier*/ false, /*opt_noPreventDefault*/ true); - - this.createFlyout_(); - this.categoryMenu_ = new Blockly.Toolbox.CategoryMenu(this, this.HtmlDiv); - this.populate_(workspace.options.languageTree); - this.position(); -}; - -/** - * Dispose of this toolbox. - */ -Blockly.Toolbox.prototype.dispose = function() { - this.flyout_.dispose(); - this.categoryMenu_.dispose(); - this.categoryMenu_ = null; - goog.dom.removeNode(this.HtmlDiv); - this.workspace_ = null; - this.lastCategory_ = null; -}; - -/** - * Create and configure a flyout based on the main workspace's options. - * @private - */ -Blockly.Toolbox.prototype.createFlyout_ = function() { - var workspace = this.workspace_; - - var options = { - disabledPatternId: workspace.options.disabledPatternId, - parentWorkspace: workspace, - RTL: workspace.RTL, - oneBasedIndex: workspace.options.oneBasedIndex, - horizontalLayout: workspace.horizontalLayout, - toolboxPosition: workspace.options.toolboxPosition, - stackGlowFilterId: workspace.options.stackGlowFilterId - }; - - if (workspace.horizontalLayout) { - this.flyout_ = new Blockly.HorizontalFlyout(options); - } else { - this.flyout_ = new Blockly.VerticalFlyout(options); - } - this.flyout_.setParentToolbox(this); - - goog.dom.insertSiblingAfter( - this.flyout_.createDom('svg'), this.workspace_.getParentSvg()); - this.flyout_.init(workspace); -}; - -/** - * Fill the toolbox with categories and blocks. - * @param {!Node} newTree DOM tree of blocks. - * @private - */ -Blockly.Toolbox.prototype.populate_ = function(newTree) { - this.categoryMenu_.populate(newTree); - this.showAll_(); - this.setSelectedItem(this.categoryMenu_.categories_[0], false); -}; - -/** - * Show all blocks for all categories in the flyout - * @private - */ -Blockly.Toolbox.prototype.showAll_ = function() { - var allContents = []; - for (var i = 0; i < this.categoryMenu_.categories_.length; i++) { - var category = this.categoryMenu_.categories_[i]; - - // create a label node to go at the top of the category - var labelString = ''; - var labelXML = Blockly.Xml.textToDom(labelString); - - allContents.push(labelXML.firstChild); - - allContents = allContents.concat(category.getContents()); - } - this.flyout_.show(allContents); -}; - -/** - * Get the width of the toolbox. - * @return {number} The width of the toolbox. - */ -Blockly.Toolbox.prototype.getWidth = function() { - return this.width; -}; - -/** - * Get the height of the toolbox, not including the block menu. - * @return {number} The height of the toolbox. - */ -Blockly.Toolbox.prototype.getHeight = function() { - return this.categoryMenu_ ? this.categoryMenu_.getHeight() : 0; -}; - -/** - * Move the toolbox to the edge. - */ -Blockly.Toolbox.prototype.position = function() { - var treeDiv = this.HtmlDiv; - if (!treeDiv) { - // Not initialized yet. - return; - } - var svg = this.workspace_.getParentSvg(); - var svgSize = Blockly.svgSize(svg); - if (this.horizontalLayout_) { - treeDiv.style.left = '0'; - treeDiv.style.height = 'auto'; - treeDiv.style.width = svgSize.width + 'px'; - this.height = treeDiv.offsetHeight; - if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { // Top - treeDiv.style.top = '0'; - } else { // Bottom - treeDiv.style.bottom = '0'; - } - } else { - if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { // Right - treeDiv.style.right = '0'; - } else { // Left - treeDiv.style.left = '0'; - } - treeDiv.style.height = '100%'; - } - this.flyout_.position(); -}; - -/** - * Unhighlight any previously specified option. - */ -Blockly.Toolbox.prototype.clearSelection = function() { - this.setSelectedItem(null); -}; - -/** - * Adds a style on the toolbox. Usually used to change the cursor. - * @param {string} style The name of the class to add. - * @package - */ -Blockly.Toolbox.prototype.addStyle = function(style) { - Blockly.utils.addClass(/** @type {!Element} */ (this.HtmlDiv), style); -}; - -/** - * Removes a style from the toolbox. Usually used to change the cursor. - * @param {string} style The name of the class to remove. - * @package - */ -Blockly.Toolbox.prototype.removeStyle = function(style) { - Blockly.utils.removeClass(/** @type {!Element} */ (this.HtmlDiv), style); -}; - -/** - * Return the deletion rectangle for this toolbox. - * @return {goog.math.Rect} Rectangle in which to delete. - */ -Blockly.Toolbox.prototype.getClientRect = function() { - if (!this.HtmlDiv) { - return null; - } - - // If not an auto closing flyout, always use the (larger) flyout client rect - if (!this.flyout_.autoClose) { - return this.flyout_.getClientRect(); - } - - // BIG_NUM is offscreen padding so that blocks dragged beyond the toolbox - // area are still deleted. Must be smaller than Infinity, but larger than - // the largest screen size. - var BIG_NUM = 10000000; - var toolboxRect = this.HtmlDiv.getBoundingClientRect(); - - var x = toolboxRect.left; - var y = toolboxRect.top; - var width = toolboxRect.width; - var height = toolboxRect.height; - - // Assumes that the toolbox is on the SVG edge. If this changes - // (e.g. toolboxes in mutators) then this code will need to be more complex. - if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { - return new goog.math.Rect(-BIG_NUM, -BIG_NUM, BIG_NUM + x + width, - 2 * BIG_NUM); - } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - return new goog.math.Rect(toolboxRect.right - width, -BIG_NUM, BIG_NUM + width, 2 * BIG_NUM); - } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { - return new goog.math.Rect(-BIG_NUM, -BIG_NUM, 2 * BIG_NUM, - BIG_NUM + y + height); - } else { // Bottom - return new goog.math.Rect(0, y, 2 * BIG_NUM, BIG_NUM); - } -}; - -/** - * Update the flyout's contents without closing it. Should be used in response - * to a change in one of the dynamic categories, such as variables or - * procedures. - */ -Blockly.Toolbox.prototype.refreshSelection = function() { - this.showAll_(); -}; - -/** - * @return {Blockly.Toolbox.Category} the currently selected category. - */ -Blockly.Toolbox.prototype.getSelectedItem = function() { - return this.selectedItem_; -}; - -/** - * @return {string} The name of the currently selected category. - */ -Blockly.Toolbox.prototype.getSelectedCategoryName = function() { - return this.selectedItem_.name_; -}; - -/** - * @return {string} The id of the currently selected category. - * @public - */ -Blockly.Toolbox.prototype.getSelectedCategoryId = function() { - return this.selectedItem_.id_; -}; - -/** - * @return {number} The distance flyout is scrolled below the top of the currently - * selected category. - */ -Blockly.Toolbox.prototype.getCategoryScrollOffset = function() { - var categoryPos = this.getCategoryPositionById(this.getSelectedCategoryId()); - return this.flyout_.getScrollPos() - categoryPos; -}; - -/** - * Get the position of a category by name. - * @param {string} name The name of the category. - * @return {number} The position of the category. - */ -Blockly.Toolbox.prototype.getCategoryPositionByName = function(name) { - var scrollPositions = this.flyout_.categoryScrollPositions; - for (var i = 0; i < scrollPositions.length; i++) { - if (name === scrollPositions[i].categoryName) { - return scrollPositions[i].position; - } - } -}; - -/** - * Get the position of a category by id. - * @param {string} id The id of the category. - * @return {number} The position of the category. - * @public - */ -Blockly.Toolbox.prototype.getCategoryPositionById = function(id) { - var scrollPositions = this.flyout_.categoryScrollPositions; - for (var i = 0; i < scrollPositions.length; i++) { - if (id === scrollPositions[i].categoryId) { - return scrollPositions[i].position; - } - } -}; - -/** - * Get the length of a category by name. - * @param {string} name The name of the category. - * @return {number} The length of the category. - */ -Blockly.Toolbox.prototype.getCategoryLengthByName = function(name) { - var scrollPositions = this.flyout_.categoryScrollPositions; - for (var i = 0; i < scrollPositions.length; i++) { - if (name === scrollPositions[i].categoryName) { - return scrollPositions[i].length; - } - } -}; - -/** - * Get the length of a category by id. - * @param {string} id The id of the category. - * @return {number} The length of the category. - * @public - */ -Blockly.Toolbox.prototype.getCategoryLengthById = function(id) { - var scrollPositions = this.flyout_.categoryScrollPositions; - for (var i = 0; i < scrollPositions.length; i++) { - if (id === scrollPositions[i].categoryId) { - return scrollPositions[i].length; - } - } -}; - -/** - * Set the scroll position of the flyout. - * @param {number} pos The position to set. - */ -Blockly.Toolbox.prototype.setFlyoutScrollPos = function(pos) { - this.flyout_.setScrollPos(pos); -}; - - -/** - * Set the currently selected category. - * @param {Blockly.Toolbox.Category} item The category to select. - * @param {boolean=} opt_shouldScroll Whether to scroll to the selected category. Defaults to true. - */ -Blockly.Toolbox.prototype.setSelectedItem = function(item, opt_shouldScroll) { - if (typeof opt_shouldScroll === 'undefined') { - opt_shouldScroll = true; - } - if (this.selectedItem_) { - // They selected a different category but one was already open. Close it. - this.selectedItem_.setSelected(false); - } - this.selectedItem_ = item; - if (this.selectedItem_ != null) { - this.selectedItem_.setSelected(true); - // Scroll flyout to the top of the selected category - var categoryId = item.id_; - if (opt_shouldScroll) { - this.scrollToCategoryById(categoryId); - } - } -}; - -/** - * Select and scroll to a category by name. - * @param {string} name The name of the category to select and scroll to. - */ -Blockly.Toolbox.prototype.setSelectedCategoryByName = function(name) { - this.selectCategoryByName(name); - this.scrollToCategoryByName(name); -}; - -/** - * Select and scroll to a category by id. - * @param {string} id The id of the category to select and scroll to. - * @public - */ -Blockly.Toolbox.prototype.setSelectedCategoryById = function(id) { - this.selectCategoryById(id); - this.scrollToCategoryById(id); -}; - -/** - * Scroll to a category by name. - * @param {string} name The name of the category to scroll to. - * @package - */ -Blockly.Toolbox.prototype.scrollToCategoryByName = function(name) { - var scrollPositions = this.flyout_.categoryScrollPositions; - for (var i = 0; i < scrollPositions.length; i++) { - if (name === scrollPositions[i].categoryName) { - this.flyout_.setVisible(true); - this.flyout_.scrollTo(scrollPositions[i].position); - return; - } - } -}; - -/** - * Scroll to a category by id. - * @param {string} id The id of the category to scroll to. - * @public - */ -Blockly.Toolbox.prototype.scrollToCategoryById = function(id) { - var scrollPositions = this.flyout_.categoryScrollPositions; - for (var i = 0; i < scrollPositions.length; i++) { - if (id === scrollPositions[i].categoryId) { - this.flyout_.setVisible(true); - this.flyout_.scrollTo(scrollPositions[i].position); - return; - } - } -}; - -/** - * Get a category by its index. - * @param {number} index The index of the category. - * @return {Blockly.Toolbox.Category} the category, or null if there are no categories. - * @package - */ -Blockly.Toolbox.prototype.getCategoryByIndex = function(index) { - if (!this.categoryMenu_.categories_) return null; - return this.categoryMenu_.categories_[index]; -}; - -/** - * Select a category by name. - * @param {string} name The name of the category to select. - * @package - */ -Blockly.Toolbox.prototype.selectCategoryByName = function(name) { - for (var i = 0; i < this.categoryMenu_.categories_.length; i++) { - var category = this.categoryMenu_.categories_[i]; - if (name === category.name_) { - this.selectedItem_.setSelected(false); - this.selectedItem_ = category; - this.selectedItem_.setSelected(true); - } - } -}; - -/** - * Select a category by id. - * @param {string} id The id of the category to select. - * @package - */ -Blockly.Toolbox.prototype.selectCategoryById = function(id) { - for (var i = 0; i < this.categoryMenu_.categories_.length; i++) { - var category = this.categoryMenu_.categories_[i]; - if (id === category.id_) { - this.selectedItem_.setSelected(false); - this.selectedItem_ = category; - this.selectedItem_.setSelected(true); - } - } -}; - -/** - * Wrapper function for calling setSelectedItem from a touch handler. - * @param {Blockly.Toolbox.Category} item The category to select. - * @return {function} A function that can be passed to bindEvent. - */ -Blockly.Toolbox.prototype.setSelectedItemFactory = function(item) { - var selectedItem = item; - return function() { - if (!this.workspace_.isDragging()) { - this.setSelectedItem(selectedItem); - Blockly.Touch.clearTouchIdentifier(); - } - }; -}; - -// Category menu -/** - * Class for a table of category titles that will control which category is - * displayed. - * @param {Blockly.Toolbox} parent The toolbox that owns the category menu. - * @param {Element} parentHtml The containing html div. - * @constructor - */ -Blockly.Toolbox.CategoryMenu = function(parent, parentHtml) { - this.parent_ = parent; - this.height_ = 0; - this.parentHtml_ = parentHtml; - this.createDom(); - this.categories_ = []; -}; - -/** - * @return {number} the height of the category menu. - */ -Blockly.Toolbox.CategoryMenu.prototype.getHeight = function() { - return this.height_; -}; - -/** - * Create the DOM for the category menu. - */ -Blockly.Toolbox.CategoryMenu.prototype.createDom = function() { - this.table = goog.dom.createDom('div', this.parent_.horizontalLayout_ ? - 'scratchCategoryMenuHorizontal' : 'scratchCategoryMenu'); - this.parentHtml_.appendChild(this.table); -}; - -/** - * Fill the toolbox with categories and blocks by creating a new - * {Blockly.Toolbox.Category} for every category tag in the toolbox xml. - * @param {Node} domTree DOM tree of blocks, or null. - */ -Blockly.Toolbox.CategoryMenu.prototype.populate = function(domTree) { - if (!domTree) { - return; - } - - // Remove old categories - this.dispose(); - this.createDom(); - var categories = []; - // Find actual categories from the DOM tree. - for (var i = 0, child; child = domTree.childNodes[i]; i++) { - if (!child.tagName || child.tagName.toUpperCase() != 'CATEGORY') { - continue; - } - categories.push(child); - } - - // Create a single column of categories - for (var i = 0; i < categories.length; i++) { - var child = categories[i]; - var row = goog.dom.createDom('div', 'scratchCategoryMenuRow'); - this.table.appendChild(row); - if (child) { - this.categories_.push(new Blockly.Toolbox.Category(this, row, - child)); - } - } - this.height_ = this.table.offsetHeight; -}; - -/** - * Dispose of this Category Menu and all of its children. - */ -Blockly.Toolbox.CategoryMenu.prototype.dispose = function() { - for (var i = 0, category; category = this.categories_[i]; i++) { - category.dispose(); - } - this.categories_ = []; - if (this.table) { - goog.dom.removeNode(this.table); - this.table = null; - } -}; - - -// Category -/** - * Class for the data model of a category in the toolbox. - * @param {Blockly.Toolbox.CategoryMenu} parent The category menu that owns this - * category. - * @param {Element} parentHtml The containing html div. - * @param {Node} domTree DOM tree of blocks. - * @constructor - */ -Blockly.Toolbox.Category = function(parent, parentHtml, domTree) { - this.parent_ = parent; - this.parentHtml_ = parentHtml; - this.name_ = domTree.getAttribute('name'); - this.id_ = domTree.getAttribute('id'); - this.setColour(domTree); - this.custom_ = domTree.getAttribute('custom'); - this.iconURI_ = domTree.getAttribute('iconURI'); - this.showStatusButton_ = domTree.getAttribute('showStatusButton'); - this.contents_ = []; - if (!this.custom_) { - this.parseContents_(domTree); - } - this.createDom(); -}; - -/** - * Dispose of this category and all of its contents. - */ -Blockly.Toolbox.Category.prototype.dispose = function() { - if (this.item_) { - goog.dom.removeNode(this.item_); - this.item = null; - } - this.parent_ = null; - this.parentHtml_ = null; - this.contents_ = null; -}; - -/** - * Used to determine the css classes for the menu item for this category - * based on its current state. - * @private - * @param {boolean=} selected Indication whether the category is currently selected. - * @return {string} The css class names to be applied, space-separated. - */ -Blockly.Toolbox.Category.prototype.getMenuItemClassName_ = function(selected) { - var classNames = [ - 'scratchCategoryMenuItem', - 'scratchCategoryId-' + this.id_, - ]; - if (selected) { - classNames.push('categorySelected'); - } - return classNames.join(' '); -}; - -/** - * Create the DOM for a category in the toolbox. - */ -Blockly.Toolbox.Category.prototype.createDom = function() { - var toolbox = this.parent_.parent_; - this.item_ = goog.dom.createDom('div', - {'class': this.getMenuItemClassName_()}); - this.label_ = goog.dom.createDom('div', - {'class': 'scratchCategoryMenuItemLabel'}, - Blockly.utils.replaceMessageReferences(this.name_)); - if (this.iconURI_) { - this.bubble_ = goog.dom.createDom('div', - {'class': 'scratchCategoryItemIcon'}); - this.bubble_.style.backgroundImage = 'url(' + this.iconURI_ + ')'; - } else { - this.bubble_ = goog.dom.createDom('div', - {'class': 'scratchCategoryItemBubble'}); - this.bubble_.style.backgroundColor = this.colour_; - this.bubble_.style.borderColor = this.secondaryColour_; - } - this.item_.appendChild(this.bubble_); - this.item_.appendChild(this.label_); - this.parentHtml_.appendChild(this.item_); - Blockly.bindEvent_( - this.item_, 'mouseup', toolbox, toolbox.setSelectedItemFactory(this)); -}; - -/** - * Set the selected state of this category. - * @param {boolean} selected Whether this category is selected. - */ -Blockly.Toolbox.Category.prototype.setSelected = function(selected) { - this.item_.className = this.getMenuItemClassName_(selected); -}; - -/** - * Set the contents of this category from DOM. - * @param {Node} domTree DOM tree of blocks. - * @constructor - */ -Blockly.Toolbox.Category.prototype.parseContents_ = function(domTree) { - for (var i = 0, child; child = domTree.childNodes[i]; i++) { - if (!child.tagName) { - // Skip - continue; - } - switch (child.tagName.toUpperCase()) { - case 'BLOCK': - case 'SHADOW': - case 'LABEL': - case 'BUTTON': - case 'SEP': - case 'TEXT': - this.contents_.push(child); - break; - default: - break; - } - } -}; - -/** - * Get the contents of this category. - * @return {!Array|string} xmlList List of blocks to show, or a string with the - * name of a custom category. - */ -Blockly.Toolbox.Category.prototype.getContents = function() { - return this.custom_ ? this.custom_ : this.contents_; -}; - -/** - * Set the colour of the category's background from a DOM node. - * @param {Node} node DOM node with "colour" and "secondaryColour" attribute. - * Colours are a hex string or hue on a colour wheel (0-360). - */ -Blockly.Toolbox.Category.prototype.setColour = function(node) { - var colour = node.getAttribute('colour'); - var secondaryColour = node.getAttribute('secondaryColour'); - if (goog.isString(colour)) { - if (colour.match(/^#[0-9a-fA-F]{6}$/)) { - this.colour_ = colour; - } else { - this.colour_ = Blockly.hueToRgb(colour); - } - if (secondaryColour.match(/^#[0-9a-fA-F]{6}$/)) { - this.secondaryColour_ = secondaryColour; - } else { - this.secondaryColour_ = Blockly.hueToRgb(secondaryColour); - } - this.hasColours_ = true; - } else { - this.colour_ = '#000000'; - this.secondaryColour_ = '#000000'; - } -}; diff --git a/packages/scratch-blocks/core/tooltip.js b/packages/scratch-blocks/core/tooltip.js deleted file mode 100644 index 2e3d3da49..000000000 --- a/packages/scratch-blocks/core/tooltip.js +++ /dev/null @@ -1,337 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Library to create tooltips for Blockly. - * First, call Blockly.Tooltip.init() after onload. - * Second, set the 'tooltip' property on any SVG element that needs a tooltip. - * If the tooltip is a string, then that message will be displayed. - * If the tooltip is an SVG element, then that object's tooltip will be used. - * Third, call Blockly.Tooltip.bindMouseEvents(e) passing the SVG element. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.Tooltip - * @namespace - **/ -goog.provide('Blockly.Tooltip'); - -goog.require('goog.dom'); -goog.require('goog.dom.TagName'); - - -/** - * Is a tooltip currently showing? - */ -Blockly.Tooltip.visible = false; - -/** - * Is someone else blocking the tooltip from being shown? - * @type {boolean} - * @private - */ -Blockly.Tooltip.blocked_ = false; - -/** - * Maximum width (in characters) of a tooltip. - */ -Blockly.Tooltip.LIMIT = 50; - -/** - * PID of suspended thread to clear tooltip on mouse out. - * @private - */ -Blockly.Tooltip.mouseOutPid_ = 0; - -/** - * PID of suspended thread to show the tooltip. - * @private - */ -Blockly.Tooltip.showPid_ = 0; - -/** - * Last observed X location of the mouse pointer (freezes when tooltip appears). - * @private - */ -Blockly.Tooltip.lastX_ = 0; - -/** - * Last observed Y location of the mouse pointer (freezes when tooltip appears). - * @private - */ -Blockly.Tooltip.lastY_ = 0; - -/** - * Current element being pointed at. - * @private - */ -Blockly.Tooltip.element_ = null; - -/** - * Once a tooltip has opened for an element, that element is 'poisoned' and - * cannot respawn a tooltip until the pointer moves over a different element. - * @private - */ -Blockly.Tooltip.poisonedElement_ = null; - -/** - * Horizontal offset between mouse cursor and tooltip. - */ -Blockly.Tooltip.OFFSET_X = 0; - -/** - * Vertical offset between mouse cursor and tooltip. - */ -Blockly.Tooltip.OFFSET_Y = 10; - -/** - * Radius mouse can move before killing tooltip. - */ -Blockly.Tooltip.RADIUS_OK = 10; - -/** - * Delay before tooltip appears. - */ -Blockly.Tooltip.HOVER_MS = 750; - -/** - * Horizontal padding between tooltip and screen edge. - */ -Blockly.Tooltip.MARGINS = 5; - -/** - * The HTML container. Set once by Blockly.Tooltip.createDom. - * @type {Element} - */ -Blockly.Tooltip.DIV = null; - -/** - * Create the tooltip div and inject it onto the page. - */ -Blockly.Tooltip.createDom = function() { - if (Blockly.Tooltip.DIV) { - return; // Already created. - } - // Create an HTML container for popup overlays (e.g. editor widgets). - Blockly.Tooltip.DIV = - goog.dom.createDom(goog.dom.TagName.DIV, 'blocklyTooltipDiv'); - document.body.appendChild(Blockly.Tooltip.DIV); -}; - -/** - * Binds the required mouse events onto an SVG element. - * @param {!Element} element SVG element onto which tooltip is to be bound. - */ -Blockly.Tooltip.bindMouseEvents = function(element) { - Blockly.bindEvent_(element, 'mouseover', null, - Blockly.Tooltip.onMouseOver_); - Blockly.bindEvent_(element, 'mouseout', null, - Blockly.Tooltip.onMouseOut_); - - // Don't use bindEvent_ for mousemove since that would create a - // corresponding touch handler, even though this only makes sense in the - // context of a mouseover/mouseout. - element.addEventListener('mousemove', Blockly.Tooltip.onMouseMove_, false); -}; - -/** - * Hide the tooltip if the mouse is over a different object. - * Initialize the tooltip to potentially appear for this object. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.Tooltip.onMouseOver_ = function(e) { - if (Blockly.Tooltip.blocked_) { - // Someone doesn't want us to show tooltips. - return; - } - // If the tooltip is an object, treat it as a pointer to the next object in - // the chain to look at. Terminate when a string or function is found. - var element = e.target; - while (!goog.isString(element.tooltip) && !goog.isFunction(element.tooltip)) { - element = element.tooltip; - } - if (Blockly.Tooltip.element_ != element) { - Blockly.Tooltip.hide(); - Blockly.Tooltip.poisonedElement_ = null; - Blockly.Tooltip.element_ = element; - } - // Forget about any immediately preceding mouseOut event. - clearTimeout(Blockly.Tooltip.mouseOutPid_); -}; - -/** - * Hide the tooltip if the mouse leaves the object and enters the workspace. - * @param {!Event} _e Mouse event. - * @private - */ -Blockly.Tooltip.onMouseOut_ = function(_e) { - if (Blockly.Tooltip.blocked_) { - // Someone doesn't want us to show tooltips. - return; - } - // Moving from one element to another (overlapping or with no gap) generates - // a mouseOut followed instantly by a mouseOver. Fork off the mouseOut - // event and kill it if a mouseOver is received immediately. - // This way the task only fully executes if mousing into the void. - Blockly.Tooltip.mouseOutPid_ = setTimeout(function() { - Blockly.Tooltip.element_ = null; - Blockly.Tooltip.poisonedElement_ = null; - Blockly.Tooltip.hide(); - }, 1); - clearTimeout(Blockly.Tooltip.showPid_); -}; - -/** - * When hovering over an element, schedule a tooltip to be shown. If a tooltip - * is already visible, hide it if the mouse strays out of a certain radius. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.Tooltip.onMouseMove_ = function(e) { - if (!Blockly.Tooltip.element_ || !Blockly.Tooltip.element_.tooltip) { - // No tooltip here to show. - return; - } else if (Blockly.WidgetDiv.isVisible()) { - // Don't display a tooltip if a widget is open (tooltip would be under it). - return; - } else if (Blockly.Tooltip.blocked_) { - // Someone doesn't want us to show tooltips. We are probably handling a - // user gesture, such as a click or drag. - return; - } - if (Blockly.Tooltip.visible) { - // Compute the distance between the mouse position when the tooltip was - // shown and the current mouse position. Pythagorean theorem. - var dx = Blockly.Tooltip.lastX_ - e.pageX; - var dy = Blockly.Tooltip.lastY_ - e.pageY; - if (Math.sqrt(dx * dx + dy * dy) > Blockly.Tooltip.RADIUS_OK) { - Blockly.Tooltip.hide(); - } - } else if (Blockly.Tooltip.poisonedElement_ != Blockly.Tooltip.element_) { - // The mouse moved, clear any previously scheduled tooltip. - clearTimeout(Blockly.Tooltip.showPid_); - // Maybe this time the mouse will stay put. Schedule showing of tooltip. - Blockly.Tooltip.lastX_ = e.pageX; - Blockly.Tooltip.lastY_ = e.pageY; - Blockly.Tooltip.showPid_ = - setTimeout(Blockly.Tooltip.show_, Blockly.Tooltip.HOVER_MS); - } -}; - -/** - * Hide the tooltip. - */ -Blockly.Tooltip.hide = function() { - if (Blockly.Tooltip.visible) { - Blockly.Tooltip.visible = false; - if (Blockly.Tooltip.DIV) { - Blockly.Tooltip.DIV.style.display = 'none'; - } - } - if (Blockly.Tooltip.showPid_) { - clearTimeout(Blockly.Tooltip.showPid_); - } -}; - -/** - * Hide any in-progress tooltips and block showing new tooltips until the next - * call to unblock(). - * @package - */ -Blockly.Tooltip.block = function() { - Blockly.Tooltip.hide(); - Blockly.Tooltip.blocked_ = true; -}; - -/** - * Unblock tooltips: allow them to be scheduled and shown according to their own - * logic. - * @package - */ -Blockly.Tooltip.unblock = function() { - Blockly.Tooltip.blocked_ = false; -}; - -/** - * Create the tooltip and show it. - * @private - */ -Blockly.Tooltip.show_ = function() { - if (Blockly.Tooltip.blocked_) { - // Someone doesn't want us to show tooltips. - return; - } - Blockly.Tooltip.poisonedElement_ = Blockly.Tooltip.element_; - if (!Blockly.Tooltip.DIV) { - return; - } - // Erase all existing text. - goog.dom.removeChildren(/** @type {!Element} */ (Blockly.Tooltip.DIV)); - // Get the new text. - var tip = Blockly.Tooltip.element_.tooltip; - while (goog.isFunction(tip)) { - tip = tip(); - } - tip = Blockly.utils.wrap(tip, Blockly.Tooltip.LIMIT); - // Create new text, line by line. - var lines = tip.split('\n'); - for (var i = 0; i < lines.length; i++) { - var div = document.createElement('div'); - div.appendChild(document.createTextNode(lines[i])); - Blockly.Tooltip.DIV.appendChild(div); - } - var rtl = Blockly.Tooltip.element_.RTL; - var windowSize = goog.dom.getViewportSize(); - // Display the tooltip. - Blockly.Tooltip.DIV.style.direction = rtl ? 'rtl' : 'ltr'; - Blockly.Tooltip.DIV.style.display = 'block'; - Blockly.Tooltip.visible = true; - // Move the tooltip to just below the cursor. - var anchorX = Blockly.Tooltip.lastX_; - if (rtl) { - anchorX -= Blockly.Tooltip.OFFSET_X + Blockly.Tooltip.DIV.offsetWidth; - } else { - anchorX += Blockly.Tooltip.OFFSET_X; - } - var anchorY = Blockly.Tooltip.lastY_ + Blockly.Tooltip.OFFSET_Y; - - if (anchorY + Blockly.Tooltip.DIV.offsetHeight > - windowSize.height + window.scrollY) { - // Falling off the bottom of the screen; shift the tooltip up. - anchorY -= Blockly.Tooltip.DIV.offsetHeight + 2 * Blockly.Tooltip.OFFSET_Y; - } - if (rtl) { - // Prevent falling off left edge in RTL mode. - anchorX = Math.max(Blockly.Tooltip.MARGINS - window.scrollX, anchorX); - } else { - if (anchorX + Blockly.Tooltip.DIV.offsetWidth > - windowSize.width + window.scrollX - 2 * Blockly.Tooltip.MARGINS) { - // Falling off the right edge of the screen; - // clamp the tooltip on the edge. - anchorX = windowSize.width - Blockly.Tooltip.DIV.offsetWidth - - 2 * Blockly.Tooltip.MARGINS; - } - } - Blockly.Tooltip.DIV.style.top = anchorY + 'px'; - Blockly.Tooltip.DIV.style.left = anchorX + 'px'; -}; diff --git a/packages/scratch-blocks/core/touch.js b/packages/scratch-blocks/core/touch.js deleted file mode 100644 index debad6b9c..000000000 --- a/packages/scratch-blocks/core/touch.js +++ /dev/null @@ -1,226 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Touch handling for Blockly. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -/** - * @name Blockly.Touch - * @namespace - **/ -goog.provide('Blockly.Touch'); - -goog.require('goog.events'); -goog.require('goog.events.BrowserFeature'); -goog.require('goog.string'); - - -/** - * Which touch events are we currently paying attention to? - * @type {DOMString} - * @private - */ -Blockly.Touch.touchIdentifier_ = null; - -/** - * The TOUCH_MAP lookup dictionary specifies additional touch events to fire, - * in conjunction with mouse events. - * @type {Object} - */ -Blockly.Touch.TOUCH_MAP = {}; -if (goog.events.BrowserFeature.TOUCH_ENABLED) { - Blockly.Touch.TOUCH_MAP = { - 'mousedown': ['touchstart'], - 'mousemove': ['touchmove'], - 'mouseup': ['touchend', 'touchcancel'] - }; -} - -/** - * PID of queued long-press task. - * @private - */ -Blockly.longPid_ = 0; - -/** - * Context menus on touch devices are activated using a long-press. - * Unfortunately the contextmenu touch event is currently (2015) only supported - * by Chrome. This function is fired on any touchstart event, queues a task, - * which after about a second opens the context menu. The tasks is killed - * if the touch event terminates early. - * @param {!Event} e Touch start event. - * @param {Blockly.Gesture} gesture The gesture that triggered this longStart. - * @private - */ -Blockly.longStart_ = function(e, gesture) { - Blockly.longStop_(); - // Punt on multitouch events. - if (e.changedTouches.length != 1) { - return; - } - Blockly.longPid_ = setTimeout(function() { - e.button = 2; // Simulate a right button click. - // e was a touch event. It needs to pretend to be a mouse event. - e.clientX = e.changedTouches[0].clientX; - e.clientY = e.changedTouches[0].clientY; - - // Let the gesture route the right-click correctly. - if (gesture) { - gesture.handleRightClick(e); - } - }, Blockly.LONGPRESS); -}; - -/** - * Nope, that's not a long-press. Either touchend or touchcancel was fired, - * or a drag hath begun. Kill the queued long-press task. - * @private - */ -Blockly.longStop_ = function() { - if (Blockly.longPid_) { - clearTimeout(Blockly.longPid_); - Blockly.longPid_ = 0; - } -}; - -/** - * Clear the touch identifier that tracks which touch stream to pay attention - * to. This ends the current drag/gesture and allows other pointers to be - * captured. - */ -Blockly.Touch.clearTouchIdentifier = function() { - Blockly.Touch.touchIdentifier_ = null; -}; - -/** - * Decide whether Blockly should handle or ignore this event. - * Mouse and touch events require special checks because we only want to deal - * with one touch stream at a time. All other events should always be handled. - * @param {!Event} e The event to check. - * @return {boolean} True if this event should be passed through to the - * registered handler; false if it should be blocked. - */ -Blockly.Touch.shouldHandleEvent = function(e) { - return !Blockly.Touch.isMouseOrTouchEvent(e) || - Blockly.Touch.checkTouchIdentifier(e); -}; - -/** - * Get the touch identifier from the given event. If it was a mouse event, the - * identifier is the string 'mouse'. - * @param {!Event} e Mouse event or touch event. - * @return {string} The touch identifier from the first changed touch, if - * defined. Otherwise 'mouse'. - */ -Blockly.Touch.getTouchIdentifierFromEvent = function(e) { - return (e.changedTouches && e.changedTouches[0] && - e.changedTouches[0].identifier != undefined && - e.changedTouches[0].identifier != null) ? - e.changedTouches[0].identifier : 'mouse'; -}; - -/** - * Check whether the touch identifier on the event matches the current saved - * identifier. If there is no identifier, that means it's a mouse event and - * we'll use the identifier "mouse". This means we won't deal well with - * multiple mice being used at the same time. That seems okay. - * If the current identifier was unset, save the identifier from the - * event. This starts a drag/gesture, during which touch events with other - * identifiers will be silently ignored. - * @param {!Event} e Mouse event or touch event. - * @return {boolean} Whether the identifier on the event matches the current - * saved identifier. - */ -Blockly.Touch.checkTouchIdentifier = function(e) { - var identifier = Blockly.Touch.getTouchIdentifierFromEvent(e); - - // if (Blockly.touchIdentifier_ )is insufficient because Android touch - // identifiers may be zero. - if (Blockly.Touch.touchIdentifier_ != undefined && - Blockly.Touch.touchIdentifier_ != null) { - // We're already tracking some touch/mouse event. Is this from the same - // source? - return Blockly.Touch.touchIdentifier_ == identifier; - } - if (e.type == 'mousedown' || e.type == 'touchstart') { - // No identifier set yet, and this is the start of a drag. Set it and - // return. - Blockly.Touch.touchIdentifier_ = identifier; - return true; - } - // There was no identifier yet, but this wasn't a start event so we're going - // to ignore it. This probably means that another drag finished while this - // pointer was down. - return false; -}; - -/** - * Set an event's clientX and clientY from its first changed touch. Use this to - * make a touch event work in a mouse event handler. - * @param {!Event} e A touch event. - */ -Blockly.Touch.setClientFromTouch = function(e) { - if (Blockly.utils.startsWith(e.type, 'touch')) { - // Map the touch event's properties to the event. - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; - } -}; - -/** - * Check whether a given event is a mouse or touch event. - * @param {!Event} e An event. - * @return {boolean} true if it is a mouse or touch event; false otherwise. - */ -Blockly.Touch.isMouseOrTouchEvent = function(e) { - return Blockly.utils.startsWith(e.type, 'touch') || - Blockly.utils.startsWith(e.type, 'mouse'); -}; - -/** - * Split an event into an array of events, one per changed touch or mouse - * point. - * @param {!Event} e A mouse event or a touch event with one or more changed - * touches. - * @return {!Array.} An array of mouse or touch events. Each touch - * event will have exactly one changed touch. - */ -Blockly.Touch.splitEventByTouches = function(e) { - var events = []; - if (e.changedTouches) { - for (var i = 0; i < e.changedTouches.length; i++) { - var newEvent = { - type: e.type, - changedTouches: [e.changedTouches[i]], - target: e.target, - stopPropagation: function(){ e.stopPropagation(); }, - preventDefault: function(){ e.preventDefault(); } - }; - events[i] = newEvent; - } - } else { - events.push(e); - } - return events; -}; diff --git a/packages/scratch-blocks/core/trashcan.js b/packages/scratch-blocks/core/trashcan.js deleted file mode 100644 index 4a39ce1ff..000000000 --- a/packages/scratch-blocks/core/trashcan.js +++ /dev/null @@ -1,343 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a trash can icon. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Trashcan'); - -goog.require('goog.dom'); -goog.require('goog.math.Rect'); - - -/** - * Class for a trash can. - * @param {!Blockly.Workspace} workspace The workspace to sit in. - * @constructor - */ -Blockly.Trashcan = function(workspace) { - this.workspace_ = workspace; -}; - -/** - * Width of both the trash can and lid images. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.WIDTH_ = 47; - -/** - * Height of the trashcan image (minus lid). - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.BODY_HEIGHT_ = 44; - -/** - * Height of the lid image. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.LID_HEIGHT_ = 16; - -/** - * Distance between trashcan and bottom edge of workspace. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.MARGIN_BOTTOM_ = 20; - -/** - * Distance between trashcan and right edge of workspace. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.MARGIN_SIDE_ = 20; - -/** - * Extent of hotspot on all sides beyond the size of the image. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.MARGIN_HOTSPOT_ = 10; - -/** - * Location of trashcan in sprite image. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.SPRITE_LEFT_ = 0; - -/** - * Location of trashcan in sprite image. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.SPRITE_TOP_ = 32; - -/** - * Current open/close state of the lid. - * @type {boolean} - */ -Blockly.Trashcan.prototype.isOpen = false; - -/** - * The SVG group containing the trash can. - * @type {Element} - * @private - */ -Blockly.Trashcan.prototype.svgGroup_ = null; - -/** - * The SVG image element of the trash can lid. - * @type {Element} - * @private - */ -Blockly.Trashcan.prototype.svgLid_ = null; - -/** - * Task ID of opening/closing animation. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.lidTask_ = 0; - -/** - * Current state of lid opening (0.0 = closed, 1.0 = open). - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.lidOpen_ = 0; - -/** - * Left coordinate of the trash can. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.left_ = 0; - -/** - * Top coordinate of the trash can. - * @type {number} - * @private - */ -Blockly.Trashcan.prototype.top_ = 0; - -/** - * Create the trash can elements. - * @return {!Element} The trash can's SVG group. - */ -Blockly.Trashcan.prototype.createDom = function() { - /* Here's the markup that will be generated: - - - - - - - - - - - */ - this.svgGroup_ = Blockly.utils.createSvgElement('g', - {'class': 'blocklyTrash'}, null); - var clip; - var rnd = String(Math.random()).substring(2); - clip = Blockly.utils.createSvgElement('clipPath', - {'id': 'blocklyTrashBodyClipPath' + rnd}, - this.svgGroup_); - Blockly.utils.createSvgElement('rect', - { - 'width': this.WIDTH_, - 'height': this.BODY_HEIGHT_, - 'y': this.LID_HEIGHT_ - }, - clip); - var body = Blockly.utils.createSvgElement('image', - { - 'width': Blockly.SPRITE.width, - 'x': -this.SPRITE_LEFT_, - 'height': Blockly.SPRITE.height, - 'y': -this.SPRITE_TOP_, - 'clip-path': 'url(#blocklyTrashBodyClipPath' + rnd + ')' - }, - this.svgGroup_); - body.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - this.workspace_.options.pathToMedia + Blockly.SPRITE.url); - - clip = Blockly.utils.createSvgElement('clipPath', - {'id': 'blocklyTrashLidClipPath' + rnd}, - this.svgGroup_); - Blockly.utils.createSvgElement('rect', - {'width': this.WIDTH_, 'height': this.LID_HEIGHT_}, clip); - this.svgLid_ = Blockly.utils.createSvgElement('image', - { - 'width': Blockly.SPRITE.width, - 'x': -this.SPRITE_LEFT_, - 'height': Blockly.SPRITE.height, - 'y': -this.SPRITE_TOP_, - 'clip-path': 'url(#blocklyTrashLidClipPath' + rnd + ')' - }, - this.svgGroup_); - this.svgLid_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - this.workspace_.options.pathToMedia + Blockly.SPRITE.url); - - Blockly.bindEventWithChecks_(this.svgGroup_, 'mouseup', this, this.click); - this.animateLid_(); - return this.svgGroup_; -}; - -/** - * Initialize the trash can. - * @param {number} bottom Distance from workspace bottom to bottom of trashcan. - * @return {number} Distance from workspace bottom to the top of trashcan. - */ -Blockly.Trashcan.prototype.init = function(bottom) { - this.bottom_ = this.MARGIN_BOTTOM_ + bottom; - this.setOpen_(false); - return this.bottom_ + this.BODY_HEIGHT_ + this.LID_HEIGHT_; -}; - -/** - * Dispose of this trash can. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Trashcan.prototype.dispose = function() { - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.svgLid_ = null; - this.workspace_ = null; - clearTimeout(this.lidTask_); -}; - -/** - * Move the trash can to the bottom-right corner. - */ -Blockly.Trashcan.prototype.position = function() { - var metrics = this.workspace_.getMetrics(); - if (!metrics) { - // There are no metrics available (workspace is probably not visible). - return; - } - if (this.workspace_.RTL) { - this.left_ = this.MARGIN_SIDE_ + Blockly.Scrollbar.scrollbarThickness; - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { - this.left_ += metrics.flyoutWidth; - if (this.workspace_.toolbox_) { - this.left_ += metrics.absoluteLeft; - } - } - } else { - this.left_ = metrics.viewWidth + metrics.absoluteLeft - - this.WIDTH_ - this.MARGIN_SIDE_ - Blockly.Scrollbar.scrollbarThickness; - - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - this.left_ -= metrics.flyoutWidth; - } - } - this.top_ = metrics.viewHeight + metrics.absoluteTop - - (this.BODY_HEIGHT_ + this.LID_HEIGHT_) - this.bottom_; - - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - this.top_ -= metrics.flyoutHeight; - } - this.svgGroup_.setAttribute('transform', - 'translate(' + this.left_ + ',' + this.top_ + ')'); -}; - -/** - * Return the deletion rectangle for this trash can. - * @return {goog.math.Rect} Rectangle in which to delete. - */ -Blockly.Trashcan.prototype.getClientRect = function() { - if (!this.svgGroup_) { - return null; - } - - var trashRect = this.svgGroup_.getBoundingClientRect(); - var left = trashRect.left + this.SPRITE_LEFT_ - this.MARGIN_HOTSPOT_; - var top = trashRect.top + this.SPRITE_TOP_ - this.MARGIN_HOTSPOT_; - var width = this.WIDTH_ + 2 * this.MARGIN_HOTSPOT_; - var height = this.LID_HEIGHT_ + this.BODY_HEIGHT_ + 2 * this.MARGIN_HOTSPOT_; - return new goog.math.Rect(left, top, width, height); - -}; - -/** - * Flip the lid open or shut. - * @param {boolean} state True if open. - * @private - */ -Blockly.Trashcan.prototype.setOpen_ = function(state) { - if (this.isOpen == state) { - return; - } - clearTimeout(this.lidTask_); - this.isOpen = state; - this.animateLid_(); -}; - -/** - * Rotate the lid open or closed by one step. Then wait and recurse. - * @private - */ -Blockly.Trashcan.prototype.animateLid_ = function() { - this.lidOpen_ += this.isOpen ? 0.2 : -0.2; - this.lidOpen_ = Math.min(Math.max(this.lidOpen_, 0), 1); - var lidAngle = this.lidOpen_ * 45; - this.svgLid_.setAttribute('transform', 'rotate(' + - (this.workspace_.RTL ? -lidAngle : lidAngle) + ',' + - (this.workspace_.RTL ? 4 : this.WIDTH_ - 4) + ',' + - (this.LID_HEIGHT_ - 2) + ')'); - // Linear interpolation between 0.4 and 0.8. - var opacity = 0.4 + this.lidOpen_ * (0.8 - 0.4); - this.svgGroup_.style.opacity = opacity; - if (this.lidOpen_ > 0 && this.lidOpen_ < 1) { - this.lidTask_ = setTimeout(this.animateLid_.bind(this), 20); - } -}; - -/** - * Flip the lid shut. - * Called externally after a drag. - */ -Blockly.Trashcan.prototype.close = function() { - this.setOpen_(false); -}; - -/** - * Inspect the contents of the trash. - */ -Blockly.Trashcan.prototype.click = function() { - var dx = this.workspace_.startScrollX - this.workspace_.scrollX; - var dy = this.workspace_.startScrollY - this.workspace_.scrollY; - if (Math.sqrt(dx * dx + dy * dy) > Blockly.DRAG_RADIUS) { - return; - } - console.log('TODO: Inspect trash.'); -}; diff --git a/packages/scratch-blocks/core/ui_events.js b/packages/scratch-blocks/core/ui_events.js deleted file mode 100644 index 2430ac928..000000000 --- a/packages/scratch-blocks/core/ui_events.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Events fired as a result of UI actions in Blockly's editor. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Events.Ui'); - -goog.require('Blockly.Events'); -goog.require('Blockly.Events.Abstract'); - -goog.require('goog.array'); -goog.require('goog.math.Coordinate'); - -/** - * Class for a UI event. - * UI events are events that don't need to be sent over the wire for multi-user - * editing to work (e.g. scrolling the workspace, zooming, opening toolbox - * categories). - * UI events do not undo or redo. - * @param {Blockly.Block} block The affected block. - * @param {string} element One of 'selected', 'comment', 'mutator', etc. - * @param {*} oldValue Previous value of element. - * @param {*} newValue New value of element. - * @extends {Blockly.Events.Abstract} - * @constructor - */ -Blockly.Events.Ui = function(block, element, oldValue, newValue) { - Blockly.Events.Ui.superClass_.constructor.call(this); - this.blockId = block ? block.id : null; - this.workspaceId = block ? block.workspace.id : null; - this.element = element; - this.oldValue = oldValue; - this.newValue = newValue; - // UI events do not undo or redo. - this.recordUndo = false; -}; -goog.inherits(Blockly.Events.Ui, Blockly.Events.Abstract); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.Ui.prototype.type = Blockly.Events.UI; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.Ui.prototype.toJson = function() { - var json = Blockly.Events.Ui.superClass_.toJson.call(this); - json['element'] = this.element; - if (this.newValue !== undefined) { - json['newValue'] = this.newValue; - } - if (this.blockId) { - json['blockId'] = this.blockId; - } - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.Ui.prototype.fromJson = function(json) { - Blockly.Events.Ui.superClass_.fromJson.call(this, json); - this.element = json['element']; - this.newValue = json['newValue']; - this.blockId = json['blockId']; -}; diff --git a/packages/scratch-blocks/core/ui_menu_utils.js b/packages/scratch-blocks/core/ui_menu_utils.js deleted file mode 100644 index 8fda6021a..000000000 --- a/packages/scratch-blocks/core/ui_menu_utils.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility methods for working with the closure menu (goog.ui.menu). - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -/** - * @name Blockly.utils.uiMenu - * @namespace - **/ -goog.provide('Blockly.utils.uiMenu'); - - -/** - * Get the size of a rendered goog.ui.Menu. - * @param {!goog.ui.Menu} menu The menu to measure. - * @return {!goog.math.Size} Object with width and height properties. - * @package - */ -Blockly.utils.uiMenu.getSize = function(menu) { - var menuDom = menu.getElement(); - var menuSize = goog.style.getSize(menuDom); - // Recalculate height for the total content, not only box height. - menuSize.height = menuDom.scrollHeight; - return menuSize; -}; - -/** - * Adjust the bounding boxes used to position the widget div to deal with RTL - * goog.ui.Menu positioning. In RTL mode the menu renders down and to the left - * of its start point, instead of down and to the right. Adjusting all of the - * bounding boxes accordingly allows us to use the same code for all widgets. - * This function in-place modifies the provided bounding boxes. - * @param {!Object} viewportBBox The bounding rectangle of the current viewport, - * in window coordinates. - * @param {!Object} anchorBBox The bounding rectangle of the anchor, in window - * coordinates. - * @param {!goog.math.Size} menuSize The size of the menu that is inside the - * widget div, in window coordinates. - * @package - */ -Blockly.utils.uiMenu.adjustBBoxesForRTL = function(viewportBBox, anchorBBox, - menuSize) { - anchorBBox.left += menuSize.width; - anchorBBox.right += menuSize.width; - viewportBBox.left += menuSize.width; - viewportBBox.right += menuSize.width; -}; diff --git a/packages/scratch-blocks/core/utils.js b/packages/scratch-blocks/core/utils.js deleted file mode 100644 index a29c705eb..000000000 --- a/packages/scratch-blocks/core/utils.js +++ /dev/null @@ -1,948 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility methods. - * These methods are not specific to Blockly, and could be factored out into - * a JavaScript framework such as Closure. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.utils - * @namespace - **/ -goog.provide('Blockly.utils'); - -goog.require('Blockly.Touch'); -goog.require('goog.dom'); -goog.require('goog.events.BrowserFeature'); -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); - - -/** - * To allow ADVANCED_OPTIMIZATIONS, combining variable.name and variable['name'] - * is not possible. To access the exported Blockly.Msg.Something it needs to be - * accessed through the exact name that was exported. Note, that all the exports - * are happening as the last thing in the generated js files, so they won't be - * accessible before JavaScript loads! - * @return {!Object.} The message array. - * @private - */ -Blockly.utils.getMessageArray_ = function() { - return goog.global['Blockly']['Msg']; -}; - -/** - * Remove an attribute from a element even if it's in IE 10. - * Similar to Element.removeAttribute() but it works on SVG elements in IE 10. - * Sets the attribute to null in IE 10, which treats removeAttribute as a no-op - * if it's called on an SVG element. - * @param {!Element} element DOM element to remove attribute from. - * @param {string} attributeName Name of attribute to remove. - */ -Blockly.utils.removeAttribute = function(element, attributeName) { - // goog.userAgent.isVersion is deprecated, but the replacement is - // goog.userAgent.isVersionOrHigher. - if (goog.userAgent.IE && goog.userAgent.isVersion('10.0')) { - element.setAttribute(attributeName, null); - } else { - element.removeAttribute(attributeName); - } -}; - -/** - * Add a CSS class to a element. - * Similar to Closure's goog.dom.classes.add, except it handles SVG elements. - * @param {!Element} element DOM element to add class to. - * @param {string} className Name of class to add. - * @return {boolean} True if class was added, false if already present. - */ -Blockly.utils.addClass = function(element, className) { - var classes = element.getAttribute('class') || ''; - if ((' ' + classes + ' ').indexOf(' ' + className + ' ') != -1) { - return false; - } - if (classes) { - classes += ' '; - } - element.setAttribute('class', classes + className); - return true; -}; - -/** - * Remove a CSS class from a element. - * Similar to Closure's goog.dom.classes.remove, except it handles SVG elements. - * @param {!Element} element DOM element to remove class from. - * @param {string} className Name of class to remove. - * @return {boolean} True if class was removed, false if never present. - */ -Blockly.utils.removeClass = function(element, className) { - var classes = element.getAttribute('class'); - if ((' ' + classes + ' ').indexOf(' ' + className + ' ') == -1) { - return false; - } - var classList = classes.split(/\s+/); - for (var i = 0; i < classList.length; i++) { - if (!classList[i] || classList[i] == className) { - classList.splice(i, 1); - i--; - } - } - if (classList.length) { - element.setAttribute('class', classList.join(' ')); - } else { - Blockly.utils.removeAttribute(element, 'class'); - } - return true; -}; - -/** - * Checks if an element has the specified CSS class. - * Similar to Closure's goog.dom.classes.has, except it handles SVG elements. - * @param {!Element} element DOM element to check. - * @param {string} className Name of class to check. - * @return {boolean} True if class exists, false otherwise. - * @package - */ -Blockly.utils.hasClass = function(element, className) { - var classes = element.getAttribute('class'); - return (' ' + classes + ' ').indexOf(' ' + className + ' ') != -1; -}; - -/** - * Don't do anything for this event, just halt propagation. - * @param {!Event} e An event. - */ -Blockly.utils.noEvent = function(e) { - // This event has been handled. No need to bubble up to the document. - e.preventDefault(); - e.stopPropagation(); -}; - -/** - * Is this event targeting a text input widget? - * @param {!Event} e An event. - * @return {boolean} True if text input. - */ -Blockly.utils.isTargetInput = function(e) { - return e.target.type == 'textarea' || e.target.type == 'text' || - e.target.type == 'number' || e.target.type == 'email' || - e.target.type == 'password' || e.target.type == 'search' || - e.target.type == 'tel' || e.target.type == 'url' || - e.target.isContentEditable; -}; - -/** - * Return the coordinates of the top-left corner of this element relative to - * its parent. Only for SVG elements and children (e.g. rect, g, path). - * @param {!Element} element SVG element to find the coordinates of. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - */ -Blockly.utils.getRelativeXY = function(element) { - var xy = new goog.math.Coordinate(0, 0); - // First, check for x and y attributes. - var x = element.getAttribute('x'); - if (x) { - xy.x = parseInt(x, 10); - } - var y = element.getAttribute('y'); - if (y) { - xy.y = parseInt(y, 10); - } - // Second, check for transform="translate(...)" attribute. - var transform = element.getAttribute('transform'); - var r = transform && transform.match(Blockly.utils.getRelativeXY.XY_REGEX_); - if (r) { - xy.x += parseFloat(r[1]); - if (r[3]) { - xy.y += parseFloat(r[3]); - } - } - - // Then check for style = transform: translate(...) or translate3d(...) - var style = element.getAttribute('style'); - if (style && style.indexOf('translate') > -1) { - var styleComponents = style.match(Blockly.utils.getRelativeXY.XY_STYLE_REGEX_); - if (styleComponents) { - xy.x += parseFloat(styleComponents[1]); - if (styleComponents[3]) { - xy.y += parseFloat(styleComponents[3]); - } - } - } - return xy; -}; - -/** - * Return the coordinates of the top-left corner of this element relative to - * the div blockly was injected into. - * @param {!Element} element SVG element to find the coordinates of. If this is - * not a child of the div blockly was injected into, the behaviour is - * undefined. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - */ -Blockly.utils.getInjectionDivXY_ = function(element) { - var x = 0; - var y = 0; - while (element) { - var xy = Blockly.utils.getRelativeXY(element); - var scale = Blockly.utils.getScale_(element); - x = (x * scale) + xy.x; - y = (y * scale) + xy.y; - var classes = element.getAttribute('class') || ''; - if ((' ' + classes + ' ').indexOf(' injectionDiv ') != -1) { - break; - } - element = element.parentNode; - } - return new goog.math.Coordinate(x, y); -}; - -/** - * Return the scale of this element. - * @param {!Element} element The element to find the coordinates of. - * @return {!number} number represending the scale applied to the element. - * @private - */ -Blockly.utils.getScale_ = function(element) { - var scale = 1; - var transform = element.getAttribute('transform'); - if (transform) { - var transformComponents = - transform.match(Blockly.utils.getScale_.REGEXP_); - if (transformComponents && transformComponents[0]) { - scale = parseFloat(transformComponents[0]); - } - } - return scale; -}; - -/** - * Static regex to pull the x,y values out of an SVG translate() directive. - * Note that Firefox and IE (9,10) return 'translate(12)' instead of - * 'translate(12, 0)'. - * Note that IE (9,10) returns 'translate(16 8)' instead of 'translate(16, 8)'. - * Note that IE has been reported to return scientific notation (0.123456e-42). - * @type {!RegExp} - * @private - */ -Blockly.utils.getRelativeXY.XY_REGEX_ = - /translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*)?/; - - -/** - * Static regex to pull the scale values out of a transform style property. - * Accounts for same exceptions as XY_REGEXP_. - * @type {!RegExp} - * @private - */ -Blockly.utils.getScale_REGEXP_ = /scale\(\s*([-+\d.e]+)\s*\)/; - -/** - * Static regex to pull the x,y values out of a translate3d() or translate3d() - * style property. - * Accounts for same exceptions as XY_REGEXP_. - * @type {!RegExp} - * @private - */ -Blockly.utils.getRelativeXY.XY_STYLE_REGEX_ = - /transform:\s*translate(?:3d)?\(\s*([-+\d.e]+)\s*px([ ,]\s*([-+\d.e]+)\s*px)?/; - -/** - * Helper method for creating SVG elements. - * @param {string} name Element's tag name. - * @param {!Object} attrs Dictionary of attribute names and values. - * @param {Element} parent Optional parent on which to append the element. - * @return {!SVGElement} Newly created SVG element. - */ -Blockly.utils.createSvgElement = function(name, attrs, parent /*, opt_workspace */) { - var e = /** @type {!SVGElement} */ - (document.createElementNS(Blockly.SVG_NS, name)); - for (var key in attrs) { - e.setAttribute(key, attrs[key]); - } - // IE defines a unique attribute "runtimeStyle", it is NOT applied to - // elements created with createElementNS. However, Closure checks for IE - // and assumes the presence of the attribute and crashes. - if (document.body.runtimeStyle) { // Indicates presence of IE-only attr. - e.runtimeStyle = e.currentStyle = e.style; - } - if (parent) { - parent.appendChild(e); - } - return e; -}; - -/** - * Is this event a right-click? - * @param {!Event} e Mouse event. - * @return {boolean} True if right-click. - */ -Blockly.utils.isRightButton = function(e) { - if (e.ctrlKey && goog.userAgent.MAC) { - // Control-clicking on Mac OS X is treated as a right-click. - // WebKit on Mac OS X fails to change button to 2 (but Gecko does). - return true; - } - return e.button == 2; -}; - -/** - * Return the converted coordinates of the given mouse event. - * The origin (0,0) is the top-left corner of the Blockly SVG. - * @param {!Event} e Mouse event. - * @param {!Element} svg SVG element. - * @param {SVGMatrix} matrix Inverted screen CTM to use. - * @return {!SVGPoint} Object with .x and .y properties. - */ -Blockly.utils.mouseToSvg = function(e, svg, matrix) { - var svgPoint = svg.createSVGPoint(); - svgPoint.x = e.clientX; - svgPoint.y = e.clientY; - - if (!matrix) { - matrix = svg.getScreenCTM().inverse(); - } - return svgPoint.matrixTransform(matrix); -}; - -/** - * Given an array of strings, return the length of the shortest one. - * @param {!Array.} array Array of strings. - * @return {number} Length of shortest string. - */ -Blockly.utils.shortestStringLength = function(array) { - if (!array.length) { - return 0; - } - return array.reduce(function(a, b) { - return a.length < b.length ? a : b; - }).length; -}; - -/** - * Given an array of strings, return the length of the common prefix. - * Words may not be split. Any space after a word is included in the length. - * @param {!Array.} array Array of strings. - * @param {number=} opt_shortest Length of shortest string. - * @return {number} Length of common prefix. - */ -Blockly.utils.commonWordPrefix = function(array, opt_shortest) { - if (!array.length) { - return 0; - } else if (array.length == 1) { - return array[0].length; - } - var wordPrefix = 0; - var max = opt_shortest || Blockly.utils.shortestStringLength(array); - for (var len = 0; len < max; len++) { - var letter = array[0][len]; - for (var i = 1; i < array.length; i++) { - if (letter != array[i][len]) { - return wordPrefix; - } - } - if (letter == ' ') { - wordPrefix = len + 1; - } - } - for (var i = 1; i < array.length; i++) { - var letter = array[i][len]; - if (letter && letter != ' ') { - return wordPrefix; - } - } - return max; -}; - -/** - * Given an array of strings, return the length of the common suffix. - * Words may not be split. Any space after a word is included in the length. - * @param {!Array.} array Array of strings. - * @param {number=} opt_shortest Length of shortest string. - * @return {number} Length of common suffix. - */ -Blockly.utils.commonWordSuffix = function(array, opt_shortest) { - if (!array.length) { - return 0; - } else if (array.length == 1) { - return array[0].length; - } - var wordPrefix = 0; - var max = opt_shortest || Blockly.utils.shortestStringLength(array); - for (var len = 0; len < max; len++) { - var letter = array[0].substr(-len - 1, 1); - for (var i = 1; i < array.length; i++) { - if (letter != array[i].substr(-len - 1, 1)) { - return wordPrefix; - } - } - if (letter == ' ') { - wordPrefix = len + 1; - } - } - for (var i = 1; i < array.length; i++) { - var letter = array[i].charAt(array[i].length - len - 1); - if (letter && letter != ' ') { - return wordPrefix; - } - } - return max; -}; - -/** - * Parse a string with any number of interpolation tokens (%1, %2, ...). - * It will also replace string table references (e.g., %{bky_my_msg} and - * %{BKY_MY_MSG} will both be replaced with the value in - * Blockly.Msg['MY_MSG']). Percentage sign characters '%' may be self-escaped - * (e.g., '%%'). - * @param {string} message Text which might contain string table references and - * interpolation tokens. - * @return {!Array.} Array of strings and numbers. - */ -Blockly.utils.tokenizeInterpolation = function(message) { - return Blockly.utils.tokenizeInterpolation_(message, true); -}; - -/** - * Replaces string table references in a message, if the message is a string. - * For example, "%{bky_my_msg}" and "%{BKY_MY_MSG}" will both be replaced with - * the value in Blockly.Msg['MY_MSG']. - * @param {string|?} message Message, which may be a string that contains - * string table references. - * @return {!string} String with message references replaced. - */ -Blockly.utils.replaceMessageReferences = function(message) { - if (!goog.isString(message)) { - return message; - } - var interpolatedResult = Blockly.utils.tokenizeInterpolation_(message, false); - // When parseInterpolationTokens == false, interpolatedResult should be at - // most length 1. - return interpolatedResult.length ? interpolatedResult[0] : ''; -}; - -/** - * Validates that any %{BKY_...} references in the message refer to keys of - * the Blockly.Msg string table. - * @param {string} message Text which might contain string table references. - * @return {boolean} True if all message references have matching values. - * Otherwise, false. - */ -Blockly.utils.checkMessageReferences = function(message) { - var isValid = true; // True until a bad reference is found. - - var regex = /%{BKY_([a-zA-Z][a-zA-Z0-9_]*)}/g; - var match = regex.exec(message); - while (match) { - var msgKey = match[1]; - if (Blockly.utils.getMessageArray_()[msgKey] == undefined) { - console.log('WARNING: No message string for %{BKY_' + msgKey + '}.'); - isValid = false; - } - - // Re-run on remainder of string. - message = message.substring(match.index + msgKey.length + 1); - match = regex.exec(message); - } - - return isValid; -}; - -/** - * Internal implementation of the message reference and interpolation token - * parsing used by tokenizeInterpolation() and replaceMessageReferences(). - * @param {string} message Text which might contain string table references and - * interpolation tokens. - * @param {boolean} parseInterpolationTokens Option to parse numeric - * interpolation tokens (%1, %2, ...) when true. - * @return {!Array.} Array of strings and numbers. - * @private - */ -Blockly.utils.tokenizeInterpolation_ = function(message, - parseInterpolationTokens) { - var tokens = []; - var chars = message.split(''); - chars.push(''); // End marker. - // Parse the message with a finite state machine. - // 0 - Base case. - // 1 - % found. - // 2 - Digit found. - // 3 - Message ref found. - var state = 0; - var buffer = []; - var number = null; - for (var i = 0; i < chars.length; i++) { - var c = chars[i]; - if (state == 0) { - if (c == '%') { - var text = buffer.join(''); - if (text) { - tokens.push(text); - } - buffer.length = 0; - state = 1; // Start escape. - } else { - buffer.push(c); // Regular char. - } - } else if (state == 1) { - if (c == '%') { - buffer.push(c); // Escaped %: %% - state = 0; - } else if (parseInterpolationTokens && '0' <= c && c <= '9') { - state = 2; - number = c; - var text = buffer.join(''); - if (text) { - tokens.push(text); - } - buffer.length = 0; - } else if (c == '{') { - state = 3; - } else { - buffer.push('%', c); // Not recognized. Return as literal. - state = 0; - } - } else if (state == 2) { - if ('0' <= c && c <= '9') { - number += c; // Multi-digit number. - } else { - tokens.push(parseInt(number, 10)); - i--; // Parse this char again. - state = 0; - } - } else if (state == 3) { // String table reference - if (c == '') { - // Premature end before closing '}' - buffer.splice(0, 0, '%{'); // Re-insert leading delimiter - i--; // Parse this char again. - state = 0; // and parse as string literal. - } else if (c != '}') { - buffer.push(c); - } else { - var rawKey = buffer.join(''); - if (/[a-zA-Z][a-zA-Z0-9_]*/.test(rawKey)) { // Strict matching - // Found a valid string key. Attempt case insensitive match. - var keyUpper = rawKey.toUpperCase(); - - // BKY_ is the prefix used to namespace the strings used in Blockly - // core files and the predefined blocks in ../blocks/. These strings - // are defined in ../msgs/ files. - var bklyKey = goog.string.startsWith(keyUpper, 'BKY_') ? - keyUpper.substring(4) : null; - if (bklyKey && bklyKey in Blockly.Msg) { - var rawValue = Blockly.Msg[bklyKey]; - if (goog.isString(rawValue)) { - // Attempt to dereference substrings, too, appending to the end. - Array.prototype.push.apply(tokens, - Blockly.utils.tokenizeInterpolation(rawValue)); - } else if (parseInterpolationTokens) { - // When parsing interpolation tokens, numbers are special - // placeholders (%1, %2, etc). Make sure all other values are - // strings. - tokens.push(String(rawValue)); - } else { - tokens.push(rawValue); - } - } else { - // No entry found in the string table. Pass reference as string. - tokens.push('%{' + rawKey + '}'); - } - buffer.length = 0; // Clear the array - state = 0; - } else { - tokens.push('%{' + rawKey + '}'); - buffer.length = 0; - state = 0; // and parse as string literal. - } - } - } - } - var text = buffer.join(''); - if (text) { - tokens.push(text); - } - - // Merge adjacent text tokens into a single string. - var mergedTokens = []; - buffer.length = 0; - for (var i = 0; i < tokens.length; ++i) { - if (typeof tokens[i] == 'string') { - buffer.push(tokens[i]); - } else { - text = buffer.join(''); - if (text) { - mergedTokens.push(text); - } - buffer.length = 0; - mergedTokens.push(tokens[i]); - } - } - text = buffer.join(''); - if (text) { - mergedTokens.push(text); - } - buffer.length = 0; - - return mergedTokens; -}; - -/** - * Generate a unique ID. This should be globally unique. - * 87 characters ^ 20 length > 128 bits (better than a UUID). - * @return {string} A globally unique ID string. - */ -Blockly.utils.genUid = function() { - var length = 20; - var soupLength = Blockly.utils.genUid.soup_.length; - var id = []; - for (var i = 0; i < length; i++) { - id[i] = Blockly.utils.genUid.soup_.charAt(Math.random() * soupLength); - } - return id.join(''); -}; - -/** - * Legal characters for the unique ID. Should be all on a US keyboard. - * No characters that conflict with XML or JSON. Requests to remove additional - * 'problematic' characters from this soup will be denied. That's your failure - * to properly escape in your own environment. Issues #251, #625, #682, #1304. - * @private - */ -Blockly.utils.genUid.soup_ = '!#$%()*+,-./:;=?@[]^_`{|}~' + - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - -/** - * Wrap text to the specified width. - * @param {string} text Text to wrap. - * @param {number} limit Width to wrap each line. - * @return {string} Wrapped text. - */ -Blockly.utils.wrap = function(text, limit) { - var lines = text.split('\n'); - for (var i = 0; i < lines.length; i++) { - lines[i] = Blockly.utils.wrapLine_(lines[i], limit); - } - return lines.join('\n'); -}; - -/** - * Wrap single line of text to the specified width. - * @param {string} text Text to wrap. - * @param {number} limit Width to wrap each line. - * @return {string} Wrapped text. - * @private - */ -Blockly.utils.wrapLine_ = function(text, limit) { - if (text.length <= limit) { - // Short text, no need to wrap. - return text; - } - // Split the text into words. - var words = text.trim().split(/\s+/); - // Set limit to be the length of the largest word. - for (var i = 0; i < words.length; i++) { - if (words[i].length > limit) { - limit = words[i].length; - } - } - - var lastScore; - var score = -Infinity; - var lastText; - var lineCount = 1; - do { - lastScore = score; - lastText = text; - // Create a list of booleans representing if a space (false) or - // a break (true) appears after each word. - var wordBreaks = []; - // Seed the list with evenly spaced linebreaks. - var steps = words.length / lineCount; - var insertedBreaks = 1; - for (var i = 0; i < words.length - 1; i++) { - if (insertedBreaks < (i + 1.5) / steps) { - insertedBreaks++; - wordBreaks[i] = true; - } else { - wordBreaks[i] = false; - } - } - wordBreaks = Blockly.utils.wrapMutate_(words, wordBreaks, limit); - score = Blockly.utils.wrapScore_(words, wordBreaks, limit); - text = Blockly.utils.wrapToText_(words, wordBreaks); - lineCount++; - } while (score > lastScore); - return lastText; -}; - -/** - * Compute a score for how good the wrapping is. - * @param {!Array.} words Array of each word. - * @param {!Array.} wordBreaks Array of line breaks. - * @param {number} limit Width to wrap each line. - * @return {number} Larger the better. - * @private - */ -Blockly.utils.wrapScore_ = function(words, wordBreaks, limit) { - // If this function becomes a performance liability, add caching. - // Compute the length of each line. - var lineLengths = [0]; - var linePunctuation = []; - for (var i = 0; i < words.length; i++) { - lineLengths[lineLengths.length - 1] += words[i].length; - if (wordBreaks[i] === true) { - lineLengths.push(0); - linePunctuation.push(words[i].charAt(words[i].length - 1)); - } else if (wordBreaks[i] === false) { - lineLengths[lineLengths.length - 1]++; - } - } - var maxLength = Math.max.apply(Math, lineLengths); - - var score = 0; - for (var i = 0; i < lineLengths.length; i++) { - // Optimize for width. - // -2 points per char over limit (scaled to the power of 1.5). - score -= Math.pow(Math.abs(limit - lineLengths[i]), 1.5) * 2; - // Optimize for even lines. - // -1 point per char smaller than max (scaled to the power of 1.5). - score -= Math.pow(maxLength - lineLengths[i], 1.5); - // Optimize for structure. - // Add score to line endings after punctuation. - if ('.?!'.indexOf(linePunctuation[i]) != -1) { - score += limit / 3; - } else if (',;)]}'.indexOf(linePunctuation[i]) != -1) { - score += limit / 4; - } - } - // All else being equal, the last line should not be longer than the - // previous line. For example, this looks wrong: - // aaa bbb - // ccc ddd eee - if (lineLengths.length > 1 && lineLengths[lineLengths.length - 1] <= - lineLengths[lineLengths.length - 2]) { - score += 0.5; - } - return score; -}; - -/** - * Mutate the array of line break locations until an optimal solution is found. - * No line breaks are added or deleted, they are simply moved around. - * @param {!Array.} words Array of each word. - * @param {!Array.} wordBreaks Array of line breaks. - * @param {number} limit Width to wrap each line. - * @return {!Array.} New array of optimal line breaks. - * @private - */ -Blockly.utils.wrapMutate_ = function(words, wordBreaks, limit) { - var bestScore = Blockly.utils.wrapScore_(words, wordBreaks, limit); - var bestBreaks; - // Try shifting every line break forward or backward. - for (var i = 0; i < wordBreaks.length - 1; i++) { - if (wordBreaks[i] == wordBreaks[i + 1]) { - continue; - } - var mutatedWordBreaks = [].concat(wordBreaks); - mutatedWordBreaks[i] = !mutatedWordBreaks[i]; - mutatedWordBreaks[i + 1] = !mutatedWordBreaks[i + 1]; - var mutatedScore = - Blockly.utils.wrapScore_(words, mutatedWordBreaks, limit); - if (mutatedScore > bestScore) { - bestScore = mutatedScore; - bestBreaks = mutatedWordBreaks; - } - } - if (bestBreaks) { - // Found an improvement. See if it may be improved further. - return Blockly.utils.wrapMutate_(words, bestBreaks, limit); - } - // No improvements found. Done. - return wordBreaks; -}; - -/** - * Reassemble the array of words into text, with the specified line breaks. - * @param {!Array.} words Array of each word. - * @param {!Array.} wordBreaks Array of line breaks. - * @return {string} Plain text. - * @private - */ -Blockly.utils.wrapToText_ = function(words, wordBreaks) { - var text = []; - for (var i = 0; i < words.length; i++) { - text.push(words[i]); - if (wordBreaks[i] !== undefined) { - text.push(wordBreaks[i] ? '\n' : ' '); - } - } - return text.join(''); -}; - -/** - * Check if 3D transforms are supported by adding an element - * and attempting to set the property. - * @return {boolean} true if 3D transforms are supported. - */ -Blockly.utils.is3dSupported = function() { - if (Blockly.utils.is3dSupported.cached_ !== undefined) { - return Blockly.utils.is3dSupported.cached_; - } - // CC-BY-SA Lorenzo Polidori - // stackoverflow.com/questions/5661671/detecting-transform-translate3d-support - if (!goog.global.getComputedStyle) { - return false; - } - - var el = document.createElement('p'); - var has3d = 'none'; - var transforms = { - 'webkitTransform': '-webkit-transform', - 'OTransform': '-o-transform', - 'msTransform': '-ms-transform', - 'MozTransform': '-moz-transform', - 'transform': 'transform' - }; - - // Add it to the body to get the computed style. - document.body.insertBefore(el, null); - - for (var t in transforms) { - if (el.style[t] !== undefined) { - el.style[t] = 'translate3d(1px,1px,1px)'; - var computedStyle = goog.global.getComputedStyle(el); - if (!computedStyle) { - // getComputedStyle in Firefox returns null when blockly is loaded - // inside an iframe with display: none. Returning false and not - // caching is3dSupported means we try again later. This is most likely - // when users are interacting with blocks which should mean blockly is - // visible again. - // See https://bugzilla.mozilla.org/show_bug.cgi?id=548397 - document.body.removeChild(el); - return false; - } - has3d = computedStyle.getPropertyValue(transforms[t]); - } - } - document.body.removeChild(el); - Blockly.utils.is3dSupported.cached_ = has3d !== 'none'; - return Blockly.utils.is3dSupported.cached_; -}; - -/** - * Insert a node after a reference node. - * Contrast with node.insertBefore function. - * @param {!Element} newNode New element to insert. - * @param {!Element} refNode Existing element to precede new node. - * @package - */ -Blockly.utils.insertAfter = function(newNode, refNode) { - var siblingNode = refNode.nextSibling; - var parentNode = refNode.parentNode; - if (!parentNode) { - throw 'Reference node has no parent.'; - } - if (siblingNode) { - parentNode.insertBefore(newNode, siblingNode); - } else { - parentNode.appendChild(newNode); - } -}; - -/** - * Calls a function after the page has loaded, possibly immediately. - * @param {function()} fn Function to run. - * @throws Error Will throw if no global document can be found (e.g., Node.js). - */ -Blockly.utils.runAfterPageLoad = function(fn) { - if (!document) { - throw new Error('Blockly.utils.runAfterPageLoad() requires browser document.'); - } - if (document.readyState === 'complete') { - fn(); // Page has already loaded. Call immediately. - } else { - // Poll readyState. - var readyStateCheckInterval = setInterval(function() { - if (document.readyState === 'complete') { - clearInterval(readyStateCheckInterval); - fn(); - } - }, 10); - } -}; - -/** - * Sets the CSS transform property on an element. This function sets the - * non-vendor-prefixed and vendor-prefixed versions for backwards compatibility - * with older browsers. See http://caniuse.com/#feat=transforms2d - * @param {!Element} node The node which the CSS transform should be applied. - * @param {string} transform The value of the CSS `transform` property. - */ -Blockly.utils.setCssTransform = function(node, transform) { - node.style['transform'] = transform; - node.style['-webkit-transform'] = transform; -}; - -/** - * Get the position of the current viewport in window coordinates. This takes - * scroll into account. - * @return {!Object} an object containing window width, height, and scroll - * position in window coordinates. - * @package - */ -Blockly.utils.getViewportBBox = function() { - // Pixels. - var windowSize = goog.dom.getViewportSize(); - // Pixels, in window coordinates. - var scrollOffset = goog.style.getViewportPageOffset(document); - return { - right: windowSize.width + scrollOffset.x, - bottom: windowSize.height + scrollOffset.y, - top: scrollOffset.y, - left: scrollOffset.x - }; -}; - -/** - * Fast prefix-checker. - * Copied from Closure's goog.string.startsWith. - * @param {string} str The string to check. - * @param {string} prefix A string to look for at the start of `str`. - * @return {boolean} True if `str` begins with `prefix`. - * @package - */ -Blockly.utils.startsWith = function(str, prefix) { - return str.lastIndexOf(prefix, 0) == 0; -}; - -/** - * Converts degrees to radians. - * Copied from Closure's goog.math.toRadians. - * @param {number} angleDegrees Angle in degrees. - * @return {number} Angle in radians. - * @package - */ -Blockly.utils.toRadians = function(angleDegrees) { - return angleDegrees * Math.PI / 180; -}; diff --git a/packages/scratch-blocks/core/variable_events.js b/packages/scratch-blocks/core/variable_events.js deleted file mode 100644 index 0dcabce7e..000000000 --- a/packages/scratch-blocks/core/variable_events.js +++ /dev/null @@ -1,259 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2018 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Classes for all types of variable events. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.Events.VarBase'); -goog.provide('Blockly.Events.VarCreate'); -goog.provide('Blockly.Events.VarDelete'); -goog.provide('Blockly.Events.VarRename'); - -goog.require('Blockly.Events'); -goog.require('Blockly.Events.Abstract'); - -goog.require('goog.array'); -goog.require('goog.math.Coordinate'); - - -/** - * Abstract class for a variable event. - * @param {Blockly.VariableModel} variable The variable this event corresponds - * to. - * @extends {Blockly.Events.Abstract} - * @constructor - */ -Blockly.Events.VarBase = function(variable) { - Blockly.Events.VarBase.superClass_.constructor.call(this); - - /** - * The variable id for the variable this event pertains to. - * @type {string} - */ - this.varId = variable.getId(); - this.workspaceId = variable.workspace.id; -}; -goog.inherits(Blockly.Events.VarBase, Blockly.Events.Abstract); - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.VarBase.prototype.toJson = function() { - var json = Blockly.Events.VarBase.superClass_.toJson.call(this); - json['varId'] = this.varId; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.VarBase.prototype.fromJson = function(json) { - Blockly.Events.VarBase.superClass_.toJson.call(this); - this.varId = json['varId']; -}; - -/** - * Class for a variable creation event. - * @param {Blockly.VariableModel} variable The created variable. - * Null for a blank event. - * @extends {Blockly.Events.VarBase} - * @constructor - */ -Blockly.Events.VarCreate = function(variable) { - if (!variable) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.VarCreate.superClass_.constructor.call(this, variable); - this.varType = variable.type; - this.varName = variable.name; - this.isLocal = variable.isLocal; - this.isCloud = variable.isCloud; -}; -goog.inherits(Blockly.Events.VarCreate, Blockly.Events.VarBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.VarCreate.prototype.type = Blockly.Events.VAR_CREATE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.VarCreate.prototype.toJson = function() { - var json = Blockly.Events.VarCreate.superClass_.toJson.call(this); - json['varType'] = this.varType; - json['varName'] = this.varName; - json['isLocal'] = this.isLocal; - json['isCloud'] = this.isCloud; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.VarCreate.prototype.fromJson = function(json) { - Blockly.Events.VarCreate.superClass_.fromJson.call(this, json); - this.varType = json['varType']; - this.varName = json['varName']; - this.isLocal = json['isLocal']; - this.isCloud = json['isCloud']; -}; - -/** - * Run a variable creation event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.VarCreate.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - if (forward) { - workspace.createVariable(this.varName, this.varType, this.varId, this.isLocal, this.isCloud); - } else { - workspace.deleteVariableById(this.varId); - } -}; - -/** - * Class for a variable deletion event. - * @param {Blockly.VariableModel} variable The deleted variable. - * Null for a blank event. - * @extends {Blockly.Events.VarBase} - * @constructor - */ -Blockly.Events.VarDelete = function(variable) { - if (!variable) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.VarDelete.superClass_.constructor.call(this, variable); - this.varType = variable.type; - this.varName = variable.name; - this.isLocal = variable.isLocal; - this.isCloud = variable.isCloud; -}; -goog.inherits(Blockly.Events.VarDelete, Blockly.Events.VarBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.VarDelete.prototype.type = Blockly.Events.VAR_DELETE; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.VarDelete.prototype.toJson = function() { - var json = Blockly.Events.VarDelete.superClass_.toJson.call(this); - json['varType'] = this.varType; - json['varName'] = this.varName; - json['isLocal'] = this.isLocal; - json['isCloud'] = this.isCloud; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.VarDelete.prototype.fromJson = function(json) { - Blockly.Events.VarDelete.superClass_.fromJson.call(this, json); - this.varType = json['varType']; - this.varName = json['varName']; - this.isLocal = json['isLocal']; - this.isCloud = json['isCloud']; -}; - -/** - * Run a variable deletion event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.VarDelete.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - if (forward) { - workspace.deleteVariableById(this.varId); - } else { - workspace.createVariable(this.varName, this.varType, this.varId, this.isLocal, this.isCloud); - } -}; - -/** - * Class for a variable rename event. - * @param {Blockly.VariableModel} variable The renamed variable. - * Null for a blank event. - * @param {string} newName The new name the variable will be changed to. - * @extends {Blockly.Events.VarBase} - * @constructor - */ -Blockly.Events.VarRename = function(variable, newName) { - if (!variable) { - return; // Blank event to be populated by fromJson. - } - Blockly.Events.VarRename.superClass_.constructor.call(this, variable); - this.oldName = variable.name; - this.newName = newName; -}; -goog.inherits(Blockly.Events.VarRename, Blockly.Events.VarBase); - -/** - * Type of this event. - * @type {string} - */ -Blockly.Events.VarRename.prototype.type = Blockly.Events.VAR_RENAME; - -/** - * Encode the event as JSON. - * @return {!Object} JSON representation. - */ -Blockly.Events.VarRename.prototype.toJson = function() { - var json = Blockly.Events.VarRename.superClass_.toJson.call(this); - json['oldName'] = this.oldName; - json['newName'] = this.newName; - return json; -}; - -/** - * Decode the JSON event. - * @param {!Object} json JSON representation. - */ -Blockly.Events.VarRename.prototype.fromJson = function(json) { - Blockly.Events.VarRename.superClass_.fromJson.call(this, json); - this.oldName = json['oldName']; - this.newName = json['newName']; -}; - -/** - * Run a variable rename event. - * @param {boolean} forward True if run forward, false if run backward (undo). - */ -Blockly.Events.VarRename.prototype.run = function(forward) { - var workspace = this.getEventWorkspace_(); - if (forward) { - workspace.renameVariableById(this.varId, this.newName); - } else { - workspace.renameVariableById(this.varId, this.oldName); - } -}; diff --git a/packages/scratch-blocks/core/variable_map.js b/packages/scratch-blocks/core/variable_map.js deleted file mode 100644 index f391c0938..000000000 --- a/packages/scratch-blocks/core/variable_map.js +++ /dev/null @@ -1,415 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a map of variables and their types. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.provide('Blockly.VariableMap'); - -goog.require('Blockly.Events.VarDelete'); -goog.require('Blockly.Events.VarRename'); -goog.require('Blockly.VariableModel'); - - -/** - * Class for a variable map. This contains a dictionary data structure with - * variable types as keys and lists of variables as values. The list of - * variables are the type indicated by the key. - * @param {!Blockly.Workspace} workspace The workspace this map belongs to. - * @constructor - */ -Blockly.VariableMap = function(workspace) { - /** - * A map from variable type to list of variable names. The lists contain all - * of the named variables in the workspace, including variables - * that are not currently in use. - * @type {!Object.>} - * @private - */ - this.variableMap_ = {}; - - /** - * The workspace this map belongs to. - * @type {!Blockly.Workspace} - */ - this.workspace = workspace; -}; - -/** - * Clear the variable map. - */ -Blockly.VariableMap.prototype.clear = function() { - this.variableMap_ = new Object(null); -}; - -/* Begin functions for renaming variables. */ - -/** - * Rename the given variable by updating its name in the variable map. - * @param {!Blockly.VariableModel} variable Variable to rename. - * @param {string} newName New variable name. - * @package - */ -Blockly.VariableMap.prototype.renameVariable = function(variable, newName) { - var type = variable.type; - var conflictVar = this.getVariable(newName, type); - var blocks = this.workspace.getAllBlocks(); - Blockly.Events.setGroup(true); - try { - if (!conflictVar) { - this.renameVariableAndUses_(variable, newName, blocks); - } else { - // We don't want to rename the variable if one with the exact new name - // already exists. - console.warn('Unexpected conflict when attempting to rename ' + - 'variable with name: ' + variable.name + ' and id: ' + variable.getId() + - ' to new name: ' + newName + '. A variable with the new name already exists' + - ' and has id: ' + conflictVar.getId()); - - } - } finally { - Blockly.Events.setGroup(false); - } -}; - -/** - * Rename a variable by updating its name in the variable map. Identify the - * variable to rename with the given ID. - * @param {string} id ID of the variable to rename. - * @param {string} newName New variable name. - */ -Blockly.VariableMap.prototype.renameVariableById = function(id, newName) { - var variable = this.getVariableById(id); - if (!variable) { - throw new Error('Tried to rename a variable that didn\'t exist. ID: ' + id); - } - - this.renameVariable(variable, newName); -}; - -/** - * Update the name of the given variable and refresh all references to it. - * The new name must not conflict with any existing variable names. - * @param {!Blockly.VariableModel} variable Variable to rename. - * @param {string} newName New variable name. - * @param {!Array.} blocks The list of all blocks in the - * workspace. - * @private - */ -Blockly.VariableMap.prototype.renameVariableAndUses_ = function(variable, - newName, blocks) { - Blockly.Events.fire(new Blockly.Events.VarRename(variable, newName)); - variable.name = newName; - for (var i = 0; i < blocks.length; i++) { - blocks[i].updateVarName(variable); - } -}; - -/** - * Update the name of the given variable to the same name as an existing - * variable. The two variables are coalesced into a single variable with the ID - * of the existing variable that was already using newName. - * Refresh all references to the variable. - * @param {!Blockly.VariableModel} variable Variable to rename. - * @param {string} newName New variable name. - * @param {!Blockly.VariableModel} conflictVar The variable that was already - * using newName. - * @param {!Array.} blocks The list of all blocks in the - * workspace. - * @private - */ -Blockly.VariableMap.prototype.renameVariableWithConflict_ = function(variable, - newName, conflictVar, blocks) { - var type = variable.type; - var oldCase = conflictVar.name; - - if (newName != oldCase) { - // Simple rename to change the case and update references. - this.renameVariableAndUses_(conflictVar, newName, blocks); - } - - // These blocks now refer to a different variable. - // These will fire change events. - for (var i = 0; i < blocks.length; i++) { - blocks[i].renameVarById(variable.getId(), conflictVar.getId()); - } - - // Finally delete the original variable, which is now unreferenced. - Blockly.Events.fire(new Blockly.Events.VarDelete(variable)); - // And remove it from the list. - var variableList = this.getVariablesOfType(type); - var variableIndex = variableList.indexOf(variable); - this.variableMap_[type].splice(variableIndex, 1); - -}; - -/* End functions for renaming variabless. */ - -/** - * Create a variable with a given name, optional type, and optional id. - * @param {!string} name The name of the variable. This must be unique across - * each variable type. - * @param {?string} opt_type The type of the variable like 'int' or 'string'. - * Does not need to be unique. Field_variable can filter variables based on - * their type. This will default to '' which is a specific type. - * @param {string=} opt_id The unique ID of the variable. This will default to - * a UUID. - * @param {boolean=} opt_isLocal Whether the variable is locally scoped. - * @param {boolean=} opt_isCloud Whether the variable is a cloud variable. - * @return {?Blockly.VariableModel} The newly created variable. - */ -Blockly.VariableMap.prototype.createVariable = function(name, - opt_type, opt_id, opt_isLocal, opt_isCloud) { - var variable = this.getVariable(name, opt_type); - if (variable) { - if (opt_id && variable.getId() != opt_id) { - // There is a variable conflict. Variable conflicts should be eliminated - // in the scratch-vm, or before we get to this point, - // so log a warning, because throwing an error crashes projects. - console.warn('Variable "' + name + '" is already in use and its id is "' - + variable.getId() + '" which conflicts with the passed in ' + - 'id, "' + opt_id + '".'); - } - // The variable already exists and has the same ID. - return variable; - } - if (opt_id) { - variable = this.getVariableById(opt_id); - if (variable) { - console.warn('Variable id, "' + opt_id + '", is already in use.'); - return variable; - } - } - opt_id = opt_id || Blockly.utils.genUid(); - opt_type = opt_type || ''; - - variable = new Blockly.VariableModel(this.workspace, name, opt_type, opt_id, - opt_isLocal, opt_isCloud); - // If opt_type is not a key, create a new list. - if (!this.variableMap_[opt_type]) { - this.variableMap_[opt_type] = [variable]; - } else { - // Else append the variable to the preexisting list. - this.variableMap_[opt_type].push(variable); - } - return variable; -}; - -/* Begin functions for variable deletion. */ - -/** - * Delete a variable. - * @param {Blockly.VariableModel} variable Variable to delete. - */ -Blockly.VariableMap.prototype.deleteVariable = function(variable) { - var variableList = this.variableMap_[variable.type]; - for (var i = 0, tempVar; tempVar = variableList[i]; i++) { - if (tempVar.getId() == variable.getId()) { - variableList.splice(i, 1); - Blockly.Events.fire(new Blockly.Events.VarDelete(variable)); - return; - } - } -}; - -/** - * Delete a variable and all of its uses from this workspace by the passed - * in ID. May prompt the user for confirmation. - * @param {string} id ID of variable to delete. - */ -Blockly.VariableMap.prototype.deleteVariableById = function(id) { - var variable = this.getVariableById(id); - if (variable) { - // Check whether this variable is a function parameter before deleting. - var variableName = variable.name; - var uses = this.getVariableUsesById(id); - for (var i = 0, block; block = uses[i]; i++) { - if (block.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE || - block.type == 'procedures_defreturn') { - var procedureName = block.getFieldValue('NAME'); - var deleteText = Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE. - replace('%1', variableName). - replace('%2', procedureName); - Blockly.alert(deleteText); - return; - } - } - - var map = this; - if (uses.length > 1) { - // Confirm before deleting multiple blocks. - var confirmText = Blockly.Msg.DELETE_VARIABLE_CONFIRMATION. - replace('%1', String(uses.length)). - replace('%2', variableName); - Blockly.confirm(confirmText, - function(ok) { - if (ok) { - map.deleteVariableInternal_(variable, uses); - } - }); - } else { - // No confirmation necessary for a single block. - map.deleteVariableInternal_(variable, uses); - } - } else { - console.warn("Can't delete non-existent variable: " + id); - } -}; - -/** - * Deletes a variable and all of its uses from this workspace without asking the - * user for confirmation. - * @param {!Blockly.VariableModel} variable Variable to delete. - * @param {!Array.} uses An array of uses of the variable. - * @private - */ -Blockly.VariableMap.prototype.deleteVariableInternal_ = function(variable, - uses) { - var existingGroup = Blockly.Events.getGroup(); - if (!existingGroup) { - Blockly.Events.setGroup(true); - } - try { - for (var i = 0; i < uses.length; i++) { - uses[i].dispose(true, false); - } - this.deleteVariable(variable); - } finally { - if (!existingGroup) { - Blockly.Events.setGroup(false); - } - } -}; - -/* End functions for variable deletion. */ - -/** - * Find the variable by the given name and type and return it. Return null if - * it is not found. - * @param {string} name The name to check for. - * @param {string=} opt_type The type of the variable. If not provided it - * defaults to the empty string, which is a specific type. - * @return {Blockly.VariableModel} The variable with the given name, or null if - * it was not found. - */ -Blockly.VariableMap.prototype.getVariable = function(name, opt_type) { - var type = opt_type || ''; - var list = this.variableMap_[type]; - if (list) { - for (var j = 0, variable; variable = list[j]; j++) { - if (variable.name == name) { - return variable; - } - } - } - return null; -}; - -/** - * Find the variable by the given ID and return it. Return null if it is not - * found. - * @param {!string} id The id to check for. - * @return {?Blockly.VariableModel} The variable with the given id. - */ -Blockly.VariableMap.prototype.getVariableById = function(id) { - var keys = Object.keys(this.variableMap_); - for (var i = 0; i < keys.length; i++ ) { - var key = keys[i]; - for (var j = 0, variable; variable = this.variableMap_[key][j]; j++) { - if (variable.getId() == id) { - return variable; - } - } - } - return null; -}; - -/** - * Get a list containing all of the variables of a specified type. If type is - * null, return list of variables with empty string type. - * @param {?string} type Type of the variables to find. - * @return {!Array.} The sought after variables of the - * passed in type. An empty array if none are found. - */ -Blockly.VariableMap.prototype.getVariablesOfType = function(type) { - type = type || ''; - var variable_list = this.variableMap_[type]; - if (variable_list) { - return variable_list.slice(); - } - return []; -}; - -/** - * Return all variable types. This list always contains the empty string. - * @return {!Array.} List of variable types. - * @package - */ -Blockly.VariableMap.prototype.getVariableTypes = function() { - var types = Object.keys(this.variableMap_); - var hasEmpty = false; - for (var i = 0; i < types.length; i++) { - if (types[i] == '') { - hasEmpty = true; - } - } - if (!hasEmpty) { - types.push(''); - } - return types; -}; - -/** - * Return all variables of all types. - * @return {!Array.} List of variable models. - */ -Blockly.VariableMap.prototype.getAllVariables = function() { - var all_variables = []; - var keys = Object.keys(this.variableMap_); - for (var i = 0; i < keys.length; i++ ) { - all_variables = all_variables.concat(this.variableMap_[keys[i]]); - } - return all_variables; -}; - -/** - * Find all the uses of a named variable. - * @param {string} id ID of the variable to find. - * @return {!Array.} Array of block usages. - */ -Blockly.VariableMap.prototype.getVariableUsesById = function(id) { - var uses = []; - var blocks = this.workspace.getAllBlocks(); - // Iterate through every block and check the name. - for (var i = 0; i < blocks.length; i++) { - var blockVariables = blocks[i].getVarModels(); - if (blockVariables) { - for (var j = 0; j < blockVariables.length; j++) { - if (blockVariables[j].getId() == id) { - uses.push(blocks[i]); - } - } - } - } - return uses; -}; diff --git a/packages/scratch-blocks/core/variable_model.js b/packages/scratch-blocks/core/variable_model.js deleted file mode 100644 index 4c62d8c62..000000000 --- a/packages/scratch-blocks/core/variable_model.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Components for the variable model. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.provide('Blockly.VariableModel'); - -goog.require('Blockly.Events.VarCreate'); - -goog.require('goog.string'); - - -/** - * Class for a variable model. - * Holds information for the variable including name, ID, and type. - * @param {!Blockly.Workspace} workspace The variable's workspace. - * @param {!string} name The name of the variable. This must be unique across - * each variable type. - * @param {?string} opt_type The type of the variable like 'int' or 'string'. - * Does not need to be unique. Field_variable can filter variables based on - * their type. This will default to '' which is a specific type. - * @param {string=} opt_id The unique ID of the variable. This will default to - * a UUID. - * @param {boolean=} opt_isLocal Whether the variable is locally scoped. - * @param {boolean=} opt_isCloud Whether the variable is a cloud variable. - * @see {Blockly.FieldVariable} - * @constructor - */ -Blockly.VariableModel = function(workspace, name, opt_type, opt_id, - opt_isLocal, opt_isCloud) { - /** - * The workspace the variable is in. - * @type {!Blockly.Workspace} - */ - this.workspace = workspace; - - /** - * The name of the variable, typically defined by the user. It must be - * unique across all names used for procedures and variables. It may be - * changed by the user. - * @type {string} - */ - this.name = name; - - /** - * The type of the variable, such as 'int' or 'sound_effect'. This may be - * used to build a list of variables of a specific type. By default this is - * the empty string '', which is a specific type. - * @see {Blockly.FieldVariable} - * @type {string} - */ - this.type = opt_type || ''; - - /** - * A unique id for the variable. This should be defined at creation and - * not change, even if the name changes. In most cases this should be a - * UUID. - * @type {string} - * @private - */ - this.id_ = opt_id || Blockly.utils.genUid(); - - /** - * Whether this variable is locally scoped. - * @package - */ - this.isLocal = opt_isLocal || false; - - /** - * Whether the variable is a cloud variable. - * @package - */ - this.isCloud = opt_isCloud || false; - - Blockly.Events.fire(new Blockly.Events.VarCreate(this)); -}; - -/** - * @return {!string} The ID for the variable. - */ -Blockly.VariableModel.prototype.getId = function() { - return this.id_; -}; - -/** - * A custom compare function for the VariableModel objects. - * @param {Blockly.VariableModel} var1 First variable to compare. - * @param {Blockly.VariableModel} var2 Second variable to compare. - * @return {number} -1 if name of var1 is less than name of var2, 0 if equal, - * and 1 if greater. - * @package - */ -Blockly.VariableModel.compareByName = function(var1, var2) { - return Blockly.scratchBlocksUtils.compareStrings(var1.name, var2.name); -}; diff --git a/packages/scratch-blocks/core/variables.js b/packages/scratch-blocks/core/variables.js deleted file mode 100644 index 9c1155cde..000000000 --- a/packages/scratch-blocks/core/variables.js +++ /dev/null @@ -1,674 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Utility functions for handling variables. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.Variables - * @namespace - **/ -goog.provide('Blockly.Variables'); - -goog.require('Blockly.Blocks'); -goog.require('Blockly.constants'); -goog.require('Blockly.VariableModel'); -goog.require('Blockly.Workspace'); -goog.require('goog.string'); - - -/** - * Constant to separate variable names from procedures and generated functions - * when running generators. - * @deprecated Use Blockly.VARIABLE_CATEGORY_NAME - */ -Blockly.Variables.NAME_TYPE = Blockly.VARIABLE_CATEGORY_NAME; - -/** - * Constant prefix to differentiate cloud variable names from other types - * of variables. - * This is the \u2601 cloud unicode character followed by a space. - * @type {string} - * @package - */ -Blockly.Variables.CLOUD_PREFIX = '☁ '; - -/** - * Find all user-created variables that are in use in the workspace. - * For use by generators. - * @param {!Blockly.Block|!Blockly.Workspace} root Root block or workspace. - * @return {!Array.} Array of variable names. - */ -Blockly.Variables.allUsedVariables = function(root) { - var blocks; - if (root instanceof Blockly.Block) { - // Root is Block. - blocks = root.getDescendants(false); - } else if (root instanceof Blockly.Workspace || - root instanceof Blockly.WorkspaceSvg) { - // Root is Workspace. - blocks = root.getAllBlocks(); - } else { - throw 'Not Block or Workspace: ' + root; - } - - var ignorableName = Blockly.Variables.noVariableText(); - - var variableHash = Object.create(null); - // Iterate through every block and add each variable to the hash. - for (var x = 0; x < blocks.length; x++) { - var blockVariables = blocks[x].getVarModels(); - if (blockVariables) { - for (var y = 0; y < blockVariables.length; y++) { - var variable = blockVariables[y]; - // Variable ID may be null if the block is only half-built. - if (variable.getId() && variable.name.toLowerCase() != ignorableName) { - variableHash[variable.name.toLowerCase()] = variable.name; - } - } - } - } - // Flatten the hash into a list. - var variableList = []; - for (var name in variableHash) { - variableList.push(variableHash[name]); - } - return variableList; -}; - -/** - * Find all variables that the user has created through the workspace or - * toolbox. For use by generators. - * @param {!Blockly.Workspace} root The workspace to inspect. - * @return {!Array.} Array of variable models. - */ -Blockly.Variables.allVariables = function(root) { - if (root instanceof Blockly.Block) { - // Root is Block. - console.warn('Deprecated call to Blockly.Variables.allVariables ' + - 'with a block instead of a workspace. You may want ' + - 'Blockly.Variables.allUsedVariables'); - return {}; - } - return root.getAllVariables(); -}; - -/** - * Find all developer variables used by blocks in the workspace. - * Developer variables are never shown to the user, but are declared as global - * variables in the generated code. - * To declare developer variables, define the getDeveloperVariables function on - * your block and return a list of variable names. - * For use by generators. - * @param {!Blockly.Workspace} workspace The workspace to search. - * @return {!Array.} A list of non-duplicated variable names. - * @package - */ -Blockly.Variables.allDeveloperVariables = function(workspace) { - var blocks = workspace.getAllBlocks(); - var hash = {}; - for (var i = 0; i < blocks.length; i++) { - var block = blocks[i]; - if (block.getDeveloperVars) { - var devVars = block.getDeveloperVars(); - for (var j = 0; j < devVars.length; j++) { - hash[devVars[j]] = devVars[j]; - } - } - } - - // Flatten the hash into a list. - var list = []; - for (var name in hash) { - list.push(hash[name]); - } - return list; -}; - -/** -* Return the text that should be used in a field_variable or -* field_variable_getter when no variable exists. -* TODO: #572 -* @return {string} The text to display. - */ -Blockly.Variables.noVariableText = function() { - return "No variable selected"; -}; - -/** -* Return a new variable name that is not yet being used. This will try to -* generate single letter variable names in the range 'i' to 'z' to start with. -* If no unique name is located it will try 'i' to 'z', 'a' to 'h', -* then 'i2' to 'z2' etc. Skip 'l'. - * @param {!Blockly.Workspace} workspace The workspace to be unique in. -* @return {string} New variable name. -*/ -Blockly.Variables.generateUniqueName = function(workspace) { - var variableList = workspace.getAllVariables(); - var newName = ''; - if (variableList.length) { - var nameSuffix = 1; - var letters = 'ijkmnopqrstuvwxyzabcdefgh'; // No 'l'. - var letterIndex = 0; - var potName = letters.charAt(letterIndex); - while (!newName) { - var inUse = false; - for (var i = 0; i < variableList.length; i++) { - if (variableList[i].name.toLowerCase() == potName) { - // This potential name is already used. - inUse = true; - break; - } - } - if (inUse) { - // Try the next potential name. - letterIndex++; - if (letterIndex == letters.length) { - // Reached the end of the character sequence so back to 'i'. - // a new suffix. - letterIndex = 0; - nameSuffix++; - } - potName = letters.charAt(letterIndex); - if (nameSuffix > 1) { - potName += nameSuffix; - } - } else { - // We can use the current potential name. - newName = potName; - } - } - } else { - newName = 'i'; - } - return newName; -}; - -/** - * Remove any possiblity of conflict/duplication between a real and potential variable. - * When creating a new variable, checks whether the desired name and type already exists - * as a real or potential variable. - * If 'checkReal' is true, checks whether a real variable with the given - * name and type already exists. - * Checks whether a potential variable (using the given 'potentialVarWs') exists. - * If a potential var exists and a real var also exists, discards the potential var - * and returns the real var. - * If a potential var exists and a real var does not exist (or 'checkReal' - * was false), creates the potential var as a real var, - * discards the potential var, and returns the newly created real var. - * If a potential var does not exist, returns null. - * - * @param {string} varName The name of the variable to check for. - * @param {string} varType The type of the variable to check for. - * @param {!Blockly.Workspace} potentialVarWs The workspace containing the - * potential variable map we want to check against. - * @param {boolean} checkReal Whether or not to check if a variable of the given - * name and type exists as a real variable. - * @return {?Blockly.VariableModel} The matching variable, if one already existed - * in the real workspace; the newly transformed variable, if one already - * existed as a potential variable. Null, if no matching variable, real or - * potential, was found. - */ -Blockly.Variables.realizePotentialVar = function(varName, varType, potentialVarWs, - checkReal) { - var potentialVarMap = potentialVarWs.getPotentialVariableMap(); - var realWs = potentialVarWs.targetWorkspace; - if (!potentialVarMap) { - console.warn('Called Blockly.Variables.realizePotentialVar with incorrect ' + - 'workspace. The provided workspace does not have a potential variable map.'); - return; - } - // First check if a variable with the same name and type already exists as a - // real variable. - var realVar; - if (checkReal) { - realVar = Blockly.Variables.getVariable(realWs, null, varName, varType); - } - - // Check if variable with same name and type exists as a potential var - var potentialVar = potentialVarMap.getVariable(varName, varType); - if (!potentialVar) { - return null; - } - - // The potential var exists, so save its id and delete it from the potential - // variable map. - var id = potentialVar.getId(); - potentialVarMap.deleteVariable(potentialVar); - - // Depending on whether a real var already exists or not, either return the - // existing real var or turn the potential var into a new one using its id. - if (realVar) { - return realVar; - } - return realWs.createVariable(varName, varType, id); -}; - -/** - * Create a new variable on the given workspace. - * @param {!Blockly.Workspace} workspace The workspace on which to create the - * variable. - * @param {function(?string=)=} opt_callback An optional callback function to act - * on the id of the variable that is created from the user's input, or null - * if the change is to be aborted (cancel button or an invalid name was provided). - * @param {string} opt_type Optional type of the variable to be created, - * like 'string' or 'list'. - */ -Blockly.Variables.createVariable = function(workspace, opt_callback, opt_type) { - // Decide on a modal message based on the opt_type. If opt_type was not - // provided, default to the original message for scalar variables. - var newMsg, modalTitle; - if (opt_type == Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE) { - newMsg = Blockly.Msg.NEW_BROADCAST_MESSAGE_TITLE; - modalTitle = Blockly.Msg.BROADCAST_MODAL_TITLE; - } else if (opt_type == Blockly.LIST_VARIABLE_TYPE) { - newMsg = Blockly.Msg.NEW_LIST_TITLE; - modalTitle = Blockly.Msg.LIST_MODAL_TITLE; - } else { - // Note: this case covers 1) scalar variables, 2) any new type of - // variable not explicitly checked for above, and 3) a null or undefined - // opt_type -- turns a falsey opt_type into '' - // TODO (#1251) Warn developers that they didn't provide an opt_type/provided - // a falsey opt_type - opt_type = opt_type ? opt_type : ''; - newMsg = Blockly.Msg.NEW_VARIABLE_TITLE; - modalTitle = Blockly.Msg.VARIABLE_MODAL_TITLE; - } - var validate = Blockly.Variables.nameValidator_.bind(null, opt_type); - - // Prompt the user to enter a name for the variable - Blockly.prompt(newMsg, '', - function(text, additionalVars, variableOptions) { - variableOptions = variableOptions || {}; - var scope = variableOptions.scope; - var isLocal = (scope === 'local') || false; - var isCloud = variableOptions.isCloud || false; - // Default to [] if additionalVars is not provided - additionalVars = additionalVars || []; - // Only use additionalVars for global variable creation. - var additionalVarNames = isLocal ? [] : additionalVars; - - var validatedText = validate(text, workspace, additionalVarNames, isCloud, opt_callback); - if (validatedText) { - // The name is valid according to the type, create the variable - var potentialVarMap = workspace.getPotentialVariableMap(); - var variable; - // This check ensures that if a new variable is being created from a - // workspace that already has a variable of the same name and type as - // a potential variable, that potential variable gets turned into a - // real variable and thus there aren't duplicate options in the field_variable - // dropdown. - if (potentialVarMap && opt_type) { - variable = Blockly.Variables.realizePotentialVar(validatedText, - opt_type, workspace, false); - } - if (!variable) { - variable = workspace.createVariable(validatedText, opt_type, null, isLocal, isCloud); - } - - var flyout = workspace.isFlyout ? workspace : workspace.getFlyout(); - var variableBlockId = variable.getId(); - if (flyout.setCheckboxState) { - flyout.setCheckboxState(variableBlockId, true); - } - - if (opt_callback) { - opt_callback(variableBlockId); - } - } else { - // User canceled prompt without a value. - if (opt_callback) { - opt_callback(null); - } - } - }, modalTitle, opt_type); -}; - -/** - * This function provides a common interface for variable name validation agnostic - * of type. This is so that functions like Blockly.Variables.createVariable and - * Blockly.Variables.renameVariable can call a single function (with a single - * type signature) to validate the user-provided name for a variable. - * @param {string} type The type of the variable for which the provided name - * should be validated. - * @param {string} text The user-provided text that should be validated as a - * variable name. - * @param {!Blockly.Workspace} workspace The workspace on which to validate the - * variable name. This is the workspace used to check whether the variable - * already exists. - * @param {Array} additionalVars A list of additional var names to check - * for conflicts against. - * @param {boolean} isCloud Whether the variable is a cloud variable. - * @param {function(?string=)=} opt_callback An optional function to be called on - * a pre-existing variable of the user-provided name. This function is currently - * only used for broadcast messages. - * @return {string} The validated name according to the parameters given, if - * the name is determined to be valid, or null if the name - * is determined to be invalid/in-use, and the calling function should not - * proceed with creating or renaming the variable. - * @private - */ -Blockly.Variables.nameValidator_ = function(type, text, workspace, additionalVars, - isCloud, opt_callback) { - // The validators for the different variable types require slightly different arguments. - // For broadcast messages, if a broadcast message of the provided name already exists, - // the validator needs to call a function that updates the selected - // field option of the dropdown menu of the block that was used to create the new message. - // For scalar variables and lists, the validator has the same validation behavior, but needs - // to know which type of variable to check for and needs a type-specific error message - // that is displayed when a variable of the given name and type already exists. - - if (type == Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE) { - return Blockly.Variables.validateBroadcastMessageName_(text, workspace, opt_callback); - } else if (type == Blockly.LIST_VARIABLE_TYPE) { - return Blockly.Variables.validateScalarVarOrListName_(text, workspace, additionalVars, false, type, - Blockly.Msg.LIST_ALREADY_EXISTS); - } else { - return Blockly.Variables.validateScalarVarOrListName_(text, workspace, additionalVars, isCloud, type, - Blockly.Msg.VARIABLE_ALREADY_EXISTS); - } -}; - -/** - * Validate the given name as a broadcast message type. - * @param {string} name The name to validate - * @param {!Blockly.Workspace} workspace The workspace the name should be validated - * against. - * @param {function(?string=)=} opt_callback An optional function to call if a broadcast - * message already exists with the given name. This function will be called on the id - * of the existing variable. - * @return {string} The validated name, or null if invalid. - * @private - */ -Blockly.Variables.validateBroadcastMessageName_ = function(name, workspace, opt_callback) { - if (!name) { // no name was provided or the user cancelled the prompt - return null; - } - var variable = workspace.getVariable(name, Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE); - if (variable) { - // If the user provided a name for a broadcast message that already exists, - // use the provided callback function to update the selected option in - // the field of the block that was used to create - // this message. - if (opt_callback) { - opt_callback(variable.getId()); - } - // Return null to signal to the calling function that we do not want to create - // a new variable since one already exists. - return null; - } else { - // The name provided is actually a new name, so the calling - // function should go ahead and create it as a new variable. - return name; - } -}; - -/** - * Validate the given name as a scalar variable or list type. - * This function is also responsible for any user facing error-handling. - * @param {string} name The name to validate - * @param {!Blockly.Workspace} workspace The workspace the name should be validated - * against. - * @param {Array} additionalVars A list of additional variable names to check - * for conflicts against. - * @param {boolean} isCloud Whether the variable is a cloud variable. - * @param {string} type The type to validate the variable as. This should be one of - * Blockly.SCALAR_VARIABLE_TYPE or Blockly.LIST_VARIABLE_TYPE. - * @param {string} errorMsg The type-specific error message the user should see - * if a variable of the validated, given name and type already exists. - * @return {string} The validated name, or null if invalid. - * @private - */ -Blockly.Variables.validateScalarVarOrListName_ = function(name, workspace, additionalVars, - isCloud, type, errorMsg) { - // For scalar variables, we don't want leading or trailing white space - name = Blockly.Variables.trimName_(name); - if (!name) { - return null; - } - if (isCloud) { - name = Blockly.Variables.CLOUD_PREFIX + name; - } - if (workspace.getVariable(name, type) || additionalVars.indexOf(name) >= 0) { - // error - Blockly.alert(errorMsg.replace('%1', name)); - return null; - } else { // trimmed name is valid - return name; - } -}; - -/** - * Rename a variable with the given workspace, variableType, and oldName. - * @param {!Blockly.Workspace} workspace The workspace on which to rename the - * variable. - * @param {Blockly.VariableModel} variable Variable to rename. - * @param {function(?string=)=} opt_callback A callback. It will - * be passed an acceptable new variable name, or null if change is to be - * aborted (cancel button), or undefined if an existing variable was chosen. - */ -Blockly.Variables.renameVariable = function(workspace, variable, - opt_callback) { - // Validation and modal message/title depends on the variable type - var promptMsg, modalTitle; - var varType = variable.type; - if (varType == Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE) { - console.warn('Unexpected attempt to rename a broadcast message with ' + - 'id: ' + variable.getId() + ' and name: ' + variable.name); - return; - } - if (varType == Blockly.LIST_VARIABLE_TYPE) { - promptMsg = Blockly.Msg.RENAME_LIST_TITLE; - modalTitle = Blockly.Msg.RENAME_LIST_MODAL_TITLE; - } else { - // Default for all other types of variables - promptMsg = Blockly.Msg.RENAME_VARIABLE_TITLE; - modalTitle = Blockly.Msg.RENAME_VARIABLE_MODAL_TITLE; - } - var validate = Blockly.Variables.nameValidator_.bind(null, varType); - - var promptText = promptMsg.replace('%1', variable.name); - var promptDefaultText = variable.name; - if (variable.isCloud && variable.name.indexOf(Blockly.Variables.CLOUD_PREFIX) == 0) { - promptDefaultText = promptDefaultText.substring(Blockly.Variables.CLOUD_PREFIX.length); - } - - Blockly.prompt(promptText, promptDefaultText, - function(newName, additionalVars) { - if (variable.isCloud && - newName.length > 0 && newName.indexOf(Blockly.Variables.CLOUD_PREFIX) == 0) { - newName = newName.substring(Blockly.Variables.CLOUD_PREFIX.length); - // The name validator will add the prefix back - } - additionalVars = additionalVars || []; - var additionalVarNames = variable.isLocal ? [] : additionalVars; - var validatedText = validate(newName, workspace, additionalVarNames, variable.isCloud); - if (validatedText) { - workspace.renameVariableById(variable.getId(), validatedText); - if (opt_callback) { - opt_callback(newName); - } - } else { - // User canceled prompt without a value. - if (opt_callback) { - opt_callback(null); - } - } - }, modalTitle, varType); -}; - -/** - * Strip leading and trailing whitespace from the given name, for use with - * user provided name for scalar variables and lists. - * @param {string} name The user-provided name of the variable. - * @return {string} The trimmed name, or whatever falsey value was originally provided. - */ -Blockly.Variables.trimName_ = function(name) { - if (name) { - return goog.string.trim(name); - } else { - // Return whatever was provided - return name; - } -}; - -/** - * Generate XML string for variable field. - * @param {!Blockly.VariableModel} variableModel The variable model to generate - * an XML string from. - * @param {?string} opt_name The optional name of the field, such as "VARIABLE" - * or "LIST". Defaults to "VARIABLE". - * @return {string} The generated XML. - * @private - */ -Blockly.Variables.generateVariableFieldXml_ = function(variableModel, opt_name) { - // The variable name may be user input, so it may contain characters that need - // to be escaped to create valid XML. - var typeString = variableModel.type; - if (typeString == '') { - typeString = '\'\''; - } - var fieldName = opt_name || 'VARIABLE'; - var text = '' + goog.string.htmlEscape(variableModel.name) + ''; - return text; -}; - -/** - * Helper function to look up or create a variable on the given workspace. - * If no variable exists, creates and returns it. - * @param {!Blockly.Workspace} workspace The workspace to search for the - * variable. It may be a flyout workspace or main workspace. - * @param {string} id The ID to use to look up or create the variable, or null. - * @param {string=} opt_name The string to use to look up or create the - * variable. - * @param {string=} opt_type The type to use to look up or create the variable. - * @return {!Blockly.VariableModel} The variable corresponding to the given ID - * or name + type combination. - * @package - */ -Blockly.Variables.getOrCreateVariablePackage = function(workspace, id, opt_name, - opt_type) { - var variable = Blockly.Variables.getVariable(workspace, id, opt_name, - opt_type); - if (!variable) { - variable = Blockly.Variables.createVariable_(workspace, id, opt_name, - opt_type); - } - return variable; -}; - -/** - * Look up a variable on the given workspace. - * Always looks in the main workspace before looking in the flyout workspace. - * Always prefers lookup by ID to lookup by name + type. - * @param {!Blockly.Workspace} workspace The workspace to search for the - * variable. It may be a flyout workspace or main workspace. - * @param {string} id The ID to use to look up the variable, or null. - * @param {string=} opt_name The string to use to look up the variable. Only - * used if lookup by ID fails. - * @param {string=} opt_type The type to use to look up the variable. Only used - * if lookup by ID fails. - * @return {?Blockly.VariableModel} The variable corresponding to the given ID - * or name + type combination, or null if not found. - * @package - */ -Blockly.Variables.getVariable = function(workspace, id, opt_name, opt_type) { - var potentialVariableMap = workspace.getPotentialVariableMap(); - // Try to just get the variable, by ID if possible. - if (id) { - // Look in the real variable map before checking the potential variable map. - var variable = workspace.getVariableById(id); - if (!variable && potentialVariableMap) { - variable = potentialVariableMap.getVariableById(id); - } - } else if (opt_name) { - if (opt_type == undefined) { - throw new Error('Tried to look up a variable by name without a type'); - } - // Otherwise look up by name and type. - var variable = workspace.getVariable(opt_name, opt_type); - if (!variable && potentialVariableMap) { - variable = potentialVariableMap.getVariable(opt_name, opt_type); - } - } - return variable; -}; - -/** - * Helper function to create a variable on the given workspace. - * @param {!Blockly.Workspace} workspace The workspace in which to create the - * variable. It may be a flyout workspace or main workspace. - * @param {string} id The ID to use to create the variable, or null. - * @param {string=} opt_name The string to use to create the variable. - * @param {string=} opt_type The type to use to create the variable. - * @return {!Blockly.VariableModel} The variable corresponding to the given ID - * or name + type combination. - * @private - */ -Blockly.Variables.createVariable_ = function(workspace, id, opt_name, - opt_type) { - var potentialVariableMap = workspace.getPotentialVariableMap(); - // Variables without names get uniquely named for this workspace. - if (!opt_name) { - var ws = workspace.isFlyout ? workspace.targetWorkspace : workspace; - opt_name = Blockly.Variables.generateUniqueName(ws); - } - - // Create a potential variable if in the flyout. - if (potentialVariableMap) { - var variable = potentialVariableMap.createVariable(opt_name, opt_type, id); - } else { // In the main workspace, create a real variable. - var variable = workspace.createVariable(opt_name, opt_type, id); - } - return variable; -}; - -/** - * Helper function to get the list of variables that have been added to the - * workspace after adding a new block, using the given list of variables that - * were in the workspace before the new block was added. - * @param {!Blockly.Workspace} workspace The workspace to inspect. - * @param {!Array.} originalVariables The array of - * variables that existed in the workspace before adding the new block. - * @return {!Array.} The new array of variables that were - * freshly added to the workspace after creating the new block, or [] if no - * new variables were added to the workspace. - * @package - */ -Blockly.Variables.getAddedVariables = function(workspace, originalVariables) { - var allCurrentVariables = workspace.getAllVariables(); - var addedVariables = []; - if (originalVariables.length != allCurrentVariables.length) { - for (var i = 0; i < allCurrentVariables.length; i++) { - var variable = allCurrentVariables[i]; - // For any variable that is present in allCurrentVariables but not - // present in originalVariables, add the variable to addedVariables. - if (!originalVariables.includes(variable)) { - addedVariables.push(variable); - } - } - } - return addedVariables; -}; diff --git a/packages/scratch-blocks/core/warning.js b/packages/scratch-blocks/core/warning.js deleted file mode 100644 index 8ea805bd3..000000000 --- a/packages/scratch-blocks/core/warning.js +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a warning. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Warning'); - -goog.require('Blockly.Bubble'); -goog.require('Blockly.Events.Ui'); -goog.require('Blockly.Icon'); - - -/** - * Class for a warning. - * @param {!Blockly.Block} block The block associated with this warning. - * @extends {Blockly.Icon} - * @constructor - */ -Blockly.Warning = function(block) { - Blockly.Warning.superClass_.constructor.call(this, block); - this.createIcon(); - // The text_ object can contain multiple warnings. - this.text_ = {}; -}; -goog.inherits(Blockly.Warning, Blockly.Icon); - -/** - * Does this icon get hidden when the block is collapsed. - */ -Blockly.Warning.prototype.collapseHidden = false; - -/** - * Draw the warning icon. - * @param {!Element} group The icon group. - * @private - */ -Blockly.Warning.prototype.drawIcon_ = function(group) { - // Triangle with rounded corners. - Blockly.utils.createSvgElement('path', - { - 'class': 'blocklyIconShape', - 'd': 'M2,15Q-1,15 0.5,12L6.5,1.7Q8,-1 9.5,1.7L15.5,12Q17,15 14,15z' - }, - group); - // Can't use a real '!' text character since different browsers and operating - // systems render it differently. - // Body of exclamation point. - Blockly.utils.createSvgElement('path', - { - 'class': 'blocklyIconSymbol', - 'd': 'm7,4.8v3.16l0.27,2.27h1.46l0.27,-2.27v-3.16z' - }, - group); - // Dot of exclamation point. - Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyIconSymbol', - 'x': '7', - 'y': '11', - 'height': '2', - 'width': '2' - }, - group); -}; - -/** - * Create the text for the warning's bubble. - * @param {string} text The text to display. - * @return {!SVGTextElement} The top-level node of the text. - * @private - */ -Blockly.Warning.textToDom_ = function(text) { - var paragraph = /** @type {!SVGTextElement} */ - (Blockly.utils.createSvgElement( - 'text', - { - 'class': 'blocklyText blocklyBubbleText', - 'y': Blockly.Bubble.BORDER_WIDTH - }, - null) - ); - var lines = text.split('\n'); - for (var i = 0; i < lines.length; i++) { - var tspanElement = Blockly.utils.createSvgElement('tspan', - {'dy': '1em', 'x': Blockly.Bubble.BORDER_WIDTH}, paragraph); - var textNode = document.createTextNode(lines[i]); - tspanElement.appendChild(textNode); - } - return paragraph; -}; - -/** - * Show or hide the warning bubble. - * @param {boolean} visible True if the bubble should be visible. - */ -Blockly.Warning.prototype.setVisible = function(visible) { - if (visible == this.isVisible()) { - // No change. - return; - } - Blockly.Events.fire( - new Blockly.Events.Ui(this.block_, 'warningOpen', !visible, visible)); - if (visible) { - // Create the bubble to display all warnings. - var paragraph = Blockly.Warning.textToDom_(this.getText()); - this.bubble_ = new Blockly.Bubble( - /** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace), - paragraph, this.block_.svgPath_, this.iconXY_, null, null); - if (this.block_.RTL) { - // Right-align the paragraph. - // This cannot be done until the bubble is rendered on screen. - var maxWidth = paragraph.getBBox().width; - for (var i = 0, textElement; textElement = paragraph.childNodes[i]; i++) { - textElement.setAttribute('text-anchor', 'end'); - textElement.setAttribute('x', maxWidth + Blockly.Bubble.BORDER_WIDTH); - } - } - this.updateColour(); - // Bump the warning into the right location. - var size = this.bubble_.getBubbleSize(); - this.bubble_.setBubbleSize(size.width, size.height); - } else { - // Dispose of the bubble. - this.bubble_.dispose(); - this.bubble_ = null; - this.body_ = null; - } -}; - -/** - * Bring the warning to the top of the stack when clicked on. - * @param {!Event} _e Mouse up event. - * @private - */ -Blockly.Warning.prototype.bodyFocus_ = function(_e) { - this.bubble_.promote_(); -}; - -/** - * Set this warning's text. - * @param {string} text Warning text (or '' to delete). - * @param {string} id An ID for this text entry to be able to maintain - * multiple warnings. - */ -Blockly.Warning.prototype.setText = function(text, id) { - if (this.text_[id] == text) { - return; - } - if (text) { - this.text_[id] = text; - } else { - delete this.text_[id]; - } - if (this.isVisible()) { - this.setVisible(false); - this.setVisible(true); - } -}; - -/** - * Get this warning's texts. - * @return {string} All texts concatenated into one string. - */ -Blockly.Warning.prototype.getText = function() { - var allWarnings = []; - for (var id in this.text_) { - allWarnings.push(this.text_[id]); - } - return allWarnings.join('\n'); -}; - -/** - * Dispose of this warning. - */ -Blockly.Warning.prototype.dispose = function() { - this.block_.warning = null; - Blockly.Icon.prototype.dispose.call(this); -}; diff --git a/packages/scratch-blocks/core/widgetdiv.js b/packages/scratch-blocks/core/widgetdiv.js deleted file mode 100644 index 44c476a77..000000000 --- a/packages/scratch-blocks/core/widgetdiv.js +++ /dev/null @@ -1,344 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2013 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview A div that floats on top of Blockly. This singleton contains - * temporary HTML UI widgets that the user is currently interacting with. - * E.g. text input areas, colour pickers, context menus. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.WidgetDiv - * @namespace - **/ -goog.provide('Blockly.WidgetDiv'); - -goog.require('Blockly.Css'); -goog.require('goog.dom'); -goog.require('goog.dom.TagName'); -goog.require('goog.style'); - - -/** - * The HTML container. Set once by Blockly.WidgetDiv.createDom. - * @type {Element} - */ -Blockly.WidgetDiv.DIV = null; - -/** - * The object currently using this container. - * @type {Object} - * @private - */ -Blockly.WidgetDiv.owner_ = null; - -/** - * Optional cleanup function set by whichever object uses the widget. - * This is called as soon as a dispose is desired. If the dispose should - * be animated, the animation should start on the call of dispose_. - * @type {Function} - * @private - */ -Blockly.WidgetDiv.dispose_ = null; - -/** - * Optional function called at the end of a dispose animation. - * Set by whichever object is using the widget. - * @type {Function} - * @private - */ -Blockly.WidgetDiv.disposeAnimationFinished_ = null; - -/** - * Timer ID for the dispose animation. - * @type {number} - * @private - */ -Blockly.WidgetDiv.disposeAnimationTimer_ = null; - -/** - * Length of time in seconds for the dispose animation. - * @type {number} - * @private - */ -Blockly.WidgetDiv.disposeAnimationTimerLength_ = 0; - - -/** - * Create the widget div and inject it onto the page. - */ -Blockly.WidgetDiv.createDom = function() { - if (Blockly.WidgetDiv.DIV) { - return; // Already created. - } - // Create an HTML container for popup overlays (e.g. editor widgets). - Blockly.WidgetDiv.DIV = - goog.dom.createDom(goog.dom.TagName.DIV, 'blocklyWidgetDiv'); - document.body.appendChild(Blockly.WidgetDiv.DIV); -}; - -/** - * Initialize and display the widget div. Close the old one if needed. - * @param {!Object} newOwner The object that will be using this container. - * @param {boolean} rtl Right-to-left (true) or left-to-right (false). - * @param {Function=} opt_dispose Optional cleanup function to be run when the widget - * is closed. If the dispose is animated, this function must start the animation. - * @param {Function=} opt_disposeAnimationFinished Optional cleanup function to be run - * when the widget is done animating and must disappear. - * @param {number=} opt_disposeAnimationTimerLength Length of animation time in seconds - if a dispose animation is provided. - */ -Blockly.WidgetDiv.show = function(newOwner, rtl, opt_dispose, - opt_disposeAnimationFinished, opt_disposeAnimationTimerLength) { - Blockly.WidgetDiv.hide(); - Blockly.WidgetDiv.owner_ = newOwner; - Blockly.WidgetDiv.dispose_ = opt_dispose; - Blockly.WidgetDiv.disposeAnimationFinished_ = opt_disposeAnimationFinished; - Blockly.WidgetDiv.disposeAnimationTimerLength_ = opt_disposeAnimationTimerLength; - // Temporarily move the widget to the top of the screen so that it does not - // cause a scrollbar jump in Firefox when displayed. - var xy = goog.style.getViewportPageOffset(document); - Blockly.WidgetDiv.DIV.style.top = xy.y + 'px'; - Blockly.WidgetDiv.DIV.style.direction = rtl ? 'rtl' : 'ltr'; - Blockly.WidgetDiv.DIV.style.display = 'block'; -}; - -/** - * Repositions the widgetDiv on window resize. If it doesn't know how to - * calculate the new position, it wll just hide it instead. - */ -Blockly.WidgetDiv.repositionForWindowResize = function() { - // This condition mainly catches the widget div when it is being used as a - // text input. It is important not to close it in this case because on Android, - // when a field is focused, the soft keyboard opens triggering a window resize - // event and we want the widget div to stick around so users can type into it. - if (Blockly.WidgetDiv.owner_ - && Blockly.WidgetDiv.owner_.getScaledBBox_ - && Blockly.WidgetDiv.owner_.getSize) { - var widgetScaledBBox = Blockly.WidgetDiv.owner_.getScaledBBox_(); - var widgetSize = Blockly.WidgetDiv.owner_.getSize(); - Blockly.WidgetDiv.positionInternal_(widgetScaledBBox.left, widgetScaledBBox.top, - widgetSize.height); - } else { - Blockly.WidgetDiv.hide(); - } -}; - -/** - * Destroy the widget and hide the div. - * @param {boolean=} opt_noAnimate If set, animation will not be run for the hide. - */ -Blockly.WidgetDiv.hide = function(opt_noAnimate) { - if (Blockly.WidgetDiv.disposeAnimationTimer_) { - // An animation timer is set already. - // This happens when a previous widget was animating out, - // but Blockly is hiding the widget to create a new one. - // So, short-circuit the animation and clear the timer. - window.clearTimeout(Blockly.WidgetDiv.disposeAnimationTimer_); - Blockly.WidgetDiv.disposeAnimationFinished_ && Blockly.WidgetDiv.disposeAnimationFinished_(); - Blockly.WidgetDiv.disposeAnimationFinished_ = null; - Blockly.WidgetDiv.disposeAnimationTimer_ = null; - Blockly.WidgetDiv.owner_ = null; - Blockly.WidgetDiv.hideAndClearDom_(); - } else if (Blockly.WidgetDiv.isVisible()) { - // No animation timer set, but the widget is visible - // Start animation out (or immediately hide) - Blockly.WidgetDiv.dispose_ && Blockly.WidgetDiv.dispose_(); - Blockly.WidgetDiv.dispose_ = null; - // If we want to animate out, set the appropriate timer for final dispose. - if (Blockly.WidgetDiv.disposeAnimationFinished_ && !opt_noAnimate) { - Blockly.WidgetDiv.disposeAnimationTimer_ = window.setTimeout( - Blockly.WidgetDiv.hide, // Come back to hide and take the first branch. - Blockly.WidgetDiv.disposeAnimationTimerLength_ * 1000 - ); - } else { - // No timer provided (or no animation desired) - auto-hide the DOM now. - Blockly.WidgetDiv.disposeAnimationFinished_ && Blockly.WidgetDiv.disposeAnimationFinished_(); - Blockly.WidgetDiv.disposeAnimationFinished_ = null; - Blockly.WidgetDiv.owner_ = null; - Blockly.WidgetDiv.hideAndClearDom_(); - } - } -}; - -/** - * Hide all DOM for the WidgetDiv, and clear its children. - * @private - */ -Blockly.WidgetDiv.hideAndClearDom_ = function() { - Blockly.WidgetDiv.DIV.style.display = 'none'; - Blockly.WidgetDiv.DIV.style.left = ''; - Blockly.WidgetDiv.DIV.style.top = ''; - Blockly.WidgetDiv.DIV.style.height = ''; - goog.dom.removeChildren(Blockly.WidgetDiv.DIV); -}; - -/** - * Is the container visible? - * @return {boolean} True if visible. - */ -Blockly.WidgetDiv.isVisible = function() { - return !!Blockly.WidgetDiv.owner_; -}; - -/** - * Destroy the widget and hide the div if it is being used by the specified - * object. - * @param {!Object} oldOwner The object that was using this container. - */ -Blockly.WidgetDiv.hideIfOwner = function(oldOwner) { - if (Blockly.WidgetDiv.owner_ == oldOwner) { - Blockly.WidgetDiv.hide(); - } -}; - -/** - * Position the widget at a given location. Prevent the widget from going - * offscreen top or left (right in RTL). - * @param {number} anchorX Horizontal location (window coordinates, not body). - * @param {number} anchorY Vertical location (window coordinates, not body). - * @param {!goog.math.Size} windowSize Height/width of window. - * @param {!goog.math.Coordinate} scrollOffset X/y of window scrollbars. - * @param {boolean} rtl True if RTL, false if LTR. - */ -Blockly.WidgetDiv.position = function(anchorX, anchorY, windowSize, - scrollOffset, rtl) { - // Don't let the widget go above the top edge of the window. - if (anchorY < scrollOffset.y) { - anchorY = scrollOffset.y; - } - if (rtl) { - // Don't let the widget go right of the right edge of the window. - if (anchorX > windowSize.width + scrollOffset.x) { - anchorX = windowSize.width + scrollOffset.x; - } - } else { - // Don't let the widget go left of the left edge of the window. - if (anchorX < scrollOffset.x) { - anchorX = scrollOffset.x; - } - } - Blockly.WidgetDiv.positionInternal_(anchorX, anchorY, windowSize.height); -}; - -/** - * Set the widget div's position and height. This function does nothing clever: - * it will not ensure that your widget div ends up in the visible window. - * @param {number} x Horizontal location (window coordinates, not body). - * @param {number} y Vertical location (window coordinates, not body). - * @param {number} height The height of the widget div (pixels). - * @private - */ -Blockly.WidgetDiv.positionInternal_ = function(x, y, height) { - Blockly.WidgetDiv.DIV.style.left = x + 'px'; - Blockly.WidgetDiv.DIV.style.top = y + 'px'; - Blockly.WidgetDiv.DIV.style.height = height + 'px'; -}; - -/** - * Position the widget div based on an anchor rectangle. - * The widget should be placed adjacent to but not overlapping the anchor - * rectangle. The preferred position is directly below and aligned to the left - * (ltr) or right (rtl) side of the anchor. - * @param {!Object} viewportBBox The bounding rectangle of the current viewport, - * in window coordinates. - * @param {!Object} anchorBBox The bounding rectangle of the anchor, in window - * coordinates. - * @param {!goog.math.Size} widgetSize The size of the widget that is inside the - * widget div, in window coordinates. - * @param {boolean} rtl Whether the workspace is in RTL mode. This determines - * horizontal alignment. - * @package - */ -Blockly.WidgetDiv.positionWithAnchor = function(viewportBBox, anchorBBox, - widgetSize, rtl) { - var y = Blockly.WidgetDiv.calculateY_(viewportBBox, anchorBBox, widgetSize); - var x = Blockly.WidgetDiv.calculateX_(viewportBBox, anchorBBox, widgetSize, - rtl); - - if (y < 0) { - Blockly.WidgetDiv.positionInternal_(x, 0, widgetSize.height + y); - } - else { - Blockly.WidgetDiv.positionInternal_(x, y, widgetSize.height); - } -}; - -/** - * Calculate an x position (in window coordinates) such that the widget will not - * be offscreen on the right or left. - * @param {!Object} viewportBBox The bounding rectangle of the current viewport, - * in window coordinates. - * @param {!Object} anchorBBox The bounding rectangle of the anchor, in window - * coordinates. - * @param {goog.math.Size} widgetSize The dimensions of the widget inside the - * widget div. - * @param {boolean} rtl Whether the Blockly workspace is in RTL mode. - * @return {number} A valid x-coordinate for the top left corner of the widget - * div, in window coordinates. - * @private - */ -Blockly.WidgetDiv.calculateX_ = function(viewportBBox, anchorBBox, widgetSize, - rtl) { - if (rtl) { - // Try to align the right side of the field and the right side of the widget. - var widgetLeft = anchorBBox.right - widgetSize.width; - // Don't go offscreen left. - var x = Math.max(widgetLeft, viewportBBox.left); - // But really don't go offscreen right: - return Math.min(x, viewportBBox.right - widgetSize.width); - } else { - // Try to align the left side of the field and the left side of the widget. - // Don't go offscreen right. - var x = Math.min(anchorBBox.left, - viewportBBox.right - widgetSize.width); - // But left is more important, because that's where the text is. - return Math.max(x, viewportBBox.left); - } -}; - -/** - * Calculate a y position (in window coordinates) such that the widget will not - * be offscreen on the top or bottom. - * @param {!Object} viewportBBox The bounding rectangle of the current viewport, - * in window coordinates. - * @param {!Object} anchorBBox The bounding rectangle of the anchor, in window - * coordinates. - * @param {goog.math.Size} widgetSize The dimensions of the widget inside the - * widget div. - * @return {number} A valid y-coordinate for the top left corner of the widget - * div, in window coordinates. - * @private - */ -Blockly.WidgetDiv.calculateY_ = function(viewportBBox, anchorBBox, widgetSize) { - // Flip the widget vertically if off the bottom. - if (anchorBBox.bottom + widgetSize.height >= - viewportBBox.bottom) { - // The bottom of the widget is at the top of the field. - return anchorBBox.top - widgetSize.height; - // The widget could go off the top of the window, but it would also go off - // the bottom. The window is just too small. - } else { - // The top of the widget is at the bottom of the field. - return anchorBBox.bottom; - } -}; diff --git a/packages/scratch-blocks/core/workspace.js b/packages/scratch-blocks/core/workspace.js deleted file mode 100644 index 904315dc3..000000000 --- a/packages/scratch-blocks/core/workspace.js +++ /dev/null @@ -1,673 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a workspace. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.Workspace'); - -goog.require('Blockly.VariableMap'); -goog.require('Blockly.WorkspaceComment'); -goog.require('goog.array'); -goog.require('goog.math'); - - -/** - * Class for a workspace. This is a data structure that contains blocks. - * There is no UI, and can be created headlessly. - * @param {!Blockly.Options=} opt_options Dictionary of options. - * @constructor - */ -Blockly.Workspace = function(opt_options) { - /** @type {string} */ - this.id = Blockly.utils.genUid(); - Blockly.Workspace.WorkspaceDB_[this.id] = this; - /** @type {!Blockly.Options} */ - this.options = opt_options || {}; - /** @type {boolean} */ - this.RTL = !!this.options.RTL; - /** @type {boolean} */ - this.horizontalLayout = !!this.options.horizontalLayout; - /** @type {number} */ - this.toolboxPosition = this.options.toolboxPosition; - - /** - * @type {!Array.} - * @private - */ - this.topBlocks_ = []; - /** - * @type {!Array.} - * @private - */ - this.topComments_ = []; - /** - * @type {!Object} - * @private - */ - this.commentDB_ = Object.create(null); - /** - * @type {!Array.} - * @private - */ - this.listeners_ = []; - - /** @type {!Array.} */ - this.tapListeners_ = []; - - /** - * @type {!Array.} - * @protected - */ - this.undoStack_ = []; - - /** - * @type {!Array.} - * @protected - */ - this.redoStack_ = []; - - /** - * @type {!Object} - * @private - */ - this.blockDB_ = Object.create(null); - - /** - * @type {!Blockly.VariableMap} - * A map from variable type to list of variable names. The lists contain all - * of the named variables in the workspace, including variables - * that are not currently in use. - * @private - */ - this.variableMap_ = new Blockly.VariableMap(this); - - /** - * Blocks in the flyout can refer to variables that don't exist in the main - * workspace. For instance, the "get item in list" block refers to an "item" - * variable regardless of whether the variable has been created yet. - * A FieldVariable must always refer to a Blockly.VariableModel. We reconcile - * these by tracking "potential" variables in the flyout. These variables - * become real when references to them are dragged into the main workspace. - * @type {!Blockly.VariableMap} - * @private - */ - this.potentialVariableMap_ = null; -}; - -/** - * Returns `true` if the workspace is visible and `false` if it's headless. - * @type {boolean} - */ -Blockly.Workspace.prototype.rendered = false; - -/** - * Returns `true` if the workspace is currently in the process of a bulk clear. - * @type {boolean} - * @package - */ -Blockly.Workspace.prototype.isClearing = false; - -/** - * Maximum number of undo events in stack. `0` turns off undo, `Infinity` sets it to unlimited. - * @type {number} - */ -Blockly.Workspace.prototype.MAX_UNDO = 1024; - -// TODO (#1354) Update this function when it is fixed upstream -/** - * Refresh the toolbox. This is a no-op in a non-rendered workspace, - * but may be overriden by subclasses. - * @private - */ -Blockly.Workspace.prototype.refreshToolboxSelection_ = function() { - // No-op. Overriden by subclass. -}; - -/** - * Dispose of this workspace. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.Workspace.prototype.dispose = function() { - this.listeners_.length = 0; - this.clear(); - // Remove from workspace database. - delete Blockly.Workspace.WorkspaceDB_[this.id]; -}; - -/** - * Angle away from the horizontal to sweep for blocks. Order of execution is - * generally top to bottom, but a small angle changes the scan to give a bit of - * a left to right bias (reversed in RTL). Units are in degrees. - * See: http://tvtropes.org/pmwiki/pmwiki.php/Main/DiagonalBilling. - */ -Blockly.Workspace.SCAN_ANGLE = 3; - -/** - * Add a block to the list of top blocks. - * @param {!Blockly.Block} block Block to add. - */ -Blockly.Workspace.prototype.addTopBlock = function(block) { - this.topBlocks_.push(block); -}; - -/** - * Remove a block from the list of top blocks. - * @param {!Blockly.Block} block Block to remove. - */ -Blockly.Workspace.prototype.removeTopBlock = function(block) { - if (!goog.array.remove(this.topBlocks_, block)) { - throw 'Block not present in workspace\'s list of top-most blocks.'; - } -}; - -/** - * Finds the top-level blocks and returns them. Blocks are optionally sorted - * by position; top to bottom (with slight LTR or RTL bias). - * @param {boolean} ordered Sort the list if true. - * @return {!Array.} The top-level block objects. - */ -Blockly.Workspace.prototype.getTopBlocks = function(ordered) { - // Copy the topBlocks_ list. - var blocks = [].concat(this.topBlocks_); - if (ordered && blocks.length > 1) { - var offset = Math.sin(goog.math.toRadians(Blockly.Workspace.SCAN_ANGLE)); - if (this.RTL) { - offset *= -1; - } - blocks.sort(function(a, b) { - var aXY = a.getRelativeToSurfaceXY(); - var bXY = b.getRelativeToSurfaceXY(); - return (aXY.y + offset * aXY.x) - (bXY.y + offset * bXY.x); - }); - } - return blocks; -}; - -/** - * Add a comment to the list of top comments. - * @param {!Blockly.WorkspaceComment} comment comment to add. - * @package - */ -Blockly.Workspace.prototype.addTopComment = function(comment) { - this.topComments_.push(comment); - - // Note: If the comment database starts to hold block comments, this may need - // to move to a separate function. - if (this.commentDB_[comment.id]) { - console.warn('Overriding an existing comment on this workspace, with id "' + - comment.id + '"'); - } - this.commentDB_[comment.id] = comment; -}; - -/** - * Remove a comment from the list of top comments. - * @param {!Blockly.WorkspaceComment} comment comment to remove. - * @package - */ -Blockly.Workspace.prototype.removeTopComment = function(comment) { - if (!goog.array.remove(this.topComments_, comment)) { - throw 'Comment not present in workspace\'s list of top-most comments.'; - } - // Note: If the comment database starts to hold block comments, this may need - // to move to a separate function. - delete this.commentDB_[comment.id]; -}; - -/** - * Finds the top-level comments and returns them. Comments are optionally sorted - * by position; top to bottom (with slight LTR or RTL bias). - * @param {boolean} ordered Sort the list if true. - * @return {!Array.} The top-level comment objects. - * @package - */ -Blockly.Workspace.prototype.getTopComments = function(ordered) { - // Copy the topComments_ list. - var comments = [].concat(this.topComments_); - if (ordered && comments.length > 1) { - var offset = Math.sin(goog.math.toRadians(Blockly.Workspace.SCAN_ANGLE)); - if (this.RTL) { - offset *= -1; - } - comments.sort(function(a, b) { - var aXY = a instanceof Blockly.ScratchBlockComment ? a.getXY() : a.getRelativeToSurfaceXY(); - var bXY = b instanceof Blockly.ScratchBlockComment ? b.getXY() : b.getRelativeToSurfaceXY(); - return (aXY.y + offset * aXY.x) - (bXY.y + offset * bXY.x); - }); - } - return comments; -}; - -/** - * Find all blocks in workspace. Blocks are optionally sorted - * by position; top to bottom (with slight LTR or RTL bias). - * @param {boolean} ordered Sort the list if true. - * @return {!Array.} Array of blocks. - */ -Blockly.Workspace.prototype.getAllBlocks = function(ordered) { - if (ordered) { - // Slow, but ordered. - // This gets all levels of descendants because getDescendants - // is called recuusively. They are added to a new list, not the - // list that it's iterating over. - var topBlocks = this.getTopBlocks(true); - var blocks = []; - for (var i = 0; i < topBlocks.length; i++) { - blocks.push.apply(blocks, topBlocks[i].getDescendants(true)); - } - } else { - // Fast, but in no particular order. - // This gets all of levels of descendants by always adding to the - // list that it's iterating over. - var blocks = this.getTopBlocks(false); - for (var i = 0; i < blocks.length; i++) { - blocks.push.apply(blocks, blocks[i].getChildren(false)); - } - } - return blocks; -}; - -/** - * Dispose of all blocks and comments in workspace. - */ -Blockly.Workspace.prototype.clear = function() { - this.isClearing = true; - var existingGroup = Blockly.Events.getGroup(); - if (!existingGroup) { - Blockly.Events.setGroup(true); - } - while (this.topBlocks_.length) { - this.topBlocks_[0].dispose(); - } - while (this.topComments_.length) { - this.topComments_[this.topComments_.length - 1].dispose(); - } - if (!existingGroup) { - Blockly.Events.setGroup(false); - } - this.variableMap_.clear(); - // Any block with a drop-down or WidgetDiv was disposed. - if (Blockly.DropDownDiv) { - Blockly.DropDownDiv.hideWithoutAnimation(); - } - if (Blockly.WidgetDiv) { - Blockly.WidgetDiv.hide(true); - } - if (this.potentialVariableMap_) { - this.potentialVariableMap_.clear(); - } - this.isClearing = false; -}; - -/* Begin functions that are just pass-throughs to the variable map. */ -/** - * Rename a variable by updating its name in the variable map. Identify the - * variable to rename with the given ID. - * @param {string} id ID of the variable to rename. - * @param {string} newName New variable name. - */ -Blockly.Workspace.prototype.renameVariableById = function(id, newName) { - this.variableMap_.renameVariableById(id, newName); -}; - -/** - * Create a variable with a given name, optional type, and optional ID. - * @param {!string} name The name of the variable. This must be unique across - * each variable type. - * @param {?string} opt_type The type of the variable like 'int' or 'string'. - * Does not need to be unique. Field_variable can filter variables based on - * their type. This will default to '' which is a specific type. - * @param {string=} opt_id The unique ID of the variable. This will default to - * a UUID. - * @param {boolean=} opt_isLocal Whether the variable to create is locally scoped. - * @param {boolean=} opt_isCloud Whether the variable to create is locally scoped. - * @return {?Blockly.VariableModel} The newly created variable. - */ -Blockly.Workspace.prototype.createVariable = function(name, opt_type, opt_id, - opt_isLocal, opt_isCloud) { - return this.variableMap_.createVariable(name, opt_type, opt_id, opt_isLocal, opt_isCloud); -}; - -/** - * Find all the uses of the given variable, which is identified by ID. - * @param {string} id ID of the variable to find. - * @return {!Array.} Array of block usages. - */ -Blockly.Workspace.prototype.getVariableUsesById = function(id) { - return this.variableMap_.getVariableUsesById(id); -}; - -/** - * Delete a variables by the passed in ID and all of its uses from this - * workspace. May prompt the user for confirmation. - * @param {string} id ID of variable to delete. - */ -Blockly.Workspace.prototype.deleteVariableById = function(id) { - this.variableMap_.deleteVariableById(id); -}; - -/** - * Deletes a variable and all of its uses from this workspace without asking the - * user for confirmation. - * @param {!Blockly.VariableModel} variable Variable to delete. - * @param {!Array.} uses An array of uses of the variable. - * @private - */ -Blockly.Workspace.prototype.deleteVariableInternal_ = function(variable, uses) { - this.variableMap_.deleteVariableInternal_(variable, uses); -}; - -/** - * Check whether a variable exists with the given name. The check is - * case-insensitive. - * @param {string} _name The name to check for. - * @return {number} The index of the name in the variable list, or -1 if it is - * not present. - * @deprecated April 2017 - */ - -Blockly.Workspace.prototype.variableIndexOf = function(_name) { - console.warn( - 'Deprecated call to Blockly.Workspace.prototype.variableIndexOf'); - return -1; -}; - -/** - * Find the variable by the given name and return it. Return null if it is not - * found. - * TODO (#1199): Possibly delete this function. - * @param {!string} name The name to check for. - * @param {string=} opt_type The type of the variable. If not provided it - * defaults to the empty string, which is a specific type. - * @return {?Blockly.VariableModel} the variable with the given name. - */ -Blockly.Workspace.prototype.getVariable = function(name, opt_type) { - return this.variableMap_.getVariable(name, opt_type); -}; - -/** - * Find the variable by the given ID and return it. Return null if it is not - * found. - * @param {!string} id The ID to check for. - * @return {?Blockly.VariableModel} The variable with the given ID. - */ -Blockly.Workspace.prototype.getVariableById = function(id) { - return this.variableMap_.getVariableById(id); -}; - -/** - * Find the variable with the specified type. If type is null, return list of - * variables with empty string type. - * @param {?string} type Type of the variables to find. - * @return {Array.} The sought after variables of the - * passed in type. An empty array if none are found. - */ -Blockly.Workspace.prototype.getVariablesOfType = function(type) { - return this.variableMap_.getVariablesOfType(type); -}; - -/** - * Return all variable types. - * @return {!Array.} List of variable types. - * @package - */ -Blockly.Workspace.prototype.getVariableTypes = function() { - return this.variableMap_.getVariableTypes(); -}; - -/** - * Return all variables of all types. - * @return {!Array.} List of variable models. - */ -Blockly.Workspace.prototype.getAllVariables = function() { - return this.variableMap_.getAllVariables(); -}; - -/* End functions that are just pass-throughs to the variable map. */ - -/** - * Returns the horizontal offset of the workspace. - * Intended for LTR/RTL compatibility in XML. - * Not relevant for a headless workspace. - * @return {number} Width. - */ -Blockly.Workspace.prototype.getWidth = function() { - return 0; -}; - -/** - * Obtain a newly created block. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. - * @return {!Blockly.Block} The created block. - */ -Blockly.Workspace.prototype.newBlock = function(prototypeName, opt_id) { - return new Blockly.Block(this, prototypeName, opt_id); -}; - -/** - * Undo or redo the previous action. - * @param {boolean} redo False if undo, true if redo. - */ -Blockly.Workspace.prototype.undo = function(redo) { - var inputStack = redo ? this.redoStack_ : this.undoStack_; - var outputStack = redo ? this.undoStack_ : this.redoStack_; - var inputEvent = inputStack.pop(); - if (!inputEvent) { - return; - } - var events = [inputEvent]; - // Do another undo/redo if the next one is of the same group. - while (inputStack.length && inputEvent.group && - inputEvent.group == inputStack[inputStack.length - 1].group) { - events.push(inputStack.pop()); - } - // Push these popped events on the opposite stack. - for (var i = 0, event; event = events[i]; i++) { - outputStack.push(event); - } - events = Blockly.Events.filter(events, redo); - Blockly.Events.recordUndo = false; - if (Blockly.selected) { - Blockly.Events.disable(); - try { - Blockly.selected.unselect(); - } finally { - Blockly.Events.enable(); - } - } - try { - for (var i = 0, event; event = events[i]; i++) { - event.run(redo); - } - } finally { - Blockly.Events.recordUndo = true; - } -}; - -/** - * Clear the undo/redo stacks. - */ -Blockly.Workspace.prototype.clearUndo = function() { - this.undoStack_.length = 0; - this.redoStack_.length = 0; - // Stop any events already in the firing queue from being undoable. - Blockly.Events.clearPendingUndo(); -}; - -/** - * @return {boolean} whether there are any events in the redo stack. - * @package - */ -Blockly.Workspace.prototype.hasRedoStack = function() { - return this.redoStack_.length != 0; -}; - -/** - * @return {boolean} whether there are any events in the undo stack. - * @package - */ -Blockly.Workspace.prototype.hasUndoStack = function() { - return this.undoStack_.length != 0; -}; -/** - * When something in this workspace changes, call a function. - * @param {!Function} func Function to call. - * @return {!Function} Function that can be passed to - * removeChangeListener. - */ -Blockly.Workspace.prototype.addChangeListener = function(func) { - this.listeners_.push(func); - return func; -}; - -/** - * Stop listening for this workspace's changes. - * @param {Function} func Function to stop calling. - */ -Blockly.Workspace.prototype.removeChangeListener = function(func) { - goog.array.remove(this.listeners_, func); -}; - -/** - * Fire a change event. - * @param {!Blockly.Events.Abstract} event Event to fire. - */ -Blockly.Workspace.prototype.fireChangeListener = function(event) { - if (event.recordUndo) { - this.undoStack_.push(event); - this.redoStack_.length = 0; - if (this.undoStack_.length > this.MAX_UNDO) { - this.undoStack_.unshift(); - } - } - // Copy listeners in case a listener attaches/detaches itself. - var currentListeners = this.listeners_.slice(); - for (var i = 0, func; func = currentListeners[i]; i++) { - func(event); - } -}; - -/** - * Find the block on this workspace with the specified ID. - * @param {string} id ID of block to find. - * @return {Blockly.Block} The sought after block or null if not found. - */ -Blockly.Workspace.prototype.getBlockById = function(id) { - var block = this.blockDB_[id]; - if (!block && this.getFlyout() && this.getFlyout().getWorkspace()) { - block = this.getFlyout().getWorkspace().blockDB_[id]; - } - return block || null; -}; - -/** - * Find the comment on this workspace with the specified ID. - * @param {string} id ID of comment to find. - * @return {Blockly.WorkspaceComment} The sought after comment or null if not - * found. - * @package - */ -Blockly.Workspace.prototype.getCommentById = function(id) { - return this.commentDB_[id] || null; -}; - -/** - * Getter for the flyout associated with this workspace. This is null in a - * non-rendered workspace, but may be overriden by subclasses. - * @return {Blockly.Flyout} The flyout on this workspace. - */ -Blockly.Workspace.prototype.getFlyout = function() { - return null; -}; - -/** - * Checks whether all value and statement inputs in the workspace are filled - * with blocks. - * @param {boolean=} opt_shadowBlocksAreFilled An optional argument controlling - * whether shadow blocks are counted as filled. Defaults to true. - * @return {boolean} True if all inputs are filled, false otherwise. - */ -Blockly.Workspace.prototype.allInputsFilled = function(opt_shadowBlocksAreFilled) { - var blocks = this.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - if (!block.allInputsFilled(opt_shadowBlocksAreFilled)) { - return false; - } - } - return true; -}; - -/** - * Return the variable map that contains "potential" variables. These exist in - * the flyout but not in the workspace. - * @return {?Blockly.VariableMap} The potential variable map. - * @package - */ -Blockly.Workspace.prototype.getPotentialVariableMap = function() { - return this.potentialVariableMap_; -}; - -/** - * Create and store the potential variable map for this workspace. - * @package - */ -Blockly.Workspace.prototype.createPotentialVariableMap = function() { - this.potentialVariableMap_ = new Blockly.VariableMap(this); -}; - -/** - * Return the map of all variables on the workspace. - * @return {?Blockly.VariableMap} The variable map. - * @package - */ -Blockly.Workspace.prototype.getVariableMap = function() { - return this.variableMap_; -}; - -/** - * Database of all workspaces. - * @private - */ -Blockly.Workspace.WorkspaceDB_ = Object.create(null); - -/** - * Find the workspace with the specified ID. - * @param {string} id ID of workspace to find. - * @return {Blockly.Workspace} The sought after workspace or null if not found. - */ -Blockly.Workspace.getById = function(id) { - return Blockly.Workspace.WorkspaceDB_[id] || null; -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -Blockly.Workspace.prototype['clear'] = Blockly.Workspace.prototype.clear; -Blockly.Workspace.prototype['clearUndo'] = - Blockly.Workspace.prototype.clearUndo; -Blockly.Workspace.prototype['addChangeListener'] = - Blockly.Workspace.prototype.addChangeListener; -Blockly.Workspace.prototype['removeChangeListener'] = - Blockly.Workspace.prototype.removeChangeListener; diff --git a/packages/scratch-blocks/core/workspace_audio.js b/packages/scratch-blocks/core/workspace_audio.js deleted file mode 100644 index f81758a03..000000000 --- a/packages/scratch-blocks/core/workspace_audio.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object in charge of loading, storing, and playing audio for a - * workspace. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceAudio'); - -goog.require('goog.userAgent'); - - -/** - * Class for loading, storing, and playing audio for a workspace. - * @param {Blockly.WorkspaceSvg} parentWorkspace The parent of the workspace - * this audio object belongs to, or null. - * @constructor - */ -Blockly.WorkspaceAudio = function(parentWorkspace) { - - /** - * The parent of the workspace this object belongs to, or null. May be - * checked for sounds that this object can't find. - * @type {Blockly.WorkspaceSvg} - * @private - */ - this.parentWorkspace_ = parentWorkspace; - - /** - * Database of pre-loaded sounds. - * @private - * @const - */ - this.SOUNDS_ = Object.create(null); -}; - -/** - * Time that the last sound was played. - * @type {Date} - * @private - */ -Blockly.WorkspaceAudio.prototype.lastSound_ = null; - -/** - * Dispose of this audio manager. - * @package - */ -Blockly.WorkspaceAudio.prototype.dispose = function() { - this.parentWorkspace_ = null; - this.SOUNDS_ = null; -}; - -/** - * Load an audio file. Cache it, ready for instantaneous playing. - * @param {!Array.} filenames List of file types in decreasing order of - * preference (i.e. increasing size). E.g. ['media/go.mp3', 'media/go.wav'] - * Filenames include path from Blockly's root. File extensions matter. - * @param {string} name Name of sound. - * @package - */ -Blockly.WorkspaceAudio.prototype.load = function(filenames, name) { - if (!filenames.length) { - return; - } - try { - var audioTest = new window['Audio'](); - } catch (e) { - // No browser support for Audio. - // IE can throw an error even if the Audio object exists. - return; - } - var sound; - for (var i = 0; i < filenames.length; i++) { - var filename = filenames[i]; - var ext = filename.match(/\.(\w+)$/); - if (ext && audioTest.canPlayType('audio/' + ext[1])) { - // Found an audio format we can play. - sound = new window['Audio'](filename); - break; - } - } - if (sound && sound.play) { - this.SOUNDS_[name] = sound; - } -}; - -/** - * Preload all the audio files so that they play quickly when asked for. - * @package - */ -Blockly.WorkspaceAudio.prototype.preload = function() { - for (var name in this.SOUNDS_) { - var sound = this.SOUNDS_[name]; - sound.volume = 0.01; - var playPromise = sound.play(); - - // Edge does not return a promise, so we need to check. - if (playPromise) { - // If we don't wait for the play request to complete before calling pause() we will get an exception: - // Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause(). - // See more: https://developers.google.com/web/updates/2017/06/play-request-was-interrupted - playPromise.then(sound.pause).catch(function() { - // Play without user interaction was prevented. - }); - } else { - sound.pause(); - } - - // iOS can only process one sound at a time. Trying to load more than one - // corrupts the earlier ones. Just load one and leave the others uncached. - if (goog.userAgent.IPAD || goog.userAgent.IPHONE) { - break; - } - } -}; - -/** - * Play a named sound at specified volume. If volume is not specified, - * use full volume (1). - * @param {string} name Name of sound. - * @param {number=} opt_volume Volume of sound (0-1). - */ -Blockly.WorkspaceAudio.prototype.play = function(name, opt_volume) { - var sound = this.SOUNDS_[name]; - if (sound) { - // Don't play one sound on top of another. - var now = new Date; - if (this.lastSound_ != null && - now - this.lastSound_ < Blockly.SOUND_LIMIT) { - return; - } - this.lastSound_ = now; - var mySound; - var ie9 = goog.userAgent.DOCUMENT_MODE && - goog.userAgent.DOCUMENT_MODE === 9; - if (ie9 || goog.userAgent.IPAD || goog.userAgent.ANDROID) { - // Creating a new audio node causes lag in IE9, Android and iPad. Android - // and IE9 refetch the file from the server, iPad uses a singleton audio - // node which must be deleted and recreated for each new audio tag. - mySound = sound; - } else { - mySound = sound.cloneNode(); - } - mySound.volume = (opt_volume === undefined ? 1 : opt_volume); - mySound.play(); - } else if (this.parentWorkspace_) { - // Maybe a workspace on a lower level knows about this sound. - this.parentWorkspace_.getAudioManager().play(name, opt_volume); - } -}; diff --git a/packages/scratch-blocks/core/workspace_comment.js b/packages/scratch-blocks/core/workspace_comment.js deleted file mode 100644 index 02c6e3fec..000000000 --- a/packages/scratch-blocks/core/workspace_comment.js +++ /dev/null @@ -1,432 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a code comment on the workspace. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceComment'); - -goog.require('Blockly.Events.CommentChange'); -goog.require('Blockly.Events.CommentCreate'); -goog.require('Blockly.Events.CommentDelete'); -goog.require('Blockly.Events.CommentMove'); - -goog.require('goog.math.Coordinate'); - - -/** - * Class for a workspace comment. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @param {string} content The content of this workspace comment. - * @param {number} height Height of the comment. - * @param {number} width Width of the comment. - * @param {boolean} minimized Whether this comment is in the minimized state - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. If the ID conflicts with an in-use ID, a new one will - * be generated. - * @constructor - */ -Blockly.WorkspaceComment = function(workspace, content, height, width, minimized, opt_id) { - /** @type {string} */ - this.id = (opt_id && !workspace.getCommentById(opt_id)) ? - opt_id : Blockly.utils.genUid(); - - workspace.addTopComment(this); - - /** - * The comment's position in workspace units. (0, 0) is at the workspace's - * origin; scale does not change this value. - * @type {!goog.math.Coordinate} - * @protected - */ - this.xy_ = new goog.math.Coordinate(0, 0); - - /** - * The comment's height in workspace units. Scale does not change this value. - * @type {number} - * @private - */ - this.height_ = height; - - /** - * The comment's width in workspace units. Scale does not change this value. - * @type {number} - * @private - */ - this.width_ = width; - - /** - * The comment's minimized state. - * @type{boolean} - * @private - */ - this.isMinimized_ = minimized; - - /** - * @type {!Blockly.Workspace} - */ - this.workspace = workspace; - - /** - * @protected - * @type {boolean} - */ - this.RTL = workspace.RTL; - - /** - * @type {boolean} - * @private - */ - this.deletable_ = true; - - /** - * @type {boolean} - * @private - */ - this.movable_ = true; - - /** - * @protected - * @type {!string} - */ - this.content_ = content; - - /** - * @package - * @type {boolean} - */ - this.isComment = true; - - Blockly.WorkspaceComment.fireCreateEvent(this); -}; - -/** - * Maximum lable length (actual label length will include - * one additional character, the ellipsis). - * @private - */ -Blockly.WorkspaceComment.MAX_LABEL_LENGTH = 12; - -/** - * Maximum character length for comment text. - * @private - */ -Blockly.WorkspaceComment.COMMENT_TEXT_LIMIT = 8000; - -/** - * Dispose of this comment. - * @package - */ -Blockly.WorkspaceComment.prototype.dispose = function() { - if (!this.workspace) { - // The comment has already been deleted. - return; - } - - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.CommentDelete(this)); - } - - // Remove from the list of top comments and the comment database. - this.workspace.removeTopComment(this); - this.workspace = null; -}; - -// Height, width, x, and y are all stored on even non-rendered comments, to -// preserve state if you pass the contents through a headless workspace. - -/** - * Get comment height. - * @return {number} comment height. - * @package - */ -Blockly.WorkspaceComment.prototype.getHeight = function() { - return this.height_; -}; - -/** - * Set comment height. - * @param {number} height comment height. - * @package - */ -Blockly.WorkspaceComment.prototype.setHeight = function(height) { - this.height_ = height; -}; - -/** - * Get comment width. - * @return {number} comment width. - * @package - */ -Blockly.WorkspaceComment.prototype.getWidth = function() { - return this.width_; -}; - -/** - * Set comment width. - * @param {number} width comment width. - * @package - */ -Blockly.WorkspaceComment.prototype.setWidth = function(width) { - this.width_ = width; -}; - -/** - * Get the height and width of this comment. - * @return {{height: number, width: number}} The height and width of this comment; - * these numbers do not change as the workspace scales. - */ -Blockly.WorkspaceComment.prototype.getHeightWidth = function() { - return {height: this.height_, width: this.width_}; -}; - -/** - * Get stored location. - * @return {!goog.math.Coordinate} The comment's stored location. This is not - * valid if the comment is currently being dragged. - * @package - */ -Blockly.WorkspaceComment.prototype.getXY = function() { - return this.xy_.clone(); -}; - -/** - * Move a comment by a relative offset. - * @param {number} dx Horizontal offset, in workspace units. - * @param {number} dy Vertical offset, in workspace units. - * @package - */ -Blockly.WorkspaceComment.prototype.moveBy = function(dx, dy) { - var event = new Blockly.Events.CommentMove(this); - this.xy_.translate(dx, dy); - event.recordNew(); - Blockly.Events.fire(event); -}; - -/** - * Get whether this comment is deletable or not. - * @return {boolean} True if deletable. - * @package - */ -Blockly.WorkspaceComment.prototype.isDeletable = function() { - return this.deletable_ && - !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this comment is deletable or not. - * @param {boolean} deletable True if deletable. - * @package - */ -Blockly.WorkspaceComment.prototype.setDeletable = function(deletable) { - this.deletable_ = deletable; -}; - -/** - * Get whether this comment is movable or not. - * @return {boolean} True if movable. - * @package - */ -Blockly.WorkspaceComment.prototype.isMovable = function() { - return this.movable_ && - !(this.workspace && this.workspace.options.readOnly); -}; - -/** - * Set whether this comment is movable or not. - * @param {boolean} movable True if movable. - * @package - */ -Blockly.WorkspaceComment.prototype.setMovable = function(movable) { - this.movable_ = movable; -}; - -/** - * Returns this comment's text. - * @return {string} Comment text. - * @package - */ -Blockly.WorkspaceComment.prototype.getText = function() { - return this.content_; -}; - -/** - * Set this comment's text content. - * @param {string} text Comment text. - * @package - */ -Blockly.WorkspaceComment.prototype.setText = function(text) { - if (this.content_ != text) { - Blockly.Events.fire(new Blockly.Events.CommentChange( - this, {text: this.content_}, {text: text})); - this.content_ = text; - } -}; - -/** - * Check whether this comment is currently minimized. - * @return {boolean} True if minimized - * @package - */ -Blockly.WorkspaceComment.prototype.isMinimized = function() { - return this.isMinimized_; -}; - -/** - * Encode a comment subtree as XML with XY coordinates. - * @param {boolean=} opt_noId True if the encoder should skip the comment id. - * @return {!Element} Tree of XML elements. - * @package - */ -Blockly.WorkspaceComment.prototype.toXmlWithXY = function(opt_noId) { - var element = this.toXml(opt_noId); - element.setAttribute('x', Math.round(this.xy_.x)); - element.setAttribute('y', Math.round(this.xy_.y)); - element.setAttribute('h', this.height_); - element.setAttribute('w', this.width_); - return element; -}; - -/** - * Get the truncated text for this comment to display in the minimized - * top bar. - * @return {string} The truncated comment text - * @package - */ -Blockly.WorkspaceComment.prototype.getLabelText = function() { - if (this.content_.length > Blockly.WorkspaceComment.MAX_LABEL_LENGTH) { - if (this.RTL) { - return '\u2026' + this.content_.slice(0, Blockly.WorkspaceComment.MAX_LABEL_LENGTH); - } - return this.content_.slice(0, Blockly.WorkspaceComment.MAX_LABEL_LENGTH) + '\u2026'; - } else { - return this.content_; - } -}; - -/** - * Encode a comment subtree as XML, but don't serialize the XY coordinates or - * width and height. If you need that additional information use toXmlWithXY. - * @param {boolean=} opt_noId True if the encoder should skip the comment id. - * @return {!Element} Tree of XML elements. - * @package - */ -Blockly.WorkspaceComment.prototype.toXml = function(opt_noId) { - var commentElement = goog.dom.createDom('comment'); - if (!opt_noId) { - commentElement.setAttribute('id', this.id); - } - if (this.isMinimized_) { - commentElement.setAttribute('minimized', true); - } - commentElement.textContent = this.getText(); - return commentElement; -}; - -/** - * Fire a create event for the given workspace comment, if comments are enabled. - * @param {!Blockly.WorkspaceComment} comment The comment that was just created. - * @package - */ -Blockly.WorkspaceComment.fireCreateEvent = function(comment) { - if (Blockly.Events.isEnabled()) { - var existingGroup = Blockly.Events.getGroup(); - if (!existingGroup) { - Blockly.Events.setGroup(true); - } - try { - Blockly.Events.fire(new Blockly.Events.CommentCreate(comment)); - } finally { - if (!existingGroup) { - Blockly.Events.setGroup(false); - } - } - } -}; - -/** - * Decode an XML comment tag and create a comment on the workspace. - * @param {!Element} xmlComment XML comment element. - * @param {!Blockly.Workspace} workspace The workspace. - * @return {!Blockly.WorkspaceComment} The created workspace comment. - * @package - */ -Blockly.WorkspaceComment.fromXml = function(xmlComment, workspace) { - var info = Blockly.WorkspaceComment.parseAttributes(xmlComment); - - var comment = new Blockly.WorkspaceComment( - workspace, info.content, info.h, info.w, info.minimized, info.id); - - if (!isNaN(info.x) && !isNaN(info.y)) { - comment.moveBy(info.x, info.y); - } - - Blockly.WorkspaceComment.fireCreateEvent(comment); - return comment; -}; - -/** - * Decode an XML comment tag and return the results in an object. - * @param {!Element} xml XML comment element. - * @return {!Object} An object containing the information about the comment. - * @package - */ -Blockly.WorkspaceComment.parseAttributes = function(xml) { - var xmlH = xml.getAttribute('h'); - var xmlW = xml.getAttribute('w'); - - return { - /* @type {string} */ - id: xml.getAttribute('id'), - /** - * The height of the comment in workspace units, or 100 if not specified. - * @type {number} - */ - h: xmlH ? parseInt(xmlH, 10) : 100, - /** - * The width of the comment in workspace units, or 100 if not specified. - * @type {number} - */ - w: xmlW ? parseInt(xmlW, 10) : 100, - /** - * The x position of the comment in workspace coordinates, or NaN if not - * specified in the XML. - * @type {number} - */ - x: parseInt(xml.getAttribute('x'), 10), - /** - * The y position of the comment in workspace coordinates, or NaN if not - * specified in the XML. - * @type {number} - */ - y: parseInt(xml.getAttribute('y'), 10), - /** - * Whether this comment is minimized. Defaults to false if not specified in - * the XML. - * @type {boolean} - */ - minimized: xml.getAttribute('minimized') == 'true' || false, - /* @type {string} */ - content: xml.textContent - }; -}; diff --git a/packages/scratch-blocks/core/workspace_comment_render_svg.js b/packages/scratch-blocks/core/workspace_comment_render_svg.js deleted file mode 100644 index 94cf850ba..000000000 --- a/packages/scratch-blocks/core/workspace_comment_render_svg.js +++ /dev/null @@ -1,723 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for rendering a workspace comment as SVG - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceCommentSvg.render'); - -goog.require('Blockly.WorkspaceCommentSvg'); - -/** - * Radius of the border around the comment. - * @type {number} - * @const - * @private - */ -Blockly.WorkspaceCommentSvg.BORDER_WIDTH = 1; - -/** - * Size of the resize icon. - * @type {number} - * @const - * @private - */ -Blockly.WorkspaceCommentSvg.RESIZE_SIZE = 16; - -/** - * Offset from the foreignobject edge to the textarea edge. - * @type {number} - * @const - * @private - */ -Blockly.WorkspaceCommentSvg.TEXTAREA_OFFSET = 12; - -/** - * The height of the comment top bar. - * @package - */ -Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT = 32; - -/** - * The size of the minimize arrow icon in the comment top bar. - * @private - */ -Blockly.WorkspaceCommentSvg.MINIMIZE_ICON_SIZE = 32; - -/** - * The size of the delete icon in the comment top bar. - * @private - */ -Blockly.WorkspaceCommentSvg.DELETE_ICON_SIZE = 32; - -/** - * The inset for the top bar icons. - * @private - */ -Blockly.WorkspaceCommentSvg.TOP_BAR_ICON_INSET = 0; - -/** - * The bottom corner padding of the resize handle touch target. - * Extends slightly outside the comment box. - * @private - */ -Blockly.WorkspaceCommentSvg.RESIZE_CORNER_PAD = 4; - -/** - * The top/side padding around resize handle touch target. - * Extends about one extra "diagonal" above resize handle. - * @private - */ -Blockly.WorkspaceCommentSvg.RESIZE_OUTER_PAD = 8; - -/** - * Width that a minimized comment should have. - * @private - */ -Blockly.WorkspaceCommentSvg.MINIMIZE_WIDTH = 200; - -/** - * Returns a bounding box describing the dimensions of this comment. - * @return {!{height: number, width: number}} Object with height and width - * properties in workspace units. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.getHeightWidth = function() { - return { width: this.getWidth(), height: this.getHeight() }; -}; - -/** - * Renders the workspace comment. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.render = function() { - if (this.rendered_) { - return; - } - - var size = this.getHeightWidth(); - - // Add text area - this.commentEditor_ = this.createEditor_(); - this.svgGroup_.appendChild(this.commentEditor_); - - this.createCommentTopBar_(); - - this.svgRectTarget_ = Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyDraggable scratchCommentTarget', - 'x': 0, - 'y': Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT, - 'rx': 4 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH, - 'ry': 4 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH - }); - this.svgGroup_.appendChild(this.svgRectTarget_); - - // Add the resize icon - this.addResizeDom_(); - - // Show / hide relevant things based on minimized state - if (this.isMinimized()) { - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-up.svg'); - this.commentEditor_.setAttribute('display', 'none'); - this.resizeGroup_.setAttribute('display', 'none'); - } else { - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-down.svg'); - this.topBarLabel_.setAttribute('display', 'none'); - } - - this.setSize(size.width, size.height); - - // Set the content - this.textarea_.value = this.content_; - - this.rendered_ = true; - - if (this.resizeGroup_) { - Blockly.bindEventWithChecks_( - this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); - Blockly.bindEventWithChecks_( - this.resizeGroup_, 'mouseup', this, this.resizeMouseUp_); - } - - Blockly.bindEventWithChecks_( - this.minimizeArrow_, 'mousedown', this, this.minimizeArrowMouseDown_, true); - Blockly.bindEventWithChecks_( - this.minimizeArrow_, 'mouseout', this, this.minimizeArrowMouseOut_, true); - Blockly.bindEventWithChecks_( - this.minimizeArrow_, 'mouseup', this, this.minimizeArrowMouseUp_, true); - Blockly.bindEventWithChecks_( - this.deleteIcon_, 'mousedown', this, this.deleteMouseDown_, true); - Blockly.bindEventWithChecks_( - this.deleteIcon_, 'mouseout', this, this.deleteMouseOut_, true); - Blockly.bindEventWithChecks_( - this.deleteIcon_, 'mouseup', this, this.deleteMouseUp_, true); -}; - -/** - * Create the text area for the comment. - * @return {!Element} The top-level node of the editor. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.createEditor_ = function() { - this.foreignObject_ = Blockly.utils.createSvgElement( - 'foreignObject', - { - 'x': Blockly.WorkspaceCommentSvg.BORDER_WIDTH, - 'y': Blockly.WorkspaceCommentSvg.BORDER_WIDTH + Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT, - 'class': 'scratchCommentForeignObject' - }, - null); - var body = document.createElementNS(Blockly.HTML_NS, 'body'); - body.setAttribute('xmlns', Blockly.HTML_NS); - body.className = 'blocklyMinimalBody scratchCommentBody'; - var textarea = document.createElementNS(Blockly.HTML_NS, 'textarea'); - textarea.className = 'scratchCommentTextarea scratchCommentText'; - textarea.setAttribute('dir', this.RTL ? 'RTL' : 'LTR'); - textarea.setAttribute('maxlength', Blockly.WorkspaceComment.COMMENT_TEXT_LIMIT); - textarea.setAttribute('placeholder', Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT); - body.appendChild(textarea); - this.textarea_ = textarea; - this.textarea_.style.margin = (Blockly.WorkspaceCommentSvg.TEXTAREA_OFFSET) + 'px'; - this.foreignObject_.appendChild(body); - Blockly.bindEventWithChecks_(textarea, 'mousedown', this, function(e) { - e.stopPropagation(); // Propagation causes preventDefault from workspace handler - }, true, true); - // Don't zoom with mousewheel. - Blockly.bindEventWithChecks_(textarea, 'wheel', this, function(e) { - e.stopPropagation(); - }); - Blockly.bindEventWithChecks_(textarea, 'change', this, function(_e) { - if (this.text_ != textarea.value) { - this.setText(textarea.value); - } - }); - - this.labelText_ = this.getLabelText(); - - return this.foreignObject_; -}; - -/** - * Add the resize icon to the DOM - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.addResizeDom_ = function() { - this.resizeGroup_ = Blockly.utils.createSvgElement( - 'g', - { - 'class': this.RTL ? 'scratchCommentResizeSW' : 'scratchCommentResizeSE' - }, - this.svgGroup_); - var resizeSize = Blockly.WorkspaceCommentSvg.RESIZE_SIZE; - var outerPad = Blockly.ScratchBubble.RESIZE_OUTER_PAD; - var cornerPad = Blockly.ScratchBubble.RESIZE_CORNER_PAD; - // Build an (invisible) triangle that will catch resizes. It is padded on the - // top/left by outerPad, and padded down/right by cornerPad. - Blockly.utils.createSvgElement('polygon', - { - 'points': [ - -outerPad, resizeSize + cornerPad, - resizeSize + cornerPad, resizeSize + cornerPad, - resizeSize + cornerPad, -outerPad - ].join(' ') - }, - this.resizeGroup_); - Blockly.utils.createSvgElement( - 'line', - { - 'class': 'blocklyResizeLine', - 'x1': resizeSize / 3, 'y1': resizeSize - 1, - 'x2': resizeSize - 1, 'y2': resizeSize / 3 - }, this.resizeGroup_); - Blockly.utils.createSvgElement( - 'line', - { - 'class': 'blocklyResizeLine', - 'x1': resizeSize * 2 / 3, 'y1': resizeSize - 1, - 'x2': resizeSize - 1, 'y2': resizeSize * 2 / 3 - }, this.resizeGroup_); -}; - -/** - * Create the comment top bar and its contents. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.createCommentTopBar_ = function() { - this.svgHandleTarget_ = Blockly.utils.createSvgElement('rect', - { - 'class': 'blocklyDraggable scratchCommentTopBar', - 'rx': Blockly.WorkspaceCommentSvg.BORDER_WIDTH, - 'ry': Blockly.WorkspaceCommentSvg.BORDER_WIDTH, - 'height': Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT - }, this.svgGroup_); - - this.createTopBarIcons_(); - this.createTopBarLabel_(); -}; - -/** - * Create the comment top bar label. This is the truncated comment text - * that shows when comment is minimized. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.createTopBarLabel_ = function() { - this.topBarLabel_ = Blockly.utils.createSvgElement('text', - { - 'class': 'scratchCommentText', - 'x': this.width_ / 2, - 'y': (Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT / 2) + Blockly.WorkspaceCommentSvg.BORDER_WIDTH, - 'text-anchor': 'middle', - 'dominant-baseline': 'middle' - }, this.svgGroup_); - - var labelTextNode = document.createTextNode(this.labelText_); - this.topBarLabel_.appendChild(labelTextNode); -}; - -/** - * Create the minimize toggle and delete icons that in the comment top bar. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.createTopBarIcons_ = function() { - var topBarMiddleY = (Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT / 2) + - Blockly.WorkspaceCommentSvg.BORDER_WIDTH; - - // Minimize Toggle Icon in Comment Top Bar - var xInset = Blockly.WorkspaceCommentSvg.TOP_BAR_ICON_INSET; - this.minimizeArrow_ = Blockly.utils.createSvgElement('image', - { - 'x': xInset, - 'y': topBarMiddleY - Blockly.WorkspaceCommentSvg.MINIMIZE_ICON_SIZE / 2, - 'width': Blockly.WorkspaceCommentSvg.MINIMIZE_ICON_SIZE, - 'height': Blockly.WorkspaceCommentSvg.MINIMIZE_ICON_SIZE - }, this.svgGroup_); - - // Delete Icon in Comment Top Bar - this.deleteIcon_ = Blockly.utils.createSvgElement('image', - { - 'x': xInset, - 'y': topBarMiddleY - Blockly.WorkspaceCommentSvg.DELETE_ICON_SIZE / 2, - 'width': Blockly.WorkspaceCommentSvg.DELETE_ICON_SIZE, - 'height': Blockly.WorkspaceCommentSvg.DELETE_ICON_SIZE - }, this.svgGroup_); - this.deleteIcon_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'delete-x.svg'); -}; - -/** - * Handle a mouse-down on bubble's minimize icon. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.minimizeArrowMouseDown_ = function(e) { - // Set a property to indicate that this minimize arrow icon had a mouse down - // event. This property will get reset if the mouse leaves the icon, or when - // a mouse up event occurs on this icon. - this.shouldToggleMinimize_ = true; - e.stopPropagation(); -}; - -/** - * Handle a mouse-out on bubble's minimize icon. - * @param {!Event} _e Mouse out event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.minimizeArrowMouseOut_ = function(_e) { - // If the mouse leaves the minimize arrow icon, make sure the - // shouldToggleMinimize_ property gets reset. - this.shouldToggleMinimize_ = false; -}; - -/** - * Handle a mouse-up on bubble's minimize icon. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.minimizeArrowMouseUp_ = function(e) { - // First check if this is the icon that had a mouse down event on it and that - // the mouse never left the icon. - if (this.shouldToggleMinimize_) { - this.shouldToggleMinimize = false; - this.toggleMinimize_(); - } - e.stopPropagation(); -}; - -/** - * Handle a mouse-down on bubble's minimize icon. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.deleteMouseDown_ = function(e) { - // Set a property to indicate that this delete icon had a mouse down event. - // This property will get reset if the mouse leaves the icon, or when - // a mouse up event occurs on this icon. - this.shouldDelete_ = true; - e.stopPropagation(); -}; - -/** - * Handle a mouse-out on bubble's minimize icon. - * @param {!Event} _e Mouse out event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.deleteMouseOut_ = function(_e) { - // If the mouse leaves the delete icon, reset the shouldDelete_ property. - this.shouldDelete_ = false; -}; - -/** - * Handle a mouse-up on bubble's delete icon. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.deleteMouseUp_ = function(e) { - // First check that this same icon had a mouse down event on it and that the - // mouse never left the icon. - if (this.shouldDelete_) { - this.dispose(); - } - e.stopPropagation(); -}; - -/** - * Handle a mouse-down on comment's resize corner. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.resizeMouseDown_ = function(e) { - this.resizeStartSize_ = {width: this.width_, height: this.height_}; - this.unbindDragEvents_(); - this.workspace.setResizesEnabled(false); - if (Blockly.utils.isRightButton(e)) { - // No right-click. - e.stopPropagation(); - return; - } - // Left-click (or middle click) - this.workspace.startDrag(e, new goog.math.Coordinate( - this.workspace.RTL ? -this.width_ : this.width_, this.height_)); - - this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( - document, 'mouseup', this, this.resizeMouseUp_); - this.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_( - document, 'mousemove', this, this.resizeMouseMove_); - Blockly.hideChaff(); - // This event has been handled. No need to bubble up to the document. - e.stopPropagation(); -}; - - -/** - * Set the apperance of the workspace comment bubble to the minimized or full size - * appearance. In the minimized state, the comment should only have the top bar - * displayed, with the minimize icon swapped to the minimized state, and - * truncated comment text is shown in the middle of the top bar. There should be - * no resize handle when the workspace comment is in its minimized state. - * @param {boolean} minimize Whether the bubble should be minimized - * @param {?string} labelText Optional label text for the comment top bar - * when it is minimized. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.setRenderedMinimizeState_ = function(minimize, labelText) { - if (minimize) { - // Change minimize icon - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-up.svg'); - // Hide text area - this.commentEditor_.setAttribute('display', 'none'); - // Hide resize handle if it exists - if (this.resizeGroup_) { - this.resizeGroup_.setAttribute('display', 'none'); - } - if (labelText && this.labelText_ != labelText) { - // Update label and display - // TODO is there a better way to do this? - this.topBarLabel_.textContent = labelText; - } - Blockly.utils.removeAttribute(this.topBarLabel_, 'display'); - } else { - // Change minimize icon - this.minimizeArrow_.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', Blockly.mainWorkspace.options.pathToMedia + 'comment-arrow-down.svg'); - // Hide label - this.topBarLabel_.setAttribute('display', 'none'); - // Show text area - Blockly.utils.removeAttribute(this.commentEditor_, 'display'); - // Display resize handle if it exists - if (this.resizeGroup_) { - Blockly.utils.removeAttribute(this.resizeGroup_, 'display'); - } - } -}; - -/** - * Stop binding to the global mouseup and mousemove events. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.unbindDragEvents_ = function() { - if (this.onMouseUpWrapper_) { - Blockly.unbindEvent_(this.onMouseUpWrapper_); - this.onMouseUpWrapper_ = null; - } - if (this.onMouseMoveWrapper_) { - Blockly.unbindEvent_(this.onMouseMoveWrapper_); - this.onMouseMoveWrapper_ = null; - } -}; - -/* - * Handle a mouse-up event while dragging a comment's border or resize handle. - * @param {!Event} e Mouse up event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.resizeMouseUp_ = function(/*e*/) { - Blockly.Touch.clearTouchIdentifier(); - this.unbindDragEvents_(); - var oldHW = this.resizeStartSize_; - this.resizeStartSize_ = null; - if (this.width_ == oldHW.width && this.height_ == oldHW.height) { - return; - } - // Fire a change event for the new width/height after - // resize mouse up - Blockly.Events.fire(new Blockly.Events.CommentChange( - this, {width: oldHW.width , height: oldHW.height}, - {width: this.width_, height: this.height_})); - - this.workspace.setResizesEnabled(true); -}; - -/** - * Resize this comment to follow the mouse. - * @param {!Event} e Mouse move event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.resizeMouseMove_ = function(e) { - this.autoLayout_ = false; - var newXY = this.workspace.moveDrag(e); - // The call to setSize below emits a CommentChange event, - // but we don't want multiple CommentChange events to be - // emitted while the user is still in the process of resizing - // the comment, so disable events here. The event is emitted in - // resizeMouseUp_. - var disabled = false; - if (Blockly.Events.isEnabled()) { - Blockly.Events.disable(); - disabled = true; - } - this.setSize(this.RTL ? -newXY.x : newXY.x, newXY.y); - if (disabled) { - Blockly.Events.enable(); - } -}; - -/** - * Callback function triggered when the comment has resized. - * Resize the text area accordingly. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.resizeComment_ = function() { - var doubleBorderWidth = 2 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH; - var topOffset = Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT; - var textOffset = Blockly.WorkspaceCommentSvg.TEXTAREA_OFFSET * 2; - - this.foreignObject_.setAttribute('width', - this.width_ - doubleBorderWidth); - this.foreignObject_.setAttribute('height', - this.height_ - doubleBorderWidth - topOffset); - if (this.RTL) { - this.foreignObject_.setAttribute('x', - -this.width_); - } - this.textarea_.style.width = - (this.width_ - textOffset) + 'px'; - this.textarea_.style.height = - (this.height_ - doubleBorderWidth - textOffset - topOffset) + 'px'; -}; - -/** - * Set size - * @param {number} width width of the container - * @param {number} height height of the container - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.setSize = function(width, height) { - var oldWidth = this.width_; - var oldHeight = this.height_; - - var doubleBorderWidth = 2 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH; - - if (this.isMinimized_) { - width = Blockly.WorkspaceCommentSvg.MINIMIZE_WIDTH; - height = Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT; - } else { - // Minimum size of a 'full size' (not minimized) comment. - width = Math.max(width, doubleBorderWidth + 50); - height = Math.max(height, doubleBorderWidth + 20 + Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT); - - // Note we are only updating this.width_ or this.height_ here - // and not in the case above, because when we're minimizing a comment, - // we want to keep track of the width/height of the maximized comment - this.width_ = width; - this.height_ = height; - Blockly.Events.fire(new Blockly.Events.CommentChange(this, - {width: oldWidth, height: oldHeight}, - {width: this.width_, height: this.height_})); - } - this.svgRect_.setAttribute('width', width); - this.svgRect_.setAttribute('height', height); - this.svgRectTarget_.setAttribute('width', width); - this.svgRectTarget_.setAttribute('height', height - Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT); - this.svgHandleTarget_.setAttribute('width', width); - this.svgHandleTarget_.setAttribute('height', Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT); - if (this.RTL) { - this.minimizeArrow_.setAttribute('x', width - - (Blockly.WorkspaceCommentSvg.MINIMIZE_ICON_SIZE) - - Blockly.WorkspaceCommentSvg.TOP_BAR_ICON_INSET); - this.deleteIcon_.setAttribute('x', (-width + - Blockly.WorkspaceCommentSvg.TOP_BAR_ICON_INSET)); - this.svgRect_.setAttribute('transform', 'scale(-1 1)'); - this.svgHandleTarget_.setAttribute('transform', 'scale(-1 1)'); - this.svgHandleTarget_.setAttribute('transform', 'translate(' + -width + ', 1)'); - this.minimizeArrow_.setAttribute('transform', 'translate(' + -width + ', 1)'); - this.deleteIcon_.setAttribute('tranform', 'translate(' + -width + ', 1)'); - this.svgRectTarget_.setAttribute('transform', 'translate(' + -width + ', 1)'); - this.topBarLabel_.setAttribute('transform', 'translate(' + -width + ', 1)'); - } else { - this.deleteIcon_.setAttribute('x', width - - Blockly.WorkspaceCommentSvg.DELETE_ICON_SIZE - - Blockly.WorkspaceCommentSvg.TOP_BAR_ICON_INSET); - } - - var resizeSize = Blockly.WorkspaceCommentSvg.RESIZE_SIZE; - if (this.resizeGroup_) { - if (this.RTL) { - // Mirror the resize group. - this.resizeGroup_.setAttribute('transform', 'translate(' + - (-width + doubleBorderWidth + resizeSize) + ',' + - (height - doubleBorderWidth - resizeSize) + ') scale(-1 1)'); - } else { - this.resizeGroup_.setAttribute('transform', 'translate(' + - (width - doubleBorderWidth - resizeSize) + ',' + - (height - doubleBorderWidth - resizeSize) + ')'); - } - } - - if (this.isMinimized_) { - this.topBarLabel_.setAttribute('x', width / 2); - this.topBarLabel_.setAttribute('y', height / 2); - } - - // Allow the contents to resize. - this.resizeComment_(); -}; - -/** - * Toggle the minimization state of this comment. - * @private - */ -Blockly.WorkspaceComment.prototype.toggleMinimize_ = function() { - this.setMinimized(!this.isMinimized_); -}; - -/** - * Set the minimized state for this comment. If the comment is rendered, - * change the appearance of the comment accordingly. - * @param {boolean} minimize Whether the comment should be minimized - * @package - */ -Blockly.WorkspaceComment.prototype.setMinimized = function(minimize) { - if (this.isMinimized_ == minimize) { - return; - } - Blockly.Events.fire(new Blockly.Events.CommentChange(this, - {minimized: this.isMinimized_}, {minimized: minimize})); - this.isMinimized_ = minimize; - if (minimize) { - if (this.rendered_) { - this.setRenderedMinimizeState_(true, this.getLabelText()); - } - this.setSize(Blockly.WorkspaceCommentSvg.MINIMIZE_WIDTH, - Blockly.WorkspaceCommentSvg.TOP_BAR_HEIGHT); - } else { - if (this.rendered_) { - this.setRenderedMinimizeState_(false); - } - this.setText(this.content_); - this.setSize(this.width_, this.height_); - } -}; - -/** - * Dispose of any rendered comment components. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.disposeInternal_ = function() { - this.textarea_ = null; - this.foreignObject_ = null; - this.svgRect_ = null; - this.svgRectTarget_ = null; - this.svgHandleTarget_ = null; -}; - -/** - * Set the focus on the text area. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.setFocus = function() { - var comment = this; - this.focused_ = true; - comment.textarea_.focus(); - // Defer CSS changes. - setTimeout(function() { - comment.addFocus(); - Blockly.utils.addClass( - comment.svgRectTarget_, 'scratchCommentTargetFocused'); - Blockly.utils.addClass( - comment.svgHandleTarget_, 'scratchCommentHandleTargetFocused'); - }, 0); -}; - -/** - * Remove focus from the text area. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.blurFocus = function() { - var comment = this; - this.focused_ = false; - comment.textarea_.blur(); - // Defer CSS changes. - setTimeout(function() { - if (comment.svgGroup_) { // Could have been deleted in the meantime - comment.removeFocus(); - Blockly.utils.removeClass( - comment.svgRectTarget_, 'scratchCommentTargetFocused'); - Blockly.utils.removeClass( - comment.svgHandleTarget_, 'scratchCommentHandleTargetFocused'); - } - }, 0); -}; diff --git a/packages/scratch-blocks/core/workspace_comment_svg.js b/packages/scratch-blocks/core/workspace_comment_svg.js deleted file mode 100644 index 2c7aa2bdc..000000000 --- a/packages/scratch-blocks/core/workspace_comment_svg.js +++ /dev/null @@ -1,611 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a code comment on a rendered workspace. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceCommentSvg'); - -goog.require('Blockly.Events.CommentCreate'); -goog.require('Blockly.Events.CommentDelete'); -goog.require('Blockly.Events.CommentMove'); -goog.require('Blockly.WorkspaceComment'); - - -/** - * Class for a workspace comment's SVG representation. - * @param {!Blockly.Workspace} workspace The block's workspace. - * @param {string} content The content of this workspace comment. - * @param {number} height Height of the comment. - * @param {number} width Width of the comment. - * @param {boolean} minimized Whether this comment is minimized. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. - * @extends {Blockly.WorkspaceComment} - * @constructor - */ -Blockly.WorkspaceCommentSvg = function(workspace, content, height, width, minimized, - opt_id) { - // Create core elements for the block. - /** - * @type {SVGElement} - * @private - */ - this.svgGroup_ = Blockly.utils.createSvgElement( - 'g', {}, null); - this.svgGroup_.translate_ = ''; - - this.svgRect_ = Blockly.utils.createSvgElement( - 'rect', - { - 'class': 'scratchCommentRect scratchWorkspaceCommentBorder', - 'x': 0, - 'y': 0, - 'rx': 4 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH, - 'ry': 4 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH - }); - this.svgGroup_.appendChild(this.svgRect_); - - - /** - * Whether the comment is rendered onscreen and is a part of the DOM. - * @type {boolean} - * @private - */ - this.rendered_ = false; - - /** - * Whether to move the comment to the drag surface when it is dragged. - * True if it should move, false if it should be translated directly. - * @type {boolean} - * @private - */ - this.useDragSurface_ = - Blockly.utils.is3dSupported() && !!workspace.blockDragSurface_; - - Blockly.WorkspaceCommentSvg.superClass_.constructor.call(this, - workspace, content, height, width, minimized, opt_id); - - this.render(); -}; goog.inherits(Blockly.WorkspaceCommentSvg, Blockly.WorkspaceComment); - -/** - * The width and height to use to size a workspace comment when it is first - * added, before it has been edited by the user. - * @type {number} - * @package - */ -Blockly.WorkspaceCommentSvg.DEFAULT_SIZE = 200; - -/** - * Dispose of this comment. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.dispose = function() { - if (!this.workspace) { - // The comment has already been deleted. - return; - } - // If this comment is being deleted, unlink the mouse events. - if (Blockly.selected == this) { - this.unselect(); - this.workspace.cancelCurrentGesture(); - } - - if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.CommentDelete(this)); - } - - goog.dom.removeNode(this.svgGroup_); - // Sever JavaScript to DOM connections. - this.svgGroup_ = null; - this.svgRect_ = null; - // Dispose of any rendered components - this.disposeInternal_(); - - Blockly.Events.disable(); - Blockly.WorkspaceCommentSvg.superClass_.dispose.call(this); - Blockly.Events.enable(); -}; - -/** - * Create and initialize the SVG representation of a workspace comment. - * May be called more than once. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.initSvg = function() { - goog.asserts.assert(this.workspace.rendered, 'Workspace is headless.'); - if (!this.workspace.options.readOnly && !this.eventsInit_) { - Blockly.bindEventWithChecks_( - this.svgRectTarget_, 'mousedown', this, this.pathMouseDown_); - Blockly.bindEventWithChecks_( - this.svgHandleTarget_, 'mousedown', this, this.pathMouseDown_); - } - this.eventsInit_ = true; - - this.updateMovable(); - if (!this.getSvgRoot().parentNode) { - this.workspace.getBubbleCanvas().appendChild(this.getSvgRoot()); - } -}; - -/** - * Handle a mouse-down on an SVG comment. - * @param {!Event} e Mouse down event or touch start event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.pathMouseDown_ = function(e) { - var gesture = this.workspace.getGesture(e); - if (gesture) { - gesture.handleBubbleStart(e, this); - } -}; - -/** - * Show the context menu for this workspace comment. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.showContextMenu_ = function(e) { - if (this.workspace.options.readOnly) { - return; - } - // Save the current workspace comment in a variable for use in closures. - var comment = this; - var menuOptions = []; - - if (this.isDeletable() && this.isMovable()) { - menuOptions.push(Blockly.ContextMenu.commentDuplicateOption(comment)); - menuOptions.push(Blockly.ContextMenu.commentDeleteOption(comment)); - } - - Blockly.ContextMenu.show(e, menuOptions, this.RTL); -}; - -/** - * Select this comment. Highlight it visually. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.select = function() { - if (Blockly.selected == this) { - return; - } - var oldId = null; - if (Blockly.selected) { - oldId = Blockly.selected.id; - // Unselect any previously selected block or comment. - Blockly.Events.disable(); - try { - Blockly.selected.unselect(); - } finally { - Blockly.Events.enable(); - } - } - var event = new Blockly.Events.Ui(null, 'selected', oldId, this.id); - event.workspaceId = this.workspace.id; - Blockly.Events.fire(event); - Blockly.selected = this; - this.addSelect(); -}; - -/** - * Unselect this comment. Remove its highlighting. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.unselect = function() { - if (Blockly.selected != this) { - return; - } - var event = new Blockly.Events.Ui(null, 'selected', this.id, null); - event.workspaceId = this.workspace.id; - Blockly.Events.fire(event); - Blockly.selected = null; - this.removeSelect(); -}; - -/** - * Select this comment. Highlight it visually. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.addSelect = function() { - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklySelected'); - this.setFocus(); -}; - -/** - * Unselect this comment. Remove its highlighting. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.removeSelect = function() { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklySelected'); - this.blurFocus(); -}; - -/** - * Focus this comment. Highlight it visually. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.addFocus = function() { - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyFocused'); -}; - -/** - * Unfocus this comment. Remove its highlighting. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.removeFocus = function() { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyFocused'); -}; - -/** - * Return the coordinates of the top-left corner of this comment relative to the - * drawing surface's origin (0,0), in workspace units. - * If the comment is on the workspace, (0, 0) is the origin of the workspace - * coordinate system. - * This does not change with workspace scale. - * @return {!goog.math.Coordinate} Object with .x and .y properties in - * workspace coordinates. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.getRelativeToSurfaceXY = function() { - var x = 0; - var y = 0; - - var dragSurfaceGroup = this.useDragSurface_ ? - this.workspace.blockDragSurface_.getGroup() : null; - - var element = this.getSvgRoot(); - if (element) { - do { - // Loop through this comment and every parent. - var xy = Blockly.utils.getRelativeXY(element); - x += xy.x; - y += xy.y; - // If this element is the current element on the drag surface, include - // the translation of the drag surface itself. - if (this.useDragSurface_ && - this.workspace.blockDragSurface_.getCurrentBlock() == element) { - var surfaceTranslation = - this.workspace.blockDragSurface_.getSurfaceTranslation(); - x += surfaceTranslation.x; - y += surfaceTranslation.y; - } - element = element.parentNode; - } while (element && element != this.workspace.getBubbleCanvas() && - element != dragSurfaceGroup); - } - this.xy_ = new goog.math.Coordinate(x, y); - return this.xy_; -}; - -/** - * Move a comment by a relative offset. - * @param {number} dx Horizontal offset, in workspace units. - * @param {number} dy Vertical offset, in workspace units. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.moveBy = function(dx, dy) { - var event = new Blockly.Events.CommentMove(this); - // TODO: Do I need to look up the relative to surface XY position here? - var xy = this.getRelativeToSurfaceXY(); - this.translate(xy.x + dx, xy.y + dy); - event.recordNew(); - Blockly.Events.fire(event); - this.workspace.resizeContents(); -}; - -/** - * Transforms a comment by setting the translation on the transform attribute - * of the block's SVG. - * @param {number} x The x coordinate of the translation in workspace units. - * @param {number} y The y coordinate of the translation in workspace units. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.translate = function(x, y) { - this.xy_ = new goog.math.Coordinate(x, y); - this.getSvgRoot().setAttribute('transform', - 'translate(' + x + ',' + y + ')'); -}; - -/** - * Move this comment to its workspace's drag surface, accounting for positioning. - * Generally should be called at the same time as setDragging(true). - * Does nothing if useDragSurface_ is false. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.moveToDragSurface_ = function() { - if (!this.useDragSurface_) { - return; - } - // The translation for drag surface blocks, - // is equal to the current relative-to-surface position, - // to keep the position in sync as it move on/off the surface. - // This is in workspace coordinates. - var xy = this.getRelativeToSurfaceXY(); - this.clearTransformAttributes_(); - this.workspace.blockDragSurface_.translateSurface(xy.x, xy.y); - // Execute the move on the top-level SVG component - this.workspace.blockDragSurface_.setBlocksAndShow(this.getSvgRoot()); -}; - -/** - * Move this comment back to the workspace block canvas. - * Generally should be called at the same time as setDragging(false). - * Does nothing if useDragSurface_ is false. - * @param {!goog.math.Coordinate} newXY The position the comment should take on - * on the workspace canvas, in workspace coordinates. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.moveOffDragSurface_ = function(newXY) { - if (!this.useDragSurface_) { - return; - } - // Translate to current position, turning off 3d. - this.translate(newXY.x, newXY.y); - this.workspace.blockDragSurface_.clearAndHide(this.workspace.getCanvas()); -}; - -/** - * Move this comment during a drag, taking into account whether we are using a - * drag surface to translate blocks. - * @param {?Blockly.BlockDragSurfaceSvg} dragSurface The surface that carries - * rendered items during a drag, or null if no drag surface is in use. - * @param {!goog.math.Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.moveDuringDrag = function(dragSurface, newLoc) { - if (dragSurface) { - dragSurface.translateSurface(newLoc.x, newLoc.y); - } else { - this.svgGroup_.translate_ = 'translate(' + newLoc.x + ',' + newLoc.y + ')'; - this.svgGroup_.setAttribute('transform', - this.svgGroup_.translate_ + this.svgGroup_.skew_); - } -}; - -/** - * Move the bubble group to the specified location in workspace coordinates. - * @param {number} x The x position to move to. - * @param {number} y The y position to move to. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.moveTo = function(x, y) { - this.translate(x, y); -}; - -/** - * Clear the comment of transform="..." attributes. - * Used when the comment is switching from 3d to 2d transform or vice versa. - * @private - */ -Blockly.WorkspaceCommentSvg.prototype.clearTransformAttributes_ = function() { - Blockly.utils.removeAttribute(this.getSvgRoot(), 'transform'); -}; - -/** - * Return the rendered size of the comment or the stored size if the comment is - * not rendered. This differs from getHeightWidth in the behavior of rendered - * minimized comments. This function reports the actual size of the minimized - * comment instead of the full sized comment height/width. - * @return {!{height: number, width: number}} Object with height and width - * properties in workspace units. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.getBubbleSize = function() { - if (this.rendered_) { - return { - width: parseInt(this.svgRect_.getAttribute('width')), - height: parseInt(this.svgRect_.getAttribute('height')) - }; - } else { - this.getHeightWidth(); - } -}; - -/** - * Returns the coordinates of a bounding box describing the dimensions of this - * comment. - * Coordinate system: workspace coordinates. - * @return {!{topLeft: goog.math.Coordinate, bottomRight: goog.math.Coordinate}} - * Object with top left and bottom right coordinates of the bounding box. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.getBoundingRectangle = function() { - var blockXY = this.getRelativeToSurfaceXY(); - var commentBounds = this.getHeightWidth(); - var topLeft; - var bottomRight; - if (this.RTL) { - topLeft = new goog.math.Coordinate(blockXY.x - (commentBounds.width), - blockXY.y); - // Add the width of the tab/puzzle piece knob to the x coordinate - // since X is the corner of the rectangle, not the whole puzzle piece. - bottomRight = new goog.math.Coordinate(blockXY.x, - blockXY.y + commentBounds.height); - } else { - // Subtract the width of the tab/puzzle piece knob to the x coordinate - // since X is the corner of the rectangle, not the whole puzzle piece. - topLeft = new goog.math.Coordinate(blockXY.x, blockXY.y); - bottomRight = new goog.math.Coordinate(blockXY.x + commentBounds.width, - blockXY.y + commentBounds.height); - } - return {topLeft: topLeft, bottomRight: bottomRight}; -}; - -/** - * Add or remove the UI indicating if this comment is movable or not. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.updateMovable = function() { - if (this.isMovable()) { - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggable'); - } else { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggable'); - } -}; - -/** - * Set whether this comment is movable or not. - * @param {boolean} movable True if movable. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.setMovable = function(movable) { - Blockly.WorkspaceCommentSvg.superClass_.setMovable.call(this, movable); - this.updateMovable(); -}; - -/** - * Recursively adds or removes the dragging class to this node and its children. - * @param {boolean} adding True if adding, false if removing. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.setDragging = function(adding) { - if (adding) { - var group = this.getSvgRoot(); - group.translate_ = ''; - group.skew_ = ''; - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging'); - } else { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging'); - } -}; - -/** - * Return the root node of the SVG or null if none exists. - * @return {Element} The root SVG node (probably a group). - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.getSvgRoot = function() { - return this.svgGroup_; -}; - -/** - * Returns this comment's text. - * @return {string} Comment text. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.getText = function() { - return this.textarea_ ? this.textarea_.value : this.content_; -}; - -/** - * Set this comment's text. - * @param {string} text Comment text. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.setText = function(text) { - Blockly.WorkspaceCommentSvg.superClass_.setText.call(this, text); - if (this.textarea_) { - this.textarea_.value = text; - } -}; - -/** - * Update the cursor over this comment by adding or removing a class. - * @param {boolean} enable True if the delete cursor should be shown, false - * otherwise. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.setDeleteStyle = function(enable) { - if (enable) { - Blockly.utils.addClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggingDelete'); - } else { - Blockly.utils.removeClass( - /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggingDelete'); - } -}; - -Blockly.WorkspaceCommentSvg.prototype.setAutoLayout = function() { - // NOP for compatibility with the bubble dragger. -}; - -/** - * Decode an XML comment tag and create a rendered comment on the workspace. - * @param {!Element} xmlComment XML comment element. - * @param {!Blockly.Workspace} workspace The workspace. - * @param {number=} opt_wsWidth The width of the workspace, which is used to - * position comments correctly in RTL. - * @return {!Blockly.WorkspaceCommentSvg} The created workspace comment. - * @package - */ -Blockly.WorkspaceCommentSvg.fromXml = function(xmlComment, workspace, - opt_wsWidth) { - Blockly.Events.disable(); - try { - var info = Blockly.WorkspaceComment.parseAttributes(xmlComment); - - var comment = new Blockly.WorkspaceCommentSvg(workspace, - info.content, info.h, info.w, info.minimized, info.id); - if (workspace.rendered) { - comment.initSvg(); - comment.render(false); - } - // Position the comment correctly, taking into account the width of a - // rendered RTL workspace. - if (!isNaN(info.x) && !isNaN(info.y)) { - if (workspace.RTL) { - var wsWidth = opt_wsWidth || workspace.getWidth(); - comment.moveBy(wsWidth - info.x, info.y); - } else { - comment.moveBy(info.x, info.y); - } - } - } finally { - Blockly.Events.enable(); - } - Blockly.WorkspaceComment.fireCreateEvent(comment); - - return comment; -}; - -/** - * Encode a comment subtree as XML with XY coordinates. - * @param {boolean=} opt_noId True if the encoder should skip the comment id. - * @return {!Element} Tree of XML elements. - * @package - */ -Blockly.WorkspaceCommentSvg.prototype.toXmlWithXY = function(opt_noId) { - var width; // Not used in LTR. - if (this.workspace.RTL) { - // Here be performance dragons: This calls getMetrics(). - width = this.workspace.getWidth(); - } - var element = this.toXml(opt_noId); - var xy = this.getRelativeToSurfaceXY(); - element.setAttribute('x', - Math.round(this.workspace.RTL ? width - xy.x : xy.x)); - element.setAttribute('y', Math.round(xy.y)); - element.setAttribute('h', this.getHeight()); - element.setAttribute('w', this.getWidth()); - return element; -}; diff --git a/packages/scratch-blocks/core/workspace_drag_surface_svg.js b/packages/scratch-blocks/core/workspace_drag_surface_svg.js deleted file mode 100644 index 12e5e7e00..000000000 --- a/packages/scratch-blocks/core/workspace_drag_surface_svg.js +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview An SVG that floats on top of the workspace. - * Blocks are moved into this SVG during a drag, improving performance. - * The entire SVG is translated using css translation instead of SVG so the - * blocks are never repainted during drag improving performance. - * @author katelyn@google.com (Katelyn Mann) - */ - -'use strict'; - -goog.provide('Blockly.WorkspaceDragSurfaceSvg'); - -goog.require('Blockly.utils'); - -goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); - - -/** - * Blocks are moved into this SVG during a drag, improving performance. - * The entire SVG is translated using css transforms instead of SVG so the - * blocks are never repainted during drag improving performance. - * @param {!Element} container Containing element. - * @constructor - */ -Blockly.WorkspaceDragSurfaceSvg = function(container) { - this.container_ = container; - this.createDom(); -}; - -/** - * The SVG drag surface. Set once by Blockly.WorkspaceDragSurfaceSvg.createDom. - * @type {Element} - * @private - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.SVG_ = null; - -/** - * SVG group inside the drag surface that holds blocks while a drag is in - * progress. Blocks are moved here by the workspace at start of a drag and moved - * back into the main SVG at the end of a drag. - * - * @type {Element} - * @private - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.dragGroup_ = null; - -/** - * Containing HTML element; parent of the workspace and the drag surface. - * @type {Element} - * @private - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.container_ = null; - -/** - * Create the drag surface and inject it into the container. - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.createDom = function() { - if (this.SVG_) { - return; // Already created. - } - - /** - * Dom structure when the workspace is being dragged. If there is no drag in - * progress, the SVG is empty and display: none. - * - * - * /g> - * - */ - this.SVG_ = Blockly.utils.createSvgElement('svg', - { - 'xmlns': Blockly.SVG_NS, - 'xmlns:html': Blockly.HTML_NS, - 'xmlns:xlink': 'http://www.w3.org/1999/xlink', - 'version': '1.1', - 'class': 'blocklyWsDragSurface blocklyOverflowVisible' - }, null); - this.container_.appendChild(this.SVG_); -}; - -/** - * Translate the entire drag surface during a drag. - * We translate the drag surface instead of the blocks inside the surface - * so that the browser avoids repainting the SVG. - * Because of this, the drag coordinates must be adjusted by scale. - * @param {number} x X translation for the entire surface - * @param {number} y Y translation for the entire surface - * @package - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.translateSurface = function(x, y) { - // This is a work-around to prevent a the blocks from rendering - // fuzzy while they are being moved on the drag surface. - var fixedX = x.toFixed(0); - var fixedY = y.toFixed(0); - - this.SVG_.style.display = 'block'; - Blockly.utils.setCssTransform( - this.SVG_, 'translate3d(' + fixedX + 'px, ' + fixedY + 'px, 0px)'); -}; - -/** - * Reports the surface translation in scaled workspace coordinates. - * Use this when finishing a drag to return blocks to the correct position. - * @return {!goog.math.Coordinate} Current translation of the surface - * @package - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.getSurfaceTranslation = function() { - return Blockly.utils.getRelativeXY(this.SVG_); -}; - -/** - * Move the blockCanvas and bubbleCanvas out of the surface SVG and on to - * newSurface. - * @param {SVGElement} newSurface The element to put the drag surface contents - * into. - * @package - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.clearAndHide = function(newSurface) { - if (!newSurface) { - throw 'Couldn\'t clear and hide the drag surface: missing new surface.'; - } - var blockCanvas = this.SVG_.childNodes[0]; - var bubbleCanvas = this.SVG_.childNodes[1]; - if (!blockCanvas || !bubbleCanvas || - !Blockly.utils.hasClass(blockCanvas, 'blocklyBlockCanvas') || - !Blockly.utils.hasClass(bubbleCanvas, 'blocklyBubbleCanvas')) { - throw 'Couldn\'t clear and hide the drag surface. A node was missing.'; - } - - // If there is a previous sibling, put the blockCanvas back right afterwards, - // otherwise insert it as the first child node in newSurface. - if (this.previousSibling_ != null) { - Blockly.utils.insertAfter(blockCanvas, this.previousSibling_); - } else { - newSurface.insertBefore(blockCanvas, newSurface.firstChild); - } - - // Reattach the bubble canvas after the blockCanvas. - Blockly.utils.insertAfter(bubbleCanvas, blockCanvas); - // Hide the drag surface. - this.SVG_.style.display = 'none'; - goog.asserts.assert( - this.SVG_.childNodes.length == 0, 'Drag surface was not cleared.'); - Blockly.utils.setCssTransform(this.SVG_, ''); - this.previousSibling_ = null; -}; - -/** - * Set the SVG to have the block canvas and bubble canvas in it and then - * show the surface. - * @param {!Element} blockCanvas The block canvas element from the workspace. - * @param {!Element} bubbleCanvas The element that contains the bubbles. - * @param {?Element} previousSibling The element to insert the block canvas & - bubble canvas after when it goes back in the DOM at the end of a drag. - * @param {number} width The width of the workspace SVG element. - * @param {number} height The height of the workspace SVG element. - * @param {number} scale The scale of the workspace being dragged. - * @package - */ -Blockly.WorkspaceDragSurfaceSvg.prototype.setContentsAndShow = function( - blockCanvas, bubbleCanvas, previousSibling, width, height, scale) { - goog.asserts.assert( - this.SVG_.childNodes.length == 0, 'Already dragging a block.'); - this.previousSibling_ = previousSibling; - // Make sure the blocks and bubble canvas are scaled appropriately. - blockCanvas.setAttribute('transform', 'translate(0, 0) scale(' + scale + ')'); - bubbleCanvas.setAttribute( - 'transform', 'translate(0, 0) scale(' + scale + ')'); - this.SVG_.setAttribute('width', width); - this.SVG_.setAttribute('height', height); - this.SVG_.appendChild(blockCanvas); - this.SVG_.appendChild(bubbleCanvas); - this.SVG_.style.display = 'block'; -}; diff --git a/packages/scratch-blocks/core/workspace_dragger.js b/packages/scratch-blocks/core/workspace_dragger.js deleted file mode 100644 index 09cb9b818..000000000 --- a/packages/scratch-blocks/core/workspace_dragger.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Methods for dragging a workspace visually. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceDragger'); - -goog.require('goog.math.Coordinate'); -goog.require('goog.asserts'); - - -/** - * Class for a workspace dragger. It moves the workspace around when it is - * being dragged by a mouse or touch. - * Note that the workspace itself manages whether or not it has a drag surface - * and how to do translations based on that. This simply passes the right - * commands based on events. - * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag. - * @constructor - */ -Blockly.WorkspaceDragger = function(workspace) { - /** - * @type {!Blockly.WorkspaceSvg} - * @private - */ - this.workspace_ = workspace; - - /** - * The workspace's metrics object at the beginning of the drag. Contains size - * and position metrics of a workspace. - * Coordinate system: pixel coordinates. - * @type {!Object} - * @private - */ - this.startDragMetrics_ = workspace.getMetrics(); - - /** - * The scroll position of the workspace at the beginning of the drag. - * Coordinate system: pixel coordinates. - * @type {!goog.math.Coordinate} - * @private - */ - this.startScrollXY_ = new goog.math.Coordinate( - workspace.scrollX, workspace.scrollY); -}; - -/** - * Sever all links from this object. - * @package - */ -Blockly.WorkspaceDragger.prototype.dispose = function() { - this.workspace_ = null; -}; - -/** - * Start dragging the workspace. - * @package - */ -Blockly.WorkspaceDragger.prototype.startDrag = function() { - if (Blockly.selected) { - Blockly.selected.unselect(); - } - this.workspace_.setupDragSurface(); -}; - -/** - * Finish dragging the workspace and put everything back where it belongs. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel coordinates. - * @package - */ -Blockly.WorkspaceDragger.prototype.endDrag = function(currentDragDeltaXY) { - // Make sure everything is up to date. - this.drag(currentDragDeltaXY); - this.workspace_.resetDragSurface(); -}; - -/** - * Move the workspace based on the most recent mouse movements. - * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel coordinates. - * @package - */ -Blockly.WorkspaceDragger.prototype.drag = function(currentDragDeltaXY) { - var metrics = this.startDragMetrics_; - var newXY = goog.math.Coordinate.sum(this.startScrollXY_, currentDragDeltaXY); - - // Bound the new XY based on workspace bounds. - var x = Math.min(newXY.x, -metrics.contentLeft); - var y = Math.min(newXY.y, -metrics.contentTop); - x = Math.max(x, metrics.viewWidth - metrics.contentLeft - - metrics.contentWidth); - y = Math.max(y, metrics.viewHeight - metrics.contentTop - - metrics.contentHeight); - - x = -x - metrics.contentLeft; - y = -y - metrics.contentTop; - - this.updateScroll_(x, y); -}; - -/** - * Move the scrollbars to drag the workspace. - * x and y are in pixels. - * @param {number} x The new x position to move the scrollbar to. - * @param {number} y The new y position to move the scrollbar to. - * @private - */ -Blockly.WorkspaceDragger.prototype.updateScroll_ = function(x, y) { - this.workspace_.scrollbar.set(x, y); -}; diff --git a/packages/scratch-blocks/core/workspace_svg.js b/packages/scratch-blocks/core/workspace_svg.js deleted file mode 100644 index e358f6ec9..000000000 --- a/packages/scratch-blocks/core/workspace_svg.js +++ /dev/null @@ -1,2267 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a workspace rendered as SVG. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -goog.provide('Blockly.WorkspaceSvg'); - -// TODO(scr): Fix circular dependencies -//goog.require('Blockly.BlockSvg'); -goog.require('Blockly.Colours'); -goog.require('Blockly.ConnectionDB'); -goog.require('Blockly.constants'); -goog.require('Blockly.DataCategory'); -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.Events.BlockCreate'); -goog.require('Blockly.Gesture'); -goog.require('Blockly.Grid'); -goog.require('Blockly.Options'); -goog.require('Blockly.scratchBlocksUtils'); -goog.require('Blockly.ScrollbarPair'); -goog.require('Blockly.Touch'); -goog.require('Blockly.Trashcan'); -//goog.require('Blockly.VerticalFlyout'); -goog.require('Blockly.Workspace'); -goog.require('Blockly.WorkspaceAudio'); -goog.require('Blockly.WorkspaceComment'); -goog.require('Blockly.WorkspaceCommentSvg'); -goog.require('Blockly.WorkspaceCommentSvg.render'); -goog.require('Blockly.WorkspaceDragSurfaceSvg'); -goog.require('Blockly.Xml'); -goog.require('Blockly.ZoomControls'); - -goog.require('goog.array'); -goog.require('goog.dom'); -goog.require('goog.math.Coordinate'); -goog.require('goog.userAgent'); -goog.require('goog.math.Rect'); - -/** - * Class for a workspace. This is an onscreen area with optional trashcan, - * scrollbars, bubbles, and dragging. - * @param {!Blockly.Options} options Dictionary of options. - * @param {Blockly.BlockDragSurfaceSvg=} opt_blockDragSurface Drag surface for - * blocks. - * @param {Blockly.WorkspaceDragSurfaceSvg=} opt_wsDragSurface Drag surface for - * the workspace. - * @extends {Blockly.Workspace} - * @constructor - */ -Blockly.WorkspaceSvg = function(options, opt_blockDragSurface, opt_wsDragSurface) { - Blockly.WorkspaceSvg.superClass_.constructor.call(this, options); - this.getMetrics = - options.getMetrics || Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_; - this.setMetrics = - options.setMetrics || Blockly.WorkspaceSvg.setTopLevelWorkspaceMetrics_; - - Blockly.ConnectionDB.init(this); - - if (opt_blockDragSurface) { - this.blockDragSurface_ = opt_blockDragSurface; - } - - if (opt_wsDragSurface) { - this.workspaceDragSurface_ = opt_wsDragSurface; - } - - this.useWorkspaceDragSurface_ = - this.workspaceDragSurface_ && Blockly.utils.is3dSupported(); - - /** - * List of currently highlighted blocks. Block highlighting is often used to - * visually mark blocks currently being executed. - * @type !Array. - * @private - */ - this.highlightedBlocks_ = []; - - /** - * Object in charge of loading, storing, and playing audio for a workspace. - * @type {Blockly.WorkspaceAudio} - * @private - */ - this.audioManager_ = new Blockly.WorkspaceAudio(options.parentWorkspace); - - /** - * This workspace's grid object or null. - * @type {Blockly.Grid} - * @private - */ - this.grid_ = this.options.gridPattern ? - new Blockly.Grid(options.gridPattern, options.gridOptions) : null; - - this.registerToolboxCategoryCallback(Blockly.VARIABLE_CATEGORY_NAME, - Blockly.DataCategory); - this.registerToolboxCategoryCallback(Blockly.PROCEDURE_CATEGORY_NAME, - Blockly.Procedures.flyoutCategory); -}; -goog.inherits(Blockly.WorkspaceSvg, Blockly.Workspace); - -/** - * A wrapper function called when a resize event occurs. - * You can pass the result to `unbindEvent_`. - * @type {Array.} - */ -Blockly.WorkspaceSvg.prototype.resizeHandlerWrapper_ = null; - -/** - * The render status of an SVG workspace. - * Returns `false` for headless workspaces and true for instances of - * `Blockly.WorkspaceSvg`. - * @type {boolean} - */ -Blockly.WorkspaceSvg.prototype.rendered = true; - -/** - * Whether the workspace is visible. False if the workspace has been hidden - * by calling `setVisible(false)`. - * @type {boolean} - * @private - */ -Blockly.WorkspaceSvg.prototype.isVisible_ = true; - -/** - * Is this workspace the surface for a flyout? - * @type {boolean} - */ -Blockly.WorkspaceSvg.prototype.isFlyout = false; - -/** - * Is this workspace the surface for a mutator? - * @type {boolean} - * @package - */ -Blockly.WorkspaceSvg.prototype.isMutator = false; - -/** - * Whether this workspace has resizes enabled. - * Disable during batch operations for a performance improvement. - * @type {boolean} - * @private - */ -Blockly.WorkspaceSvg.prototype.resizesEnabled_ = true; - -/** - * Whether this workspace has toolbox/flyout refreshes enabled. - * Disable during batch operations for a performance improvement. - * @type {boolean} - * @private - */ -Blockly.WorkspaceSvg.prototype.toolboxRefreshEnabled_ = true; - -/** - * Current horizontal scrolling offset in pixel units. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.scrollX = 0; - -/** - * Current vertical scrolling offset in pixel units. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.scrollY = 0; - -/** - * Horizontal scroll value when scrolling started in pixel units. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.startScrollX = 0; - -/** - * Vertical scroll value when scrolling started in pixel units. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.startScrollY = 0; - -/** - * Distance from mouse to object being dragged. - * @type {goog.math.Coordinate} - * @private - */ -Blockly.WorkspaceSvg.prototype.dragDeltaXY_ = null; - -/** - * Current scale. - * @type {number} - */ -Blockly.WorkspaceSvg.prototype.scale = 1; - -/** - * The workspace's trashcan (if any). - * @type {Blockly.Trashcan} - */ -Blockly.WorkspaceSvg.prototype.trashcan = null; - -/** - * This workspace's scrollbars, if they exist. - * @type {Blockly.ScrollbarPair} - */ -Blockly.WorkspaceSvg.prototype.scrollbar = null; - -/** - * The current gesture in progress on this workspace, if any. - * @type {Blockly.Gesture} - * @private - */ -Blockly.WorkspaceSvg.prototype.currentGesture_ = null; - -/** - * This workspace's surface for dragging blocks, if it exists. - * @type {Blockly.BlockDragSurfaceSvg} - * @private - */ -Blockly.WorkspaceSvg.prototype.blockDragSurface_ = null; - -/** - * This workspace's drag surface, if it exists. - * @type {Blockly.WorkspaceDragSurfaceSvg} - * @private - */ -Blockly.WorkspaceSvg.prototype.workspaceDragSurface_ = null; - -/** - * Whether to move workspace to the drag surface when it is dragged. - * True if it should move, false if it should be translated directly. - * @type {boolean} - * @private - */ -Blockly.WorkspaceSvg.prototype.useWorkspaceDragSurface_ = false; - -/** - * Whether the drag surface is actively in use. When true, calls to - * translate will translate the drag surface instead of the translating the - * workspace directly. - * This is set to true in setupDragSurface and to false in resetDragSurface. - * @type {boolean} - * @private - */ -Blockly.WorkspaceSvg.prototype.isDragSurfaceActive_ = false; - -/** - * The first parent div with 'injectionDiv' in the name, or null if not set. - * Access this with getInjectionDiv. - * @type {!Element} - * @private - */ -Blockly.WorkspaceSvg.prototype.injectionDiv_ = null; - -/** - * Last known position of the page scroll. - * This is used to determine whether we have recalculated screen coordinate - * stuff since the page scrolled. - * @type {!goog.math.Coordinate} - * @private - */ -Blockly.WorkspaceSvg.prototype.lastRecordedPageScroll_ = null; - -/** - * Map from function names to callbacks, for deciding what to do when a button - * is clicked. - * @type {!Object.} - * @private - */ -Blockly.WorkspaceSvg.prototype.flyoutButtonCallbacks_ = {}; - -/** - * Map from function names to callbacks, for deciding what to do when a custom - * toolbox category is opened. - * @type {!Object.>} - * @private - */ -Blockly.WorkspaceSvg.prototype.toolboxCategoryCallbacks_ = {}; - -/** - * Inverted screen CTM, for use in mouseToSvg. - * @type {SVGMatrix} - * @private - */ -Blockly.WorkspaceSvg.prototype.inverseScreenCTM_ = null; - -/** - * Inverted screen CTM is dirty. - * @type {Boolean} - * @private - */ -Blockly.WorkspaceSvg.prototype.inverseScreenCTMDirty_ = true; - -/** - * Getter for the inverted screen CTM. - * @return {SVGMatrix} The matrix to use in mouseToSvg - */ -Blockly.WorkspaceSvg.prototype.getInverseScreenCTM = function() { - - // Defer getting the screen CTM until we actually need it, this should - // avoid forced reflows from any calls to updateInverseScreenCTM. - if (this.inverseScreenCTMDirty_) { - var ctm = this.getParentSvg().getScreenCTM(); - if (ctm) { - this.inverseScreenCTM_ = ctm.inverse(); - this.inverseScreenCTMDirty_ = false; - } - } - - return this.inverseScreenCTM_; -}; - -/** - * Getter for isVisible - * @return {boolean} Whether the workspace is visible. False if the workspace has been hidden - * by calling `setVisible(false)`. - */ -Blockly.WorkspaceSvg.prototype.isVisible = function() { - return this.isVisible_; -}; - -/** - * Mark the inverse screen CTM as dirty. - */ -Blockly.WorkspaceSvg.prototype.updateInverseScreenCTM = function() { - this.inverseScreenCTMDirty_ = true; -}; - -/** - * Return the absolute coordinates of the top-left corner of this element, - * scales that after canvas SVG element, if it's a descendant. - * The origin (0,0) is the top-left corner of the Blockly SVG. - * @param {!Element} element Element to find the coordinates of. - * @return {!goog.math.Coordinate} Object with .x and .y properties. - * @private - */ -Blockly.WorkspaceSvg.prototype.getSvgXY = function(element) { - var x = 0; - var y = 0; - var scale = 1; - if (goog.dom.contains(this.getCanvas(), element) || - goog.dom.contains(this.getBubbleCanvas(), element)) { - // Before the SVG canvas, scale the coordinates. - scale = this.scale; - } - do { - // Loop through this block and every parent. - var xy = Blockly.utils.getRelativeXY(element); - if (element == this.getCanvas() || - element == this.getBubbleCanvas()) { - // After the SVG canvas, don't scale the coordinates. - scale = 1; - } - x += xy.x * scale; - y += xy.y * scale; - element = element.parentNode; - } while (element && element != this.getParentSvg()); - return new goog.math.Coordinate(x, y); -}; - -/** - * Return the position of the workspace origin relative to the injection div - * origin in pixels. - * The workspace origin is where a block would render at position (0, 0). - * It is not the upper left corner of the workspace SVG. - * @return {!goog.math.Coordinate} Offset in pixels. - * @package - */ -Blockly.WorkspaceSvg.prototype.getOriginOffsetInPixels = function() { - return Blockly.utils.getInjectionDivXY_(this.svgBlockCanvas_); -}; - -/** - * Return the injection div that is a parent of this workspace. - * Walks the DOM the first time it's called, then returns a cached value. - * @return {!Element} The first parent div with 'injectionDiv' in the name. - * @package - */ -Blockly.WorkspaceSvg.prototype.getInjectionDiv = function() { - // NB: it would be better to pass this in at createDom, but is more likely to - // break existing uses of Blockly. - if (!this.injectionDiv_) { - var element = this.svgGroup_; - while (element) { - var classes = element.getAttribute('class') || ''; - if ((' ' + classes + ' ').indexOf(' injectionDiv ') != -1) { - this.injectionDiv_ = element; - break; - } - element = element.parentNode; - } - } - return this.injectionDiv_; -}; - -/** - * Save resize handler data so we can delete it later in dispose. - * @param {!Array.} handler Data that can be passed to unbindEvent_. - */ -Blockly.WorkspaceSvg.prototype.setResizeHandlerWrapper = function(handler) { - this.resizeHandlerWrapper_ = handler; -}; - -/** - * Create the workspace DOM elements. - * @param {string=} opt_backgroundClass Either 'blocklyMainBackground' or - * 'blocklyMutatorBackground'. - * @return {!Element} The workspace's SVG group. - */ -Blockly.WorkspaceSvg.prototype.createDom = function(opt_backgroundClass) { - /** - * - * - * [Trashcan and/or flyout may go here] - * - * - * - * @type {SVGElement} - */ - this.svgGroup_ = Blockly.utils.createSvgElement('g', - {'class': 'blocklyWorkspace'}, null); - - // Note that a alone does not receive mouse events--it must have a - // valid target inside it. If no background class is specified, as in the - // flyout, the workspace will not receive mouse events. - if (opt_backgroundClass) { - /** @type {SVGElement} */ - this.svgBackground_ = Blockly.utils.createSvgElement('rect', - {'height': '100%', 'width': '100%', 'class': opt_backgroundClass}, - this.svgGroup_); - - if (opt_backgroundClass == 'blocklyMainBackground' && this.grid_) { - this.svgBackground_.style.fill = - 'url(#' + this.grid_.getPatternId() + ')'; - } - } - /** @type {SVGElement} */ - this.svgBlockCanvas_ = Blockly.utils.createSvgElement('g', - {'class': 'blocklyBlockCanvas'}, this.svgGroup_, this); - /** @type {SVGElement} */ - this.svgBubbleCanvas_ = Blockly.utils.createSvgElement('g', - {'class': 'blocklyBubbleCanvas'}, this.svgGroup_, this); - var bottom = Blockly.Scrollbar.scrollbarThickness; - if (this.options.hasTrashcan) { - bottom = this.addTrashcan_(bottom); - } - if (this.options.zoomOptions && this.options.zoomOptions.controls) { - this.addZoomControls_(bottom); - } - - if (!this.isFlyout) { - Blockly.bindEventWithChecks_(this.svgGroup_, 'mousedown', this, - this.onMouseDown_); - if (this.options.zoomOptions && this.options.zoomOptions.wheel) { - // Mouse-wheel. - Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, - this.onMouseWheel_); - } - } - - // Determine if there needs to be a category tree, or a simple list of - // blocks. This cannot be changed later, since the UI is very different. - if (this.options.hasCategories) { - /** - * @type {Blockly.Toolbox} - * @private - */ - this.toolbox_ = new Blockly.Toolbox(this); - } - if (this.grid_) { - this.grid_.update(this.scale); - } - this.recordCachedAreas(); - return this.svgGroup_; -}; - -/** - * Dispose of this workspace. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.WorkspaceSvg.prototype.dispose = function() { - // Stop rerendering. - this.rendered = false; - if (this.currentGesture_) { - this.currentGesture_.cancel(); - } - Blockly.WorkspaceSvg.superClass_.dispose.call(this); - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.svgBlockCanvas_ = null; - this.svgBubbleCanvas_ = null; - if (this.toolbox_) { - this.toolbox_.dispose(); - this.toolbox_ = null; - } - if (this.flyout_) { - this.flyout_.dispose(); - this.flyout_ = null; - } - if (this.trashcan) { - this.trashcan.dispose(); - this.trashcan = null; - } - if (this.scrollbar) { - this.scrollbar.dispose(); - this.scrollbar = null; - } - if (this.zoomControls_) { - this.zoomControls_.dispose(); - this.zoomControls_ = null; - } - - if (this.audioManager_) { - this.audioManager_.dispose(); - this.audioManager_ = null; - } - - if (this.grid_) { - this.grid_.dispose(); - this.grid_ = null; - } - - if (this.toolboxCategoryCallbacks_) { - this.toolboxCategoryCallbacks_ = null; - } - if (this.flyoutButtonCallbacks_) { - this.flyoutButtonCallbacks_ = null; - } - if (!this.options.parentWorkspace) { - // Top-most workspace. Dispose of the div that the - // SVG is injected into (i.e. injectionDiv). - goog.dom.removeNode(this.getParentSvg().parentNode); - } - if (this.resizeHandlerWrapper_) { - Blockly.unbindEvent_(this.resizeHandlerWrapper_); - this.resizeHandlerWrapper_ = null; - } -}; - -/** - * Obtain a newly created block. - * @param {?string} prototypeName Name of the language object containing - * type-specific functions for this block. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. - * @return {!Blockly.BlockSvg} The created block. - */ -Blockly.WorkspaceSvg.prototype.newBlock = function(prototypeName, opt_id) { - return new Blockly.BlockSvg(this, prototypeName, opt_id); -}; - -/** - * Add a trashcan. - * @param {number} bottom Distance from workspace bottom to bottom of trashcan. - * @return {number} Distance from workspace bottom to the top of trashcan. - * @private - */ -Blockly.WorkspaceSvg.prototype.addTrashcan_ = function(bottom) { - /** @type {Blockly.Trashcan} */ - this.trashcan = new Blockly.Trashcan(this); - var svgTrashcan = this.trashcan.createDom(); - this.svgGroup_.insertBefore(svgTrashcan, this.svgBlockCanvas_); - return this.trashcan.init(bottom); -}; - -/** - * Add zoom controls. - * @param {number} bottom Distance from workspace bottom to bottom of controls. - * @return {number} Distance from workspace bottom to the top of controls. - * @private - */ -Blockly.WorkspaceSvg.prototype.addZoomControls_ = function(bottom) { - /** @type {Blockly.ZoomControls} */ - this.zoomControls_ = new Blockly.ZoomControls(this); - var svgZoomControls = this.zoomControls_.createDom(); - this.svgGroup_.appendChild(svgZoomControls); - return this.zoomControls_.init(bottom); -}; - -/** - * Add a flyout element in an element with the given tag name. - * @param {string} tagName What type of tag the flyout belongs in. - * @return {!Element} The element containing the flyout DOM. - * @private - */ -Blockly.WorkspaceSvg.prototype.addFlyout_ = function(tagName) { - var workspaceOptions = { - disabledPatternId: this.options.disabledPatternId, - parentWorkspace: this, - RTL: this.RTL, - oneBasedIndex: this.options.oneBasedIndex, - horizontalLayout: this.horizontalLayout, - toolboxPosition: this.options.toolboxPosition, - stackGlowFilterId: this.options.stackGlowFilterId - }; - if (this.horizontalLayout) { - this.flyout_ = new Blockly.HorizontalFlyout(workspaceOptions); - } else { - this.flyout_ = new Blockly.VerticalFlyout(workspaceOptions); - } - this.flyout_.autoClose = false; - - // Return the element so that callers can place it in their desired - // spot in the DOM. For example, mutator flyouts do not go in the same place - // as main workspace flyouts. - return this.flyout_.createDom(tagName); -}; - -/** - * Getter for the flyout associated with this workspace. This flyout may be - * owned by either the toolbox or the workspace, depending on toolbox - * configuration. It will be null if there is no flyout. - * @return {Blockly.Flyout} The flyout on this workspace. - * @package - */ -Blockly.WorkspaceSvg.prototype.getFlyout = function() { - if (this.flyout_) { - return this.flyout_; - } - if (this.toolbox_) { - return this.toolbox_.flyout_; - } - return null; -}; - -/** - * Getter for the toolbox associated with this workspace, if one exists. - * @return {Blockly.Toolbox} The toolbox on this workspace. - * @package - */ -Blockly.WorkspaceSvg.prototype.getToolbox = function() { - return this.toolbox_; -}; - -/** - * Update items that use screen coordinate calculations - * because something has changed (e.g. scroll position, window size). - * @private - */ -Blockly.WorkspaceSvg.prototype.updateScreenCalculations_ = function() { - this.updateInverseScreenCTM(); - this.recordCachedAreas(); -}; - -/** - * If enabled, resize the parts of the workspace that change when the workspace - * contents (e.g. block positions) change. This will also scroll the - * workspace contents if needed. - * @package - */ -Blockly.WorkspaceSvg.prototype.resizeContents = function() { - if (!this.resizesEnabled_ || !this.rendered) { - return; - } - if (this.scrollbar) { - // TODO(picklesrus): Once rachel-fenichel's scrollbar refactoring - // is complete, call the method that only resizes scrollbar - // based on contents. - this.scrollbar.resize(); - } - this.updateInverseScreenCTM(); -}; - -/** - * Resize and reposition all of the workspace chrome (toolbox, - * trash, scrollbars etc.) - * This should be called when something changes that - * requires recalculating dimensions and positions of the - * trash, zoom, toolbox, etc. (e.g. window resize). - */ -Blockly.WorkspaceSvg.prototype.resize = function() { - if (this.toolbox_) { - this.toolbox_.position(); - } - if (this.flyout_) { - this.flyout_.position(); - } - if (this.trashcan) { - this.trashcan.position(); - } - if (this.zoomControls_) { - this.zoomControls_.position(); - } - if (this.scrollbar) { - this.scrollbar.resize(); - } - this.updateScreenCalculations_(); -}; - -/** - * Resizes and repositions workspace chrome if the page has a new - * scroll position. - * @package - */ -Blockly.WorkspaceSvg.prototype.updateScreenCalculationsIfScrolled - = function() { - /* eslint-disable indent */ - var currScroll = goog.dom.getDocumentScroll(); - if (!goog.math.Coordinate.equals(this.lastRecordedPageScroll_, - currScroll)) { - this.lastRecordedPageScroll_ = currScroll; - this.updateScreenCalculations_(); - } -}; /* eslint-enable indent */ - -/** - * Get the SVG element that forms the drawing surface. - * @return {!Element} SVG element. - */ -Blockly.WorkspaceSvg.prototype.getCanvas = function() { - return this.svgBlockCanvas_; -}; - -/** - * Get the SVG element that forms the bubble surface. - * @return {!SVGGElement} SVG element. - */ -Blockly.WorkspaceSvg.prototype.getBubbleCanvas = function() { - return this.svgBubbleCanvas_; -}; - -/** - * Get the SVG element that contains this workspace. - * @return {!Element} SVG element. - */ -Blockly.WorkspaceSvg.prototype.getParentSvg = function() { - if (this.cachedParentSvg_) { - return this.cachedParentSvg_; - } - var element = this.svgGroup_; - while (element) { - if (element.tagName == 'svg') { - this.cachedParentSvg_ = element; - return element; - } - element = element.parentNode; - } - return null; -}; - -/** - * Translate this workspace to new coordinates. - * @param {number} x Horizontal translation. - * @param {number} y Vertical translation. - */ -Blockly.WorkspaceSvg.prototype.translate = function(x, y) { - if (this.useWorkspaceDragSurface_ && this.isDragSurfaceActive_) { - this.workspaceDragSurface_.translateSurface(x,y); - } else { - var translation = 'translate(' + x + ',' + y + ') ' + - 'scale(' + this.scale + ')'; - this.svgBlockCanvas_.setAttribute('transform', translation); - this.svgBubbleCanvas_.setAttribute('transform', translation); - } - // Now update the block drag surface if we're using one. - if (this.blockDragSurface_) { - this.blockDragSurface_.translateAndScaleGroup(x, y, this.scale); - } -}; - -/** - * Called at the end of a workspace drag to take the contents - * out of the drag surface and put them back into the workspace SVG. - * Does nothing if the workspace drag surface is not enabled. - * @package - */ -Blockly.WorkspaceSvg.prototype.resetDragSurface = function() { - // Don't do anything if we aren't using a drag surface. - if (!this.useWorkspaceDragSurface_) { - return; - } - - this.isDragSurfaceActive_ = false; - - var trans = this.workspaceDragSurface_.getSurfaceTranslation(); - this.workspaceDragSurface_.clearAndHide(this.svgGroup_); - var translation = 'translate(' + trans.x + ',' + trans.y + ') ' + - 'scale(' + this.scale + ')'; - this.svgBlockCanvas_.setAttribute('transform', translation); - this.svgBubbleCanvas_.setAttribute('transform', translation); -}; - -/** - * Called at the beginning of a workspace drag to move contents of - * the workspace to the drag surface. - * Does nothing if the drag surface is not enabled. - * @package - */ -Blockly.WorkspaceSvg.prototype.setupDragSurface = function() { - // Don't do anything if we aren't using a drag surface. - if (!this.useWorkspaceDragSurface_) { - return; - } - - // This can happen if the user starts a drag, mouses up outside of the - // document where the mouseup listener is registered (e.g. outside of an - // iframe) and then moves the mouse back in the workspace. On mobile and ff, - // we get the mouseup outside the frame. On chrome and safari desktop we do - // not. - if (this.isDragSurfaceActive_) { - return; - } - - this.isDragSurfaceActive_ = true; - - // Figure out where we want to put the canvas back. The order - // in the is important because things are layered. - var previousElement = this.svgBlockCanvas_.previousSibling; - var width = parseInt(this.getParentSvg().getAttribute('width'), 10); - var height = parseInt(this.getParentSvg().getAttribute('height'), 10); - var coord = Blockly.utils.getRelativeXY(this.svgBlockCanvas_); - this.workspaceDragSurface_.setContentsAndShow(this.svgBlockCanvas_, - this.svgBubbleCanvas_, previousElement, width, height, this.scale); - this.workspaceDragSurface_.translateSurface(coord.x, coord.y); -}; - -/** - * @return {?Blockly.BlockDragSurfaceSvg} This workspace's block drag surface, - * if one is in use. - * @package - */ -Blockly.WorkspaceSvg.prototype.getBlockDragSurface = function() { - return this.blockDragSurface_; -}; - -/** - * Returns the horizontal offset of the workspace. - * Intended for LTR/RTL compatibility in XML. - * @return {number} Width. - */ -Blockly.WorkspaceSvg.prototype.getWidth = function() { - var metrics = this.getMetrics(); - return metrics ? metrics.viewWidth / this.scale : 0; -}; - -/** - * Toggles the visibility of the workspace. - * Currently only intended for main workspace. - * @param {boolean} isVisible True if workspace should be visible. - */ -Blockly.WorkspaceSvg.prototype.setVisible = function(isVisible) { - - // Tell the scrollbar whether its container is visible so it can - // tell when to hide itself. - if (this.scrollbar) { - this.scrollbar.setContainerVisible(isVisible); - } - - // Tell the flyout whether its container is visible so it can - // tell when to hide itself. - if (this.getFlyout()) { - this.getFlyout().setContainerVisible(isVisible); - } - - this.getParentSvg().style.display = isVisible ? 'block' : 'none'; - if (this.toolbox_) { - // Currently does not support toolboxes in mutators. - this.toolbox_.HtmlDiv.style.display = isVisible ? 'block' : 'none'; - } - if (isVisible) { - this.render(); - // The window may have changed size while the workspace was hidden. - // Resize recalculates scrollbar position, delete areas, etc. - this.resize(); - } else { - Blockly.hideChaff(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - } - this.isVisible_ = isVisible; -}; - -/** - * Render all blocks in workspace. - */ -Blockly.WorkspaceSvg.prototype.render = function() { - // Generate list of all blocks. - var blocks = this.getAllBlocks(); - // Render each block. - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].render(false); - } -}; - -/** - * Was used back when block highlighting (for execution) and block selection - * (for editing) were the same thing. - * Any calls of this function can be deleted. - * @deprecated October 2016 - */ -Blockly.WorkspaceSvg.prototype.traceOn = function() { - console.warn('Deprecated call to traceOn, delete this.'); -}; - -/** - * Highlight or unhighlight a block in the workspace. Block highlighting is - * often used to visually mark blocks currently being executed. - * @param {?string} id ID of block to highlight/unhighlight, - * or null for no block (used to unhighlight all blocks). - * @param {boolean=} opt_state If undefined, highlight specified block and - * automatically unhighlight all others. If true or false, manually - * highlight/unhighlight the specified block. - */ -Blockly.WorkspaceSvg.prototype.highlightBlock = function(id, opt_state) { - if (opt_state === undefined) { - // Unhighlight all blocks. - for (var i = 0, block; block = this.highlightedBlocks_[i]; i++) { - block.setHighlighted(false); - } - this.highlightedBlocks_.length = 0; - } - // Highlight/unhighlight the specified block. - var block = id ? this.getBlockById(id) : null; - if (block) { - var state = (opt_state === undefined) || opt_state; - // Using Set here would be great, but at the cost of IE10 support. - if (!state) { - goog.array.remove(this.highlightedBlocks_, block); - } else if (this.highlightedBlocks_.indexOf(block) == -1) { - this.highlightedBlocks_.push(block); - } - block.setHighlighted(state); - } -}; - -/** - * Glow/unglow a block in the workspace. - * @param {?string} id ID of block to find. - * @param {boolean} isGlowingBlock Whether to glow the block. - */ -Blockly.WorkspaceSvg.prototype.glowBlock = function(id, isGlowingBlock) { - var block = null; - if (id) { - block = this.getBlockById(id); - if (!block) { - throw 'Tried to glow block that does not exist.'; - } - } - block.setGlowBlock(isGlowingBlock); -}; - -/** - * Glow/unglow a stack in the workspace. - * @param {?string} id ID of block which starts the stack. - * @param {boolean} isGlowingStack Whether to glow the stack. - */ -Blockly.WorkspaceSvg.prototype.glowStack = function(id, isGlowingStack) { - var block = null; - if (id) { - block = this.getBlockById(id); - if (!block) { - throw 'Tried to glow stack on block that does not exist.'; - } - } - block.setGlowStack(isGlowingStack); -}; - -/** - * Visually report a value associated with a block. - * In Scratch, appears as a pop-up next to the block when a reporter block is clicked. - * @param {?string} id ID of block to report associated value. - * @param {?string} value String value to visually report. - */ -Blockly.WorkspaceSvg.prototype.reportValue = function(id, value) { - var block = this.getBlockById(id); - if (!block) { - throw 'Tried to report value on block that does not exist.'; - } - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.DropDownDiv.clearContent(); - var contentDiv = Blockly.DropDownDiv.getContentDiv(); - var valueReportBox = goog.dom.createElement('div'); - valueReportBox.setAttribute('class', 'valueReportBox'); - valueReportBox.innerHTML = Blockly.scratchBlocksUtils.encodeEntities(value); - contentDiv.appendChild(valueReportBox); - Blockly.DropDownDiv.setColour( - Blockly.Colours.valueReportBackground, - Blockly.Colours.valueReportBorder - ); - Blockly.DropDownDiv.showPositionedByBlock(this, block); -}; - -/** - * Paste the provided block onto the workspace. - * @param {!Element} xmlBlock XML block element. - */ -Blockly.WorkspaceSvg.prototype.paste = function(xmlBlock) { - if (!this.rendered) { - return; - } - if (this.currentGesture_) { - this.currentGesture_.cancel(); // Dragging while pasting? No. - } - if (xmlBlock.tagName.toLowerCase() == 'comment') { - this.pasteWorkspaceComment_(xmlBlock); - } else { - this.pasteBlock_(xmlBlock); - } -}; - -/** - * Paste the provided block onto the workspace. - * @param {!Element} xmlBlock XML block element. - */ -Blockly.WorkspaceSvg.prototype.pasteBlock_ = function(xmlBlock) { - Blockly.Events.disable(); - try { - var block = Blockly.Xml.domToBlock(xmlBlock, this); - // Scratch-specific: Give shadow dom new IDs to prevent duplicating on paste - Blockly.scratchBlocksUtils.changeObscuredShadowIds(block); - // Move the duplicate to original position. - var blockX = parseInt(xmlBlock.getAttribute('x'), 10); - var blockY = parseInt(xmlBlock.getAttribute('y'), 10); - if (!isNaN(blockX) && !isNaN(blockY)) { - if (this.RTL) { - blockX = -blockX; - } - // Offset block until not clobbering another block and not in connection - // distance with neighbouring blocks. - do { - var collide = false; - var allBlocks = this.getAllBlocks(); - for (var i = 0, otherBlock; otherBlock = allBlocks[i]; i++) { - var otherXY = otherBlock.getRelativeToSurfaceXY(); - if (Math.abs(blockX - otherXY.x) <= 1 && - Math.abs(blockY - otherXY.y) <= 1) { - collide = true; - break; - } - } - if (!collide) { - // Check for blocks in snap range to any of its connections. - var connections = block.getConnections_(false); - for (var i = 0, connection; connection = connections[i]; i++) { - var neighbour = connection.closest(Blockly.SNAP_RADIUS, - new goog.math.Coordinate(blockX, blockY)); - if (neighbour.connection) { - collide = true; - break; - } - } - } - if (collide) { - if (this.RTL) { - blockX -= Blockly.SNAP_RADIUS; - } else { - blockX += Blockly.SNAP_RADIUS; - } - blockY += Blockly.SNAP_RADIUS * 2; - } - } while (collide); - block.moveBy(blockX, blockY); - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled() && !block.isShadow()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(block)); - } - block.select(); -}; - -/** - * Paste the provided comment onto the workspace. - * @param {!Element} xmlComment XML workspace comment element. - * @private - */ -Blockly.WorkspaceSvg.prototype.pasteWorkspaceComment_ = function(xmlComment) { - Blockly.Events.disable(); - try { - var comment = Blockly.WorkspaceCommentSvg.fromXml(xmlComment, this); - // Move the duplicate to original position. - var commentX = parseInt(xmlComment.getAttribute('x'), 10); - var commentY = parseInt(xmlComment.getAttribute('y'), 10); - if (!isNaN(commentX) && !isNaN(commentY)) { - if (this.RTL) { - commentX = -commentX; - } - // Offset workspace comment. - // TODO: (github.com/google/blockly/issues/1719) properly offset comment - // such that it's not interfereing with any blocks - commentX += 50; - commentY += 50; - comment.moveBy(commentX, commentY); - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled()) { - Blockly.WorkspaceComment.fireCreateEvent(comment); - } - comment.select(); -}; - -/** - * Refresh the toolbox unless there's a drag in progress. - * @private - */ -Blockly.WorkspaceSvg.prototype.refreshToolboxSelection_ = function() { - // Updating the toolbox can be expensive. Don't do it when when it is - // disabled. - if (this.toolbox_) { - if (this.toolbox_.flyout_ && !this.currentGesture_ && - this.toolboxRefreshEnabled_) { - this.toolbox_.refreshSelection(); - } - } else { - var thisTarget = this.targetWorkspace; - if (thisTarget && thisTarget.toolbox_ && thisTarget.toolbox_.flyout_ && - !thisTarget.currentGesture_ && thisTarget.toolboxRefreshEnabled_) { - thisTarget.toolbox_.refreshSelection(); - } - } -}; - -/** - * Rename a variable by updating its name in the variable map. Update the - * flyout to show the renamed variable immediately. - * @param {string} id ID of the variable to rename. - * @param {string} newName New variable name. - * @package - */ -Blockly.WorkspaceSvg.prototype.renameVariableById = function(id, newName) { - Blockly.WorkspaceSvg.superClass_.renameVariableById.call(this, id, newName); - this.refreshToolboxSelection_(); -}; - -/** - * Delete a variable by the passed in ID. Update the flyout to show - * immediately that the variable is deleted. - * @param {string} id ID of variable to delete. - * @package - */ -Blockly.WorkspaceSvg.prototype.deleteVariableById = function(id) { - Blockly.WorkspaceSvg.superClass_.deleteVariableById.call(this, id); - this.refreshToolboxSelection_(); -}; - -/** - * Create a new variable with the given name. Update the flyout to show the new - * variable immediately. - * @param {string} name The new variable's name. - * @param {string=} opt_type The type of the variable like 'int' or 'string'. - * Does not need to be unique. Field_variable can filter variables based on - * their type. This will default to '' which is a specific type. - * @param {string=} opt_id The unique ID of the variable. This will default to - * a UUID. - * @param {boolean=} opt_isLocal Whether the variable is locally scoped. - * @param {boolean=} opt_isCloud Whether the variable is a cloud variable. - * @return {?Blockly.VariableModel} The newly created variable. - * @package - */ -Blockly.WorkspaceSvg.prototype.createVariable = function(name, opt_type, opt_id, - opt_isLocal, opt_isCloud) { - var variableInMap = (this.getVariable(name, opt_type) != null); - var newVar = Blockly.WorkspaceSvg.superClass_.createVariable.call( - this, name, opt_type, opt_id, opt_isLocal, opt_isCloud); - // For performance reasons, only refresh the the toolbox for new variables. - // Variables that already exist should already be there. - if (!variableInMap && (opt_type != Blockly.BROADCAST_MESSAGE_VARIABLE_TYPE)) { - this.refreshToolboxSelection_(); - } - return newVar; -}; - -/** - * Update cached areas for this workspace. - */ -Blockly.WorkspaceSvg.prototype.recordCachedAreas = function() { - this.recordBlocksArea_(); - this.recordDeleteAreas_(); -}; - -/** - * Make a list of all the delete areas for this workspace. - * @private - */ -Blockly.WorkspaceSvg.prototype.recordDeleteAreas_ = function() { - if (this.trashcan) { - this.deleteAreaTrash_ = this.trashcan.getClientRect(); - } else { - this.deleteAreaTrash_ = null; - } - if (this.flyout_) { - this.deleteAreaToolbox_ = this.flyout_.getClientRect(); - } else if (this.toolbox_) { - this.deleteAreaToolbox_ = this.toolbox_.getClientRect(); - } else { - this.deleteAreaToolbox_ = null; - } -}; - -/** - * Record where all of blocks GUI is on the screen - * @private - */ -Blockly.WorkspaceSvg.prototype.recordBlocksArea_ = function() { - var parentSvg = this.getParentSvg(); - if (parentSvg) { - var bounds = parentSvg.getBoundingClientRect(); - this.blocksArea_ = new goog.math.Rect(bounds.left, bounds.top, bounds.width, bounds.height); - } else { - this.blocksArea_ = null; - } -}; - -/** - * Is the mouse event over a delete area (toolbox or non-closing flyout)? - * @param {!Event} e Mouse move event. - * @return {?number} Null if not over a delete area, or an enum representing - * which delete area the event is over. - */ -Blockly.WorkspaceSvg.prototype.isDeleteArea = function(e) { - var xy = new goog.math.Coordinate(e.clientX, e.clientY); - if (this.deleteAreaTrash_ && this.deleteAreaTrash_.contains(xy)) { - return Blockly.DELETE_AREA_TRASH; - } - if (this.deleteAreaToolbox_ && this.deleteAreaToolbox_.contains(xy)) { - return Blockly.DELETE_AREA_TOOLBOX; - } - return Blockly.DELETE_AREA_NONE; -}; - -/** - * Is the mouse event inside the blocks UI? - * @param {!Event} e Mouse move event. - * @return {boolean} True if event is within the bounds of the blocks UI or delete area - */ -Blockly.WorkspaceSvg.prototype.isInsideBlocksArea = function(e) { - var xy = new goog.math.Coordinate(e.clientX, e.clientY); - if (this.isDeleteArea(e) || (this.blocksArea_ && this.blocksArea_.contains(xy))) { - return true; - } - return false; -}; - -/** - * Handle a mouse-down on SVG drawing surface. - * @param {!Event} e Mouse down event. - * @private - */ -Blockly.WorkspaceSvg.prototype.onMouseDown_ = function(e) { - var gesture = this.getGesture(e); - if (gesture) { - gesture.handleWsStart(e, this); - } -}; - -/** - * Start tracking a drag of an object on this workspace. - * @param {!Event} e Mouse down event. - * @param {!goog.math.Coordinate} xy Starting location of object. - */ -Blockly.WorkspaceSvg.prototype.startDrag = function(e, xy) { - // Record the starting offset between the bubble's location and the mouse. - var point = Blockly.utils.mouseToSvg(e, this.getParentSvg(), - this.getInverseScreenCTM()); - // Fix scale of mouse event. - point.x /= this.scale; - point.y /= this.scale; - this.dragDeltaXY_ = goog.math.Coordinate.difference(xy, point); -}; - -/** - * Track a drag of an object on this workspace. - * @param {!Event} e Mouse move event. - * @return {!goog.math.Coordinate} New location of object. - */ -Blockly.WorkspaceSvg.prototype.moveDrag = function(e) { - var point = Blockly.utils.mouseToSvg(e, this.getParentSvg(), - this.getInverseScreenCTM()); - // Fix scale of mouse event. - point.x /= this.scale; - point.y /= this.scale; - return goog.math.Coordinate.sum(this.dragDeltaXY_, point); -}; - -/** - * Is the user currently dragging a block or scrolling the flyout/workspace? - * @return {boolean} True if currently dragging or scrolling. - */ -Blockly.WorkspaceSvg.prototype.isDragging = function() { - return this.currentGesture_ && this.currentGesture_.isDragging(); -}; - -/** - * Is this workspace draggable and scrollable? - * @return {boolean} True if this workspace may be dragged. - */ -Blockly.WorkspaceSvg.prototype.isDraggable = function() { - return !!this.scrollbar; -}; - -/** - * Handle a mouse-wheel on SVG drawing surface. - * @param {!Event} e Mouse wheel event. - * @private - */ -Blockly.WorkspaceSvg.prototype.onMouseWheel_ = function(e) { - // TODO: Remove gesture cancellation and compensate for coordinate skew during - // zoom. - if (this.currentGesture_) { - this.currentGesture_.cancel(); - } - - // Multiplier variable, so that non-pixel-deltaModes are supported. - // See LLK/scratch-blocks#1190. - var multiplier = e.deltaMode === 0x1 ? Blockly.LINE_SCROLL_MULTIPLIER : 1; - - if (e.ctrlKey) { - // The vertical scroll distance that corresponds to a click of a zoom button. - var PIXELS_PER_ZOOM_STEP = 50; - var delta = -e.deltaY / PIXELS_PER_ZOOM_STEP * multiplier; - var position = Blockly.utils.mouseToSvg(e, this.getParentSvg(), - this.getInverseScreenCTM()); - this.zoom(position.x, position.y, delta); - } else { - // This is a regular mouse wheel event - scroll the workspace - // First hide the WidgetDiv without animation - // (mouse scroll makes field out of place with div) - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - - var x = this.scrollX - e.deltaX * multiplier; - var y = this.scrollY - e.deltaY * multiplier; - - if (e.shiftKey && e.deltaX === 0) { - // Scroll horizontally (based on vertical scroll delta) - // This is needed as for some browser/system combinations which do not - // set deltaX. See #1662. - x = this.scrollX - e.deltaY * multiplier; - y = this.scrollY; // Don't scroll vertically - } - - this.startDragMetrics = this.getMetrics(); - this.scroll(x, y); - } - e.preventDefault(); -}; - -/** - * Calculate the bounding box for the blocks on the workspace. - * Coordinate system: workspace coordinates. - * - * @return {Object} Contains the position and size of the bounding box - * containing the blocks on the workspace. - */ -Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox = function() { - var topBlocks = this.getTopBlocks(false); - var topComments = this.getTopComments(false); - var topElements = topBlocks.concat(topComments); - // There are no blocks, return empty rectangle. - if (!topElements.length) { - return {x: 0, y: 0, width: 0, height: 0}; - } - - // Initialize boundary using the first block. - var boundary = topElements[0].getBoundingRectangle(); - - // Start at 1 since the 0th block was used for initialization - for (var i = 1; i < topElements.length; i++) { - var blockBoundary = topElements[i].getBoundingRectangle(); - if (blockBoundary.topLeft.x < boundary.topLeft.x) { - boundary.topLeft.x = blockBoundary.topLeft.x; - } - if (blockBoundary.bottomRight.x > boundary.bottomRight.x) { - boundary.bottomRight.x = blockBoundary.bottomRight.x; - } - if (blockBoundary.topLeft.y < boundary.topLeft.y) { - boundary.topLeft.y = blockBoundary.topLeft.y; - } - if (blockBoundary.bottomRight.y > boundary.bottomRight.y) { - boundary.bottomRight.y = blockBoundary.bottomRight.y; - } - } - return { - x: boundary.topLeft.x, - y: boundary.topLeft.y, - width: boundary.bottomRight.x - boundary.topLeft.x, - height: boundary.bottomRight.y - boundary.topLeft.y - }; -}; - -/** - * Clean up the workspace by ordering all the blocks in a column. - */ -Blockly.WorkspaceSvg.prototype.cleanUp = function() { - this.setResizesEnabled(false); - Blockly.Events.setGroup(true); - var topBlocks = this.getTopBlocks(true); - var cursorY = 0; - for (var i = 0, block; block = topBlocks[i]; i++) { - var xy = block.getRelativeToSurfaceXY(); - block.moveBy(-xy.x, cursorY - xy.y); - block.snapToGrid(); - cursorY = block.getRelativeToSurfaceXY().y + - block.getHeightWidth().height + Blockly.BlockSvg.MIN_BLOCK_Y; - } - Blockly.Events.setGroup(false); - this.setResizesEnabled(true); -}; - -/** - * Show the context menu for the workspace. - * @param {!Event} e Mouse event. - * @private - */ -Blockly.WorkspaceSvg.prototype.showContextMenu_ = function(e) { - if (this.options.readOnly || this.isFlyout) { - return; - } - var menuOptions = []; - var topBlocks = this.getTopBlocks(true); - var eventGroup = Blockly.utils.genUid(); - var ws = this; - - // Options to undo/redo previous action. - menuOptions.push(Blockly.ContextMenu.wsUndoOption(this)); - menuOptions.push(Blockly.ContextMenu.wsRedoOption(this)); - - // Option to clean up blocks. - if (this.scrollbar) { - menuOptions.push( - Blockly.ContextMenu.wsCleanupOption(this,topBlocks.length)); - } - - if (this.options.collapse) { - var hasCollapsedBlocks = false; - var hasExpandedBlocks = false; - for (var i = 0; i < topBlocks.length; i++) { - var block = topBlocks[i]; - while (block) { - if (block.isCollapsed()) { - hasCollapsedBlocks = true; - } else { - hasExpandedBlocks = true; - } - block = block.getNextBlock(); - } - } - - menuOptions.push(Blockly.ContextMenu.wsCollapseOption(hasExpandedBlocks, - topBlocks)); - - menuOptions.push(Blockly.ContextMenu.wsExpandOption(hasCollapsedBlocks, - topBlocks)); - } - - // Option to add a workspace comment. - if (this.options.comments) { - menuOptions.push(Blockly.ContextMenu.workspaceCommentOption(ws, e)); - } - - // Option to delete all blocks. - // Count the number of blocks that are deletable. - var deleteList = Blockly.WorkspaceSvg.buildDeleteList_(topBlocks); - // Scratch-specific: don't count shadow blocks in delete count - var deleteCount = 0; - for (var i = 0; i < deleteList.length; i++) { - if (!deleteList[i].isShadow()) { - deleteCount++; - } - } - - var DELAY = 10; - function deleteNext() { - Blockly.Events.setGroup(eventGroup); - var block = deleteList.shift(); - if (block) { - if (block.workspace) { - block.dispose(false, true); - setTimeout(deleteNext, DELAY); - } else { - deleteNext(); - } - } - Blockly.Events.setGroup(false); - } - - var deleteOption = { - text: deleteCount == 1 ? Blockly.Msg.DELETE_BLOCK : - Blockly.Msg.DELETE_X_BLOCKS.replace('%1', String(deleteCount)), - enabled: deleteCount > 0, - callback: function() { - if (ws.currentGesture_) { - ws.currentGesture_.cancel(); - } - if (deleteCount < 2 ) { - deleteNext(); - } else { - Blockly.confirm( - Blockly.Msg.DELETE_ALL_BLOCKS.replace('%1', String(deleteCount)), - function(ok) { - if (ok) { - deleteNext(); - } - }); - } - } - }; - menuOptions.push(deleteOption); - - Blockly.ContextMenu.show(e, menuOptions, this.RTL); -}; - -/** - * Build a list of all deletable blocks that are reachable from the given - * list of top blocks. - * @param {!Array.} topBlocks The list of top blocks on the - * workspace. - * @return {!Array.} A list of deletable blocks on the - * workspace. - * @private - */ -Blockly.WorkspaceSvg.buildDeleteList_ = function(topBlocks) { - var deleteList = []; - function addDeletableBlocks(block) { - if (block.isDeletable()) { - deleteList = deleteList.concat(block.getDescendants(false)); - } else { - var children = block.getChildren(); - for (var i = 0; i < children.length; i++) { - addDeletableBlocks(children[i]); - } - } - } - for (var i = 0; i < topBlocks.length; i++) { - addDeletableBlocks(topBlocks[i]); - } - return deleteList; -}; - -/** - * Modify the block tree on the existing toolbox. - * @param {Node|string} tree DOM tree of blocks, or text representation of same. - */ -Blockly.WorkspaceSvg.prototype.updateToolbox = function(tree) { - tree = Blockly.Options.parseToolboxTree(tree); - if (!tree) { - if (this.options.languageTree) { - throw 'Can\'t nullify an existing toolbox.'; - } - return; // No change (null to null). - } - if (!this.options.languageTree) { - throw 'Existing toolbox is null. Can\'t create new toolbox.'; - } - if (tree.getElementsByTagName('category').length) { - if (!this.toolbox_) { - throw 'Existing toolbox has no categories. Can\'t change mode.'; - } - this.options.languageTree = tree; - this.toolbox_.populate_(tree); - this.toolbox_.position(); - } else { - if (!this.flyout_) { - throw 'Existing toolbox has categories. Can\'t change mode.'; - } - this.options.languageTree = tree; - this.flyout_.show(tree.childNodes); - } -}; - -/** - * Mark this workspace as the currently focused main workspace. - */ -Blockly.WorkspaceSvg.prototype.markFocused = function() { - if (this.options.parentWorkspace) { - this.options.parentWorkspace.markFocused(); - } else { - Blockly.mainWorkspace = this; - // We call e.preventDefault in many event handlers which means we - // need to explicitly grab focus (e.g from a textarea) because - // the browser will not do it for us. How to do this is browser dependant. - this.setBrowserFocus(); - } -}; - -/** - * Set the workspace to have focus in the browser. - * @private - */ -Blockly.WorkspaceSvg.prototype.setBrowserFocus = function() { - // Blur whatever was focused since explcitly grabbing focus below does not - // work in Edge. - if (document.activeElement) { - document.activeElement.blur(); - } - try { - // Focus the workspace SVG - this is for Chrome and Firefox. - this.getParentSvg().focus(); - } catch (e) { - // IE and Edge do not support focus on SVG elements. When that fails - // above, get the injectionDiv (the workspace's parent) and focus that - // instead. This doesn't work in Chrome. - try { - // In IE11, use setActive (which is IE only) so the page doesn't scroll - // to the workspace gaining focus. - this.getParentSvg().parentNode.setActive(); - } catch (e) { - // setActive support was discontinued in Edge so when that fails, call - // focus instead. - this.getParentSvg().parentNode.focus(); - } - } -}; - -/** - * Zooming the blocks centered in (x, y) coordinate with zooming in or out. - * @param {number} x X coordinate of center. - * @param {number} y Y coordinate of center. - * @param {number} amount Amount of zooming - * (negative zooms out and positive zooms in). - */ -Blockly.WorkspaceSvg.prototype.zoom = function(x, y, amount) { - var speed = this.options.zoomOptions.scaleSpeed; - var metrics = this.getMetrics(); - var center = this.getParentSvg().createSVGPoint(); - center.x = x; - center.y = y; - center = center.matrixTransform(this.getCanvas().getCTM().inverse()); - x = center.x; - y = center.y; - var canvas = this.getCanvas(); - // Scale factor. - var scaleChange = Math.pow(speed, amount); - // Clamp scale within valid range. - var newScale = this.scale * scaleChange; - if (newScale > this.options.zoomOptions.maxScale) { - scaleChange = this.options.zoomOptions.maxScale / this.scale; - } else if (newScale < this.options.zoomOptions.minScale) { - scaleChange = this.options.zoomOptions.minScale / this.scale; - } - if (this.scale == newScale) { - return; // No change in zoom. - } - if (this.scrollbar) { - var matrix = canvas.getCTM() - .translate(x * (1 - scaleChange), y * (1 - scaleChange)) - .scale(scaleChange); - // newScale and matrix.a should be identical (within a rounding error). - // ScrollX and scrollY are in pixels. - this.scrollX = matrix.e - metrics.absoluteLeft; - this.scrollY = matrix.f - metrics.absoluteTop; - } - this.setScale(newScale); - // Hide the WidgetDiv without animation (zoom makes field out of place with div) - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); -}; - -/** - * Zooming the blocks centered in the center of view with zooming in or out. - * @param {number} type Type of zooming (-1 zooming out and 1 zooming in). - */ -Blockly.WorkspaceSvg.prototype.zoomCenter = function(type) { - var metrics = this.getMetrics(); - var x = metrics.viewWidth / 2; - var y = metrics.viewHeight / 2; - this.zoom(x, y, type); -}; - -/** - * Zoom the blocks to fit in the workspace if possible. - */ -Blockly.WorkspaceSvg.prototype.zoomToFit = function() { - var metrics = this.getMetrics(); - var blocksBox = this.getBlocksBoundingBox(); - var blocksWidth = blocksBox.width; - var blocksHeight = blocksBox.height; - if (!blocksWidth) { - return; // Prevents zooming to infinity. - } - var workspaceWidth = metrics.viewWidth; - var workspaceHeight = metrics.viewHeight; - if (this.flyout_) { - workspaceWidth -= this.flyout_.width_; - } - if (!this.scrollbar) { - // Origin point of 0,0 is fixed, blocks will not scroll to center. - blocksWidth += metrics.contentLeft; - blocksHeight += metrics.contentTop; - } - var ratioX = workspaceWidth / blocksWidth; - var ratioY = workspaceHeight / blocksHeight; - this.setScale(Math.min(ratioX, ratioY)); - this.scrollCenter(); -}; - -/** - * Center the workspace. - */ -Blockly.WorkspaceSvg.prototype.scrollCenter = function() { - if (!this.scrollbar) { - // Can't center a non-scrolling workspace. - console.warn('Tried to scroll a non-scrollable workspace.'); - return; - } - // Hide the WidgetDiv without animation (zoom makes field out of place with div) - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - Blockly.hideChaff(false); - var metrics = this.getMetrics(); - var x = (metrics.contentWidth - metrics.viewWidth) / 2; - if (this.flyout_) { - x -= this.flyout_.width_ / 2; - } - var y = (metrics.contentHeight - metrics.viewHeight) / 2; - this.scrollbar.set(x, y); -}; - -/** - * Scroll the workspace to center on the given block. - * @param {?string} id ID of block center on. - * @public - */ -Blockly.WorkspaceSvg.prototype.centerOnBlock = function(id) { - if (!this.scrollbar) { - console.warn('Tried to scroll a non-scrollable workspace.'); - return; - } - - var block = this.getBlockById(id); - if (!block) { - return; - } - - // XY is in workspace coordinates. - var xy = block.getRelativeToSurfaceXY(); - // Height/width is in workspace units. - var heightWidth = block.getHeightWidth(); - - // Find the enter of the block in workspace units. - var blockCenterY = xy.y + heightWidth.height / 2; - - // In RTL the block's position is the top right of the block, not top left. - var multiplier = this.RTL ? -1 : 1; - var blockCenterX = xy.x + (multiplier * heightWidth.width / 2); - - // Workspace scale, used to convert from workspace coordinates to pixels. - var scale = this.scale; - - // Center in pixels. 0, 0 is at the workspace origin. These numbers may - // be negative. - var pixelX = blockCenterX * scale; - var pixelY = blockCenterY * scale; - - var metrics = this.getMetrics(); - - // Scrolling to here would put the block in the top-left corner of the - // visible workspace. - var scrollToBlockX = pixelX - metrics.contentLeft; - var scrollToBlockY = pixelY - metrics.contentTop; - - // viewHeight and viewWidth are in pixels. - var halfViewWidth = metrics.viewWidth / 2; - var halfViewHeight = metrics.viewHeight / 2; - - // Put the block in the center of the visible workspace instead. - var scrollToCenterX = scrollToBlockX - halfViewWidth; - var scrollToCenterY = scrollToBlockY - halfViewHeight; - - Blockly.hideChaff(); - this.scrollbar.set(scrollToCenterX, scrollToCenterY); -}; - -/** - * Set the workspace's zoom factor. - * @param {number} newScale Zoom factor. - */ -Blockly.WorkspaceSvg.prototype.setScale = function(newScale) { - if (this.options.zoomOptions.maxScale && - newScale > this.options.zoomOptions.maxScale) { - newScale = this.options.zoomOptions.maxScale; - } else if (this.options.zoomOptions.minScale && - newScale < this.options.zoomOptions.minScale) { - newScale = this.options.zoomOptions.minScale; - } - this.scale = newScale; - if (this.grid_) { - this.grid_.update(this.scale); - } - if (this.scrollbar) { - this.scrollbar.resize(); - } else { - this.translate(this.scrollX, this.scrollY); - } - Blockly.hideChaff(false); - if (this.flyout_) { - // No toolbox, resize flyout. - this.flyout_.reflow(); - } -}; - -/** - * Scroll the workspace by a specified amount, keeping in the bounds. - * Be sure to set this.startDragMetrics with cached metrics before calling. - * @param {number} x Target X to scroll to - * @param {number} y Target Y to scroll to - */ -Blockly.WorkspaceSvg.prototype.scroll = function(x, y) { - var metrics = this.startDragMetrics; // Cached values - x = Math.min(x, -metrics.contentLeft); - y = Math.min(y, -metrics.contentTop); - x = Math.max(x, metrics.viewWidth - metrics.contentLeft - - metrics.contentWidth); - y = Math.max(y, metrics.viewHeight - metrics.contentTop - - metrics.contentHeight); - // When the workspace starts scrolling, hide the WidgetDiv without animation. - // This is to prevent a dispoal animation from happening in the wrong location. - Blockly.WidgetDiv.hide(true); - Blockly.DropDownDiv.hideWithoutAnimation(); - // Move the scrollbars and the page will scroll automatically. - this.scrollbar.set(-x - metrics.contentLeft, -y - metrics.contentTop); -}; - -/** - * Update the workspace's stack glow radius to be proportional to scale. - * Ensures that stack glows always appear to be a fixed size. - */ -Blockly.WorkspaceSvg.prototype.updateStackGlowScale_ = function() { - // No such def in the flyout workspace. - if (this.options.stackGlowBlur) { - this.options.stackGlowBlur.setAttribute('stdDeviation', - Blockly.Colours.stackGlowSize / this.scale); - } -}; - -/** - * Get the dimensions of the given workspace component, in pixels. - * @param {Blockly.Toolbox|Blockly.Flyout} elem The element to get the - * dimensions of, or null. It should be a toolbox or flyout, and should - * implement getWidth() and getHeight(). - * @return {!Object} An object containing width and height attributes, which - * will both be zero if elem did not exist. - * @private - */ -Blockly.WorkspaceSvg.getDimensionsPx_ = function(elem) { - var width = 0; - var height = 0; - if (elem) { - width = elem.getWidth(); - height = elem.getHeight(); - } - return { - width: width, - height: height - }; -}; - -/** - * Get the content dimensions of the given workspace, taking into account - * whether or not it is scrollable and what size the workspace div is on screen. - * @param {!Blockly.WorkspaceSvg} ws The workspace to measure. - * @param {!Object} svgSize An object containing height and width attributes in - * CSS pixels. Together they specify the size of the visible workspace, not - * including areas covered up by the toolbox. - * @return {!Object} The dimensions of the contents of the given workspace, as - * an object containing at least - * - height and width in pixels - * - left and top in pixels relative to the workspace origin. - * @private - */ -Blockly.WorkspaceSvg.getContentDimensions_ = function(ws, svgSize) { - if (ws.scrollbar) { - return Blockly.WorkspaceSvg.getContentDimensionsBounded_(ws, svgSize); - } else { - return Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); - } -}; - -/** - * Get the bounding box for all workspace contents, in pixels. - * @param {!Blockly.WorkspaceSvg} ws The workspace to inspect. - * @return {!Object} The dimensions of the contents of the given workspace, as - * an object containing - * - height and width in pixels - * - left, right, top and bottom in pixels relative to the workspace origin. - * @private - */ -Blockly.WorkspaceSvg.getContentDimensionsExact_ = function(ws) { - // Block bounding box is in workspace coordinates. - var blockBox = ws.getBlocksBoundingBox(); - var scale = ws.scale; - - // Convert to pixels. - var width = blockBox.width * scale; - var height = blockBox.height * scale; - var left = blockBox.x * scale; - var top = blockBox.y * scale; - - return { - left: left, - top: top, - right: left + width, - bottom: top + height, - width: width, - height: height - }; -}; - -/** - * Calculate the size of a scrollable workspace, which should include room for a - * half screen border around the workspace contents. - * @param {!Blockly.WorkspaceSvg} ws The workspace to measure. - * @param {!Object} svgSize An object containing height and width attributes in - * CSS pixels. Together they specify the size of the visible workspace, not - * including areas covered up by the toolbox. - * @return {!Object} The dimensions of the contents of the given workspace, as - * an object containing - * - height and width in pixels - * - left and top in pixels relative to the workspace origin. - * @private - */ -Blockly.WorkspaceSvg.getContentDimensionsBounded_ = function(ws, svgSize) { - var content = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); - - // View height and width are both in pixels, and are the same as the SVG size. - var viewWidth = svgSize.width; - var viewHeight = svgSize.height; - var halfWidth = viewWidth / 2; - var halfHeight = viewHeight / 2; - - // Add a border around the content that is at least half a screenful wide. - // Ensure border is wide enough that blocks can scroll over entire screen. - var left = Math.min(content.left - halfWidth, content.right - viewWidth); - var right = Math.max(content.right + halfWidth, content.left + viewWidth); - - var top = Math.min(content.top - halfHeight, content.bottom - viewHeight); - var bottom = Math.max(content.bottom + halfHeight, content.top + viewHeight); - - var dimensions = { - left: left, - top: top, - height: bottom - top, - width: right - left - }; - return dimensions; -}; - -/** - * Return an object with all the metrics required to size scrollbars for a - * top level workspace. The following properties are computed: - * Coordinate system: pixel coordinates. - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the content, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .viewLeft: Offset of left edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .contentLeft: Offset of the left-most content from the x=0 coordinate. - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - * .toolboxWidth: Width of toolbox, if it exists. Otherwise zero. - * .toolboxHeight: Height of toolbox, if it exists. Otherwise zero. - * .flyoutWidth: Width of the flyout if it is always open. Otherwise zero. - * .flyoutHeight: Height of flyout if it is always open. Otherwise zero. - * .toolboxPosition: Top, bottom, left or right. - * @return {!Object} Contains size and position metrics of a top level - * workspace. - * @private - * @this Blockly.WorkspaceSvg - */ -Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_ = function() { - - var toolboxDimensions = - Blockly.WorkspaceSvg.getDimensionsPx_(this.toolbox_); - var flyoutDimensions = - Blockly.WorkspaceSvg.getDimensionsPx_(this.flyout_); - - // Contains height and width in CSS pixels. - // svgSize is equivalent to the size of the injectionDiv at this point. - var svgSize = Blockly.svgSize(this.getParentSvg()); - if (this.toolbox_) { - if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP || - this.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - svgSize.height -= toolboxDimensions.height; - } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT || - this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - svgSize.width -= toolboxDimensions.width; - } - } - - // svgSize is now the space taken up by the Blockly workspace, not including - // the toolbox. - var contentDimensions = - Blockly.WorkspaceSvg.getContentDimensions_(this, svgSize); - - var absoluteLeft = 0; - if (this.toolbox_ && this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { - absoluteLeft = toolboxDimensions.width; - } - var absoluteTop = 0; - if (this.toolbox_ && this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { - absoluteTop = toolboxDimensions.height; - } - - var metrics = { - contentHeight: contentDimensions.height, - contentWidth: contentDimensions.width, - contentTop: contentDimensions.top, - contentLeft: contentDimensions.left, - - viewHeight: svgSize.height, - viewWidth: svgSize.width, - viewTop: -this.scrollY, // Must be in pixels, somehow. - viewLeft: -this.scrollX, // Must be in pixels, somehow. - - absoluteTop: absoluteTop, - absoluteLeft: absoluteLeft, - - toolboxWidth: toolboxDimensions.width, - toolboxHeight: toolboxDimensions.height, - - flyoutWidth: flyoutDimensions.width, - flyoutHeight: flyoutDimensions.height, - - toolboxPosition: this.toolboxPosition - }; - return metrics; -}; - -/** - * Sets the X/Y translations of a top level workspace to match the scrollbars. - * @param {!Object} xyRatio Contains an x and/or y property which is a float - * between 0 and 1 specifying the degree of scrolling. - * @private - * @this Blockly.WorkspaceSvg - */ -Blockly.WorkspaceSvg.setTopLevelWorkspaceMetrics_ = function(xyRatio) { - if (!this.scrollbar) { - throw 'Attempt to set top level workspace scroll without scrollbars.'; - } - var metrics = this.getMetrics(); - if (goog.isNumber(xyRatio.x)) { - this.scrollX = -metrics.contentWidth * xyRatio.x - metrics.contentLeft; - } - if (goog.isNumber(xyRatio.y)) { - this.scrollY = -metrics.contentHeight * xyRatio.y - metrics.contentTop; - } - var x = this.scrollX + metrics.absoluteLeft; - var y = this.scrollY + metrics.absoluteTop; - this.translate(x, y); - if (this.grid_) { - this.grid_.moveTo(x, y); - } -}; - -/** - * Update whether this workspace has resizes enabled. - * If enabled, workspace will resize when appropriate. - * If disabled, workspace will not resize until re-enabled. - * Use to avoid resizing during a batch operation, for performance. - * @param {boolean} enabled Whether resizes should be enabled. - */ -Blockly.WorkspaceSvg.prototype.setResizesEnabled = function(enabled) { - var reenabled = (!this.resizesEnabled_ && enabled); - this.resizesEnabled_ = enabled; - if (reenabled) { - // Newly enabled. Trigger a resize. - this.resizeContents(); - } -}; - -/** - * Update whether this workspace has toolbox refreshes enabled. - * If enabled, the toolbox will refresh when appropriate. - * If disabled, workspace will not refresh until re-enabled. - * Use to avoid refreshing during a batch operation, for performance. - * @param {boolean} enabled Whether refreshes should be enabled. - */ -Blockly.WorkspaceSvg.prototype.setToolboxRefreshEnabled = function(enabled) { - var reenabled = (!this.toolboxRefreshEnabled_ && enabled); - this.toolboxRefreshEnabled_ = enabled; - if (reenabled) { - // Newly enabled. Trigger a refresh. - this.refreshToolboxSelection_(); - } -}; - - -/** - * Dispose of all blocks in workspace, with an optimization to prevent resizes. - */ -Blockly.WorkspaceSvg.prototype.clear = function() { - this.setResizesEnabled(false); - Blockly.WorkspaceSvg.superClass_.clear.call(this); - this.setResizesEnabled(true); -}; - -/** - * Register a callback function associated with a given key, for clicks on - * buttons and labels in the flyout. - * For instance, a button specified by the XML - * - * should be matched by a call to - * registerButtonCallback("CREATE_VARIABLE", yourCallbackFunction). - * @param {string} key The name to use to look up this function. - * @param {function(!Blockly.FlyoutButton)} func The function to call when the - * given button is clicked. - */ -Blockly.WorkspaceSvg.prototype.registerButtonCallback = function(key, func) { - goog.asserts.assert(goog.isFunction(func), - 'Button callbacks must be functions.'); - this.flyoutButtonCallbacks_[key] = func; -}; - -/** - * Get the callback function associated with a given key, for clicks on buttons - * and labels in the flyout. - * @param {string} key The name to use to look up the function. - * @return {?function(!Blockly.FlyoutButton)} The function corresponding to the - * given key for this workspace; null if no callback is registered. - */ -Blockly.WorkspaceSvg.prototype.getButtonCallback = function(key) { - var result = this.flyoutButtonCallbacks_[key]; - return result ? result : null; -}; - -/** - * Remove a callback for a click on a button in the flyout. - * @param {string} key The name associated with the callback function. - */ -Blockly.WorkspaceSvg.prototype.removeButtonCallback = function(key) { - this.flyoutButtonCallbacks_[key] = null; -}; - -/** - * Register a callback function associated with a given key, for populating - * custom toolbox categories in this workspace. See the variable and procedure - * categories as an example. - * @param {string} key The name to use to look up this function. - * @param {function(!Blockly.Workspace):!Array.} func The function to - * call when the given toolbox category is opened. - */ -Blockly.WorkspaceSvg.prototype.registerToolboxCategoryCallback = function(key, - func) { - goog.asserts.assert(goog.isFunction(func), - 'Toolbox category callbacks must be functions.'); - this.toolboxCategoryCallbacks_[key] = func; -}; - -/** - * Get the callback function associated with a given key, for populating - * custom toolbox categories in this workspace. - * @param {string} key The name to use to look up the function. - * @return {?function(!Blockly.Workspace):!Array.} The function - * corresponding to the given key for this workspace, or null if no function - * is registered. - */ -Blockly.WorkspaceSvg.prototype.getToolboxCategoryCallback = function(key) { - var result = this.toolboxCategoryCallbacks_[key]; - return result ? result : null; -}; - -/** - * Remove a callback for a click on a custom category's name in the toolbox. - * @param {string} key The name associated with the callback function. - */ -Blockly.WorkspaceSvg.prototype.removeToolboxCategoryCallback = function(key) { - this.toolboxCategoryCallbacks_[key] = null; -}; - -/** - * Look up the gesture that is tracking this touch stream on this workspace. - * May create a new gesture. - * @param {!Event} e Mouse event or touch event - * @return {Blockly.Gesture} The gesture that is tracking this touch stream, - * or null if no valid gesture exists. - * @package - */ -Blockly.WorkspaceSvg.prototype.getGesture = function(e) { - var isStart = (e.type == 'mousedown' || e.type == 'touchstart'); - - var gesture = this.currentGesture_; - if (gesture) { - if (isStart && gesture.hasStarted()) { - // That's funny. We must have missed a mouse up. - // Cancel it, rather than try to retrieve all of the state we need. - gesture.cancel(); - return null; - } - return gesture; - } - - // No gesture existed on this workspace, but this looks like the start of a - // new gesture. - if (isStart) { - this.currentGesture_ = new Blockly.Gesture(e, this); - return this.currentGesture_; - } - // No gesture existed and this event couldn't be the start of a new gesture. - return null; -}; - -/** - * Clear the reference to the current gesture. - * @package - */ -Blockly.WorkspaceSvg.prototype.clearGesture = function() { - this.currentGesture_ = null; -}; - -/** - * Cancel the current gesture, if one exists. - * @package - */ -Blockly.WorkspaceSvg.prototype.cancelCurrentGesture = function() { - if (this.currentGesture_) { - this.currentGesture_.cancel(); - } -}; - -/** - * Don't even think about using this function before talking to rachel-fenichel. - * - * Force a drag to start without clicking and dragging the block itself. Used - * to attach duplicated blocks to the mouse pointer. - * @param {!Object} fakeEvent An object with the properties needed to start a - * drag, including clientX and clientY. - * @param {!Blockly.BlockSvg} block The block to start dragging. - * @package - */ -Blockly.WorkspaceSvg.prototype.startDragWithFakeEvent = function(fakeEvent, - block) { - Blockly.Touch.clearTouchIdentifier(); - Blockly.Touch.checkTouchIdentifier(fakeEvent); - var gesture = block.workspace.getGesture(fakeEvent); - gesture.forceStartBlockDrag(fakeEvent, block); -}; - -/** - * Get the audio manager for this workspace. - * @return {Blockly.WorkspaceAudio} The audio manager for this workspace. - */ -Blockly.WorkspaceSvg.prototype.getAudioManager = function() { - return this.audioManager_; -}; - -/** - * Get the grid object for this workspace, or null if there is none. - * @return {Blockly.Grid} The grid object for this workspace. - * @package - */ -Blockly.WorkspaceSvg.prototype.getGrid = function() { - return this.grid_; -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -Blockly.WorkspaceSvg.prototype['setVisible'] = - Blockly.WorkspaceSvg.prototype.setVisible; diff --git a/packages/scratch-blocks/core/xml.js b/packages/scratch-blocks/core/xml.js deleted file mode 100644 index 1897a558d..000000000 --- a/packages/scratch-blocks/core/xml.js +++ /dev/null @@ -1,919 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview XML reader and writer. - * @author fraser@google.com (Neil Fraser) - */ -'use strict'; - -/** - * @name Blockly.Xml - * @namespace - **/ -goog.provide('Blockly.Xml'); - -goog.require('Blockly.Events.BlockCreate'); -goog.require('Blockly.Events.VarCreate'); - -goog.require('goog.asserts'); -goog.require('goog.dom'); - - -/** - * Encode a block tree as XML. - * @param {!Blockly.Workspace} workspace The workspace containing blocks. - * @param {boolean=} opt_noId True if the encoder should skip the block IDs. - * @return {!Element} XML document. - */ -Blockly.Xml.workspaceToDom = function(workspace, opt_noId) { - var xml = goog.dom.createDom('xml'); - xml.appendChild(Blockly.Xml.variablesToDom(workspace.getAllVariables())); - var comments = workspace.getTopComments(true).filter(function(topComment) { - return topComment instanceof Blockly.WorkspaceComment; - }); - for (var i = 0, comment; comment = comments[i]; i++) { - xml.appendChild(comment.toXmlWithXY(opt_noId)); - } - var blocks = workspace.getTopBlocks(true); - for (var i = 0, block; block = blocks[i]; i++) { - xml.appendChild(Blockly.Xml.blockToDomWithXY(block, opt_noId)); - } - return xml; -}; - -/** - * Encode a list of variables as XML. - * @param {!Array.} variableList List of all variable - * models. - * @return {!Element} List of XML elements. - */ -Blockly.Xml.variablesToDom = function(variableList) { - var variables = goog.dom.createDom('variables'); - for (var i = 0, variable; variable = variableList[i]; i++) { - var element = goog.dom.createDom('variable', null, variable.name); - element.setAttribute('type', variable.type); - element.setAttribute('id', variable.getId()); - element.setAttribute('islocal', variable.isLocal); - element.setAttribute('isCloud', variable.isCloud); - variables.appendChild(element); - } - return variables; -}; - -/** - * Encode a block subtree as XML with XY coordinates. - * @param {!Blockly.Block} block The root block to encode. - * @param {boolean=} opt_noId True if the encoder should skip the block ID. - * @return {!Element} Tree of XML elements. - */ -Blockly.Xml.blockToDomWithXY = function(block, opt_noId) { - var width; // Not used in LTR. - if (block.workspace.RTL) { - width = block.workspace.getWidth(); - } - var element = Blockly.Xml.blockToDom(block, opt_noId); - var xy = block.getRelativeToSurfaceXY(); - element.setAttribute('x', - Math.round(block.workspace.RTL ? width - xy.x : xy.x)); - element.setAttribute('y', Math.round(xy.y)); - return element; -}; - -/** - * Encode a variable field as XML. - * @param {!Blockly.FieldVariable} field The field to encode. - * @return {?Element} XML element, or null if the field did not need to be - * serialized. - * @private - */ -Blockly.Xml.fieldToDomVariable_ = function(field) { - var id = field.getValue(); - // The field had not been initialized fully before being serialized. - // This can happen if a block is created directly through a call to - // workspace.newBlock instead of from XML. - // The new block will be serialized for the first time when firing a block - // creation event. - if (id == null) { - field.initModel(); - id = field.getValue(); - } - // Get the variable directly from the field, instead of doing a lookup. This - // will work even if the variable has already been deleted. This can happen - // because the flyout defers deleting blocks until the next time the flyout is - // opened. - var variable = field.getVariable(); - - if (!variable) { - throw Error('Tried to serialize a variable field with no variable.'); - } - var container = goog.dom.createDom('field', null, variable.name); - container.setAttribute('name', field.name); - container.setAttribute('id', variable.getId()); - container.setAttribute('variabletype', variable.type); - return container; -}; - -/** - * Encode a field as XML. - * @param {!Blockly.Field} field The field to encode. - * @param {!Blockly.Workspace} workspace The workspace that the field is in. - * @return {?Element} XML element, or null if the field did not need to be - * serialized. - * @private - */ -Blockly.Xml.fieldToDom_ = function(field) { - if (field.name && field.SERIALIZABLE) { - if (field.referencesVariables()) { - return Blockly.Xml.fieldToDomVariable_(field); - } else { - var container = goog.dom.createDom('field', null, field.getValue()); - container.setAttribute('name', field.name); - return container; - } - } - return null; -}; - -/** - * Encode all of a block's fields as XML and attach them to the given tree of - * XML elements. - * @param {!Blockly.Block} block A block with fields to be encoded. - * @param {!Element} element The XML element to which the field DOM should be - * attached. - * @private - */ -Blockly.Xml.allFieldsToDom_ = function(block, element) { - for (var i = 0, input; input = block.inputList[i]; i++) { - for (var j = 0, field; field = input.fieldRow[j]; j++) { - var fieldDom = Blockly.Xml.fieldToDom_(field); - if (fieldDom) { - element.appendChild(fieldDom); - } - } - } -}; - -/** - * Encode a block subtree as XML. - * @param {!Blockly.Block} block The root block to encode. - * @param {boolean=} opt_noId True if the encoder should skip the block ID. - * @return {!Element} Tree of XML elements. - */ -Blockly.Xml.blockToDom = function(block, opt_noId) { - var element = goog.dom.createDom(block.isShadow() ? 'shadow' : 'block'); - element.setAttribute('type', block.type); - if (!opt_noId) { - element.setAttribute('id', block.id); - } - if (block.mutationToDom) { - // Custom data for an advanced block. - var mutation = block.mutationToDom(); - if (mutation && (mutation.hasChildNodes() || mutation.hasAttributes())) { - element.appendChild(mutation); - } - } - - Blockly.Xml.allFieldsToDom_(block, element); - - Blockly.Xml.scratchCommentToDom_(block, element); - - if (block.data) { - var dataElement = goog.dom.createDom('data', null, block.data); - element.appendChild(dataElement); - } - - for (var i = 0, input; input = block.inputList[i]; i++) { - var container; - var empty = true; - if (input.type == Blockly.DUMMY_INPUT) { - continue; - } else { - var childBlock = input.connection.targetBlock(); - if (input.type == Blockly.INPUT_VALUE) { - container = goog.dom.createDom('value'); - } else if (input.type == Blockly.NEXT_STATEMENT) { - container = goog.dom.createDom('statement'); - } - var shadow = input.connection.getShadowDom(); - if (shadow && (!childBlock || !childBlock.isShadow())) { - var shadowClone = Blockly.Xml.cloneShadow_(shadow); - // Remove the ID from the shadow dom clone if opt_noId - // is specified to true. - if (opt_noId && shadowClone.getAttribute('id')) { - shadowClone.removeAttribute('id'); - } - container.appendChild(shadowClone); - } - if (childBlock) { - container.appendChild(Blockly.Xml.blockToDom(childBlock, opt_noId)); - empty = false; - } - } - container.setAttribute('name', input.name); - if (!empty) { - element.appendChild(container); - } - } - if (block.inputsInlineDefault != block.inputsInline) { - element.setAttribute('inline', block.inputsInline); - } - if (block.isCollapsed()) { - element.setAttribute('collapsed', true); - } - if (block.disabled) { - element.setAttribute('disabled', true); - } - if (!block.isDeletable() && !block.isShadow()) { - element.setAttribute('deletable', false); - } - if (!block.isMovable() && !block.isShadow()) { - element.setAttribute('movable', false); - } - if (!block.isEditable()) { - element.setAttribute('editable', false); - } - - var nextBlock = block.getNextBlock(); - if (nextBlock) { - var container = goog.dom.createDom('next', null, - Blockly.Xml.blockToDom(nextBlock, opt_noId)); - element.appendChild(container); - } - var shadow = block.nextConnection && block.nextConnection.getShadowDom(); - if (shadow && (!nextBlock || !nextBlock.isShadow())) { - container.appendChild(Blockly.Xml.cloneShadow_(shadow)); - } - - return element; -}; - -/** - * Encode a ScratchBlockComment as XML. - * @param {!Blockly.ScratchBlockComment} block The block possibly containing - * a comment to encode. - * @param {!Element} element The XML element to which the comment should - * encoding should be attached. - * @private - */ -Blockly.Xml.scratchCommentToDom_ = function(block, element) { - var commentText = block.getCommentText(); - if (commentText) { - var commentElement = goog.dom.createDom('comment', null, commentText); - if (typeof block.comment == 'object') { - commentElement.setAttribute('id', block.comment.id); - commentElement.setAttribute('pinned', block.comment.isVisible()); - var hw; - if (block.comment instanceof Blockly.ScratchBlockComment) { - hw = block.comment.getHeightWidth(); - } else { - hw = block.comment.getBubbleSize(); - } - commentElement.setAttribute('h', hw.height); - commentElement.setAttribute('w', hw.width); - var xy = block.comment.getXY(); - commentElement.setAttribute('x', - Math.round(block.workspace.RTL ? block.workspace.getWidth() - xy.x - hw.width : - xy.x)); - commentElement.setAttribute('y', xy.y); - commentElement.setAttribute('minimized', block.comment.isMinimized()); - - } - element.appendChild(commentElement); - } -}; - -/** - * Deeply clone the shadow's DOM so that changes don't back-wash to the block. - * @param {!Element} shadow A tree of XML elements. - * @return {!Element} A tree of XML elements. - * @private - */ -Blockly.Xml.cloneShadow_ = function(shadow) { - shadow = shadow.cloneNode(true); - // Walk the tree looking for whitespace. Don't prune whitespace in a tag. - var node = shadow; - var textNode; - while (node) { - if (node.firstChild) { - node = node.firstChild; - } else { - while (node && !node.nextSibling) { - textNode = node; - node = node.parentNode; - if (textNode.nodeType == 3 && textNode.data.trim() == '' && - node.firstChild != textNode) { - // Prune whitespace after a tag. - goog.dom.removeNode(textNode); - } - } - if (node) { - textNode = node; - node = node.nextSibling; - if (textNode.nodeType == 3 && textNode.data.trim() == '') { - // Prune whitespace before a tag. - goog.dom.removeNode(textNode); - } - } - } - } - return shadow; -}; - -/** - * Converts a DOM structure into plain text. - * Currently the text format is fairly ugly: all one line with no whitespace. - * @param {!Element} dom A tree of XML elements. - * @return {string} Text representation. - */ -Blockly.Xml.domToText = function(dom) { - var oSerializer = new XMLSerializer(); - return oSerializer.serializeToString(dom); -}; - -/** - * Converts a DOM structure into properly indented text. - * @param {!Element} dom A tree of XML elements. - * @return {string} Text representation. - */ -Blockly.Xml.domToPrettyText = function(dom) { - // This function is not guaranteed to be correct for all XML. - // But it handles the XML that Blockly generates. - var blob = Blockly.Xml.domToText(dom); - // Place every open and close tag on its own line. - var lines = blob.split('<'); - // Indent every line. - var indent = ''; - for (var i = 1; i < lines.length; i++) { - var line = lines[i]; - if (line[0] == '/') { - indent = indent.substring(2); - } - lines[i] = indent + '<' + line; - if (line[0] != '/' && line.slice(-2) != '/>') { - indent += ' '; - } - } - // Pull simple tags back together. - // E.g. - var text = lines.join('\n'); - text = text.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g, '$1'); - // Trim leading blank line. - return text.replace(/^\n/, ''); -}; - -/** - * Converts plain text into a DOM structure. - * Throws an error if XML doesn't parse. - * @param {string} text Text representation. - * @return {!Element} A tree of XML elements. - */ -Blockly.Xml.textToDom = function(text) { - var oParser = new DOMParser(); - var dom = oParser.parseFromString(text, 'text/xml'); - // The DOM should have one and only one top-level node, an XML tag. - if (!dom || !dom.firstChild || - dom.firstChild.nodeName.toLowerCase() != 'xml' || - dom.firstChild !== dom.lastChild) { - // Whatever we got back from the parser is not XML. - goog.asserts.fail('Blockly.Xml.textToDom did not obtain a valid XML tree.'); - } - return dom.firstChild; -}; - -/** - * Clear the given workspace then decode an XML DOM and - * create blocks on the workspace. - * @param {!Element} xml XML DOM. - * @param {!Blockly.Workspace} workspace The workspace. - * @return {Array.} An array containing new block ids. - */ -Blockly.Xml.clearWorkspaceAndLoadFromXml = function(xml, workspace) { - workspace.setResizesEnabled(false); - workspace.setToolboxRefreshEnabled(false); - workspace.clear(); - var blockIds = Blockly.Xml.domToWorkspace(xml, workspace); - workspace.setResizesEnabled(true); - workspace.setToolboxRefreshEnabled(true); - return blockIds; -}; - -/** - * Decode an XML DOM and create blocks on the workspace. - * @param {!Element} xml XML DOM. - * @param {!Blockly.Workspace} workspace The workspace. - * @return {Array.} An array containing new block IDs. - */ -Blockly.Xml.domToWorkspace = function(xml, workspace) { - if (xml instanceof Blockly.Workspace) { - var swap = xml; - xml = workspace; - workspace = swap; - console.warn('Deprecated call to Blockly.Xml.domToWorkspace, ' + - 'swap the arguments.'); - } - var width; // Not used in LTR. - if (workspace.RTL) { - width = workspace.getWidth(); - } - var newBlockIds = []; // A list of block IDs added by this call. - Blockly.Field.startCache(); - // Safari 7.1.3 is known to provide node lists with extra references to - // children beyond the lists' length. Trust the length, do not use the - // looping pattern of checking the index for an object. - var childCount = xml.childNodes.length; - var existingGroup = Blockly.Events.getGroup(); - if (!existingGroup) { - Blockly.Events.setGroup(true); - } - - // Disable workspace resizes as an optimization. - if (workspace.setResizesEnabled) { - workspace.setResizesEnabled(false); - } - var variablesFirst = true; - try { - for (var i = 0; i < childCount; i++) { - var xmlChild = xml.childNodes[i]; - var name = xmlChild.nodeName.toLowerCase(); - if (name == 'block' || - (name == 'shadow' && !Blockly.Events.recordUndo)) { - // Allow top-level shadow blocks if recordUndo is disabled since - // that means an undo is in progress. Such a block is expected - // to be moved to a nested destination in the next operation. - var block = Blockly.Xml.domToBlock(xmlChild, workspace); - newBlockIds.push(block.id); - var blockX = xmlChild.hasAttribute('x') ? - parseInt(xmlChild.getAttribute('x'), 10) : 10; - var blockY = xmlChild.hasAttribute('y') ? - parseInt(xmlChild.getAttribute('y'), 10) : 10; - if (!isNaN(blockX) && !isNaN(blockY)) { - block.moveBy(workspace.RTL ? width - blockX : blockX, blockY); - if (block.comment && typeof block.comment === 'object') { - var commentXY = block.comment.getXY(); - var commentWidth = block.comment.getBubbleSize().width; - block.comment.moveTo(block.workspace.RTL ? width - commentXY.x - commentWidth : commentXY.x, commentXY.y); - } - } - variablesFirst = false; - } else if (name == 'shadow') { - goog.asserts.fail('Shadow block cannot be a top-level block.'); - variablesFirst = false; - } else if (name == 'comment') { - if (workspace.rendered) { - Blockly.WorkspaceCommentSvg.fromXml(xmlChild, workspace, width); - } else { - Blockly.WorkspaceComment.fromXml(xmlChild, workspace); - } - } else if (name == 'variables') { - if (variablesFirst) { - Blockly.Xml.domToVariables(xmlChild, workspace); - } else { - throw Error('\'variables\' tag must exist once before block and ' + - 'shadow tag elements in the workspace XML, but it was found in ' + - 'another location.'); - } - variablesFirst = false; - } - } - } finally { - if (!existingGroup) { - Blockly.Events.setGroup(false); - } - Blockly.Field.stopCache(); - } - // Re-enable workspace resizing. - if (workspace.setResizesEnabled) { - workspace.setResizesEnabled(true); - } - return newBlockIds; -}; - -/** - * Decode an XML DOM and create blocks on the workspace. Position the new - * blocks immediately below prior blocks, aligned by their starting edge. - * @param {!Element} xml The XML DOM. - * @param {!Blockly.Workspace} workspace The workspace to add to. - * @return {Array.} An array containing new block IDs. - */ -Blockly.Xml.appendDomToWorkspace = function(xml, workspace) { - var bbox; // Bounding box of the current blocks. - // First check if we have a workspaceSvg, otherwise the blocks have no shape - // and the position does not matter. - if (workspace.hasOwnProperty('scale')) { - var savetab = Blockly.BlockSvg.TAB_WIDTH; - try { - Blockly.BlockSvg.TAB_WIDTH = 0; - bbox = workspace.getBlocksBoundingBox(); - } finally { - Blockly.BlockSvg.TAB_WIDTH = savetab; - } - } - // Load the new blocks into the workspace and get the IDs of the new blocks. - var newBlockIds = Blockly.Xml.domToWorkspace(xml,workspace); - if (bbox && bbox.height) { // check if any previous block - var offsetY = 0; // offset to add to y of the new block - var offsetX = 0; - var farY = bbox.y + bbox.height; //bottom position - var topX = bbox.x; // x of bounding box - // check position of the new blocks - var newX = Infinity; // x of top corner - var newY = Infinity; // y of top corner - for (var i = 0; i < newBlockIds.length; i++) { - var blockXY = workspace.getBlockById(newBlockIds[i]).getRelativeToSurfaceXY(); - if (blockXY.y < newY) { - newY = blockXY.y; - } - if (blockXY.x < newX) { //if we align also on x - newX = blockXY.x; - } - } - offsetY = farY - newY + Blockly.BlockSvg.SEP_SPACE_Y; - offsetX = topX - newX; - // move the new blocks to append them at the bottom - var width; // Not used in LTR. - if (workspace.RTL) { - width = workspace.getWidth(); - } - for (var i = 0; i < newBlockIds.length; i++) { - var block = workspace.getBlockById(newBlockIds[i]); - block.moveBy(workspace.RTL ? width - offsetX : offsetX, offsetY); - } - } - return newBlockIds; -}; - -/** - * Decode an XML block tag and create a block (and possibly sub blocks) on the - * workspace. - * @param {!Element} xmlBlock XML block element. - * @param {!Blockly.Workspace} workspace The workspace. - * @return {!Blockly.Block} The root block created. - */ -Blockly.Xml.domToBlock = function(xmlBlock, workspace) { - if (xmlBlock instanceof Blockly.Workspace) { - var swap = xmlBlock; - xmlBlock = workspace; - workspace = swap; - console.warn('Deprecated call to Blockly.Xml.domToBlock, ' + - 'swap the arguments.'); - } - // Create top-level block. - Blockly.Events.disable(); - var variablesBeforeCreation = workspace.getAllVariables(); - try { - var topBlock = Blockly.Xml.domToBlockHeadless_(xmlBlock, workspace); - // Generate list of all blocks. - var blocks = topBlock.getDescendants(false); - if (workspace.rendered) { - // Hide connections to speed up assembly. - topBlock.setConnectionsHidden(true); - // Render each block. - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].initSvg(); - } - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].render(false); - } - // Populating the connection database may be deferred until after the - // blocks have rendered. - if (!workspace.isFlyout) { - setTimeout(function() { - if (topBlock.workspace) { // Check that the block hasn't been deleted. - topBlock.setConnectionsHidden(false); - } - }, 1); - } - topBlock.updateDisabled(); - // Allow the scrollbars to resize and move based on the new contents. - // TODO(@picklesrus): #387. Remove when domToBlock avoids resizing. - workspace.resizeContents(); - } else { - for (var i = blocks.length - 1; i >= 0; i--) { - blocks[i].initModel(); - } - } - } finally { - Blockly.Events.enable(); - } - if (Blockly.Events.isEnabled()) { - var newVariables = Blockly.Variables.getAddedVariables(workspace, - variablesBeforeCreation); - // Fire a VarCreate event for each (if any) new variable created. - for (var i = 0; i < newVariables.length; i++) { - var thisVariable = newVariables[i]; - Blockly.Events.fire(new Blockly.Events.VarCreate(thisVariable)); - } - // Block events come after var events, in case they refer to newly created - // variables. - Blockly.Events.fire(new Blockly.Events.BlockCreate(topBlock)); - } - return topBlock; -}; - -/** - * Decode an XML list of variables and add the variables to the workspace. - * @param {!Element} xmlVariables List of XML variable elements. - * @param {!Blockly.Workspace} workspace The workspace to which the variable - * should be added. - */ -Blockly.Xml.domToVariables = function(xmlVariables, workspace) { - for (var i = 0, xmlChild; xmlChild = xmlVariables.children[i]; i++) { - var type = xmlChild.getAttribute('type'); - var id = xmlChild.getAttribute('id'); - var isLocal = xmlChild.getAttribute('islocal') == 'true'; - var isCloud = xmlChild.getAttribute('iscloud') == 'true'; - var name = xmlChild.textContent; - - if (typeof(type) === undefined || type === null) { - throw Error('Variable with id, ' + id + ' is without a type'); - } - workspace.createVariable(name, type, id, isLocal, isCloud); - } -}; - -/** - * Decode an XML block tag and create a block (and possibly sub blocks) on the - * workspace. - * @param {!Element} xmlBlock XML block element. - * @param {!Blockly.Workspace} workspace The workspace. - * @return {!Blockly.Block} The root block created. - * @private - */ -Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) { - var block = null; - var prototypeName = xmlBlock.getAttribute('type'); - goog.asserts.assert( - prototypeName, 'Block type unspecified: %s', xmlBlock.outerHTML); - var id = xmlBlock.getAttribute('id'); - block = workspace.newBlock(prototypeName, id); - - var blockChild = null; - for (var i = 0, xmlChild; xmlChild = xmlBlock.childNodes[i]; i++) { - if (xmlChild.nodeType == 3) { - // Ignore any text at the level. It's all whitespace anyway. - continue; - } - var input; - - // Find any enclosed blocks or shadows in this tag. - var childBlockElement = null; - var childShadowElement = null; - for (var j = 0, grandchild; grandchild = xmlChild.childNodes[j]; j++) { - if (grandchild.nodeType == 1) { - if (grandchild.nodeName.toLowerCase() == 'block') { - childBlockElement = /** @type {!Element} */ (grandchild); - } else if (grandchild.nodeName.toLowerCase() == 'shadow') { - childShadowElement = /** @type {!Element} */ (grandchild); - } - } - } - // Use the shadow block if there is no child block. - if (!childBlockElement && childShadowElement) { - childBlockElement = childShadowElement; - } - - var name = xmlChild.getAttribute('name'); - switch (xmlChild.nodeName.toLowerCase()) { - case 'mutation': - // Custom data for an advanced block. - if (block.domToMutation) { - block.domToMutation(xmlChild); - if (block.initSvg) { - // Mutation may have added some elements that need initializing. - block.initSvg(); - } - } - break; - case 'comment': - var commentId = xmlChild.getAttribute('id'); - var bubbleX = parseInt(xmlChild.getAttribute('x'), 10); - var bubbleY = parseInt(xmlChild.getAttribute('y'), 10); - var minimized = xmlChild.getAttribute('minimized') || false; - - // Note bubbleX and bubbleY can be NaN, but the ScratchBlockComment - // constructor will handle that. - block.setCommentText(xmlChild.textContent, commentId, bubbleX, bubbleY, - minimized == 'true'); - - var visible = xmlChild.getAttribute('pinned'); - if (visible && !block.isInFlyout) { - // Give the renderer a millisecond to render and position the block - // before positioning the comment bubble. - setTimeout(function() { - if (block.comment && block.comment.setVisible) { - block.comment.setVisible(visible == 'true'); - } - }, 1); - } - var bubbleW = parseInt(xmlChild.getAttribute('w'), 10); - var bubbleH = parseInt(xmlChild.getAttribute('h'), 10); - if (!isNaN(bubbleW) && !isNaN(bubbleH) && - block.comment && block.comment.setVisible) { - if (block.comment instanceof Blockly.ScratchBlockComment) { - block.comment.setSize(bubbleW, bubbleH); - } else { - block.comment.setBubbleSize(bubbleW, bubbleH); - } - } - break; - case 'data': - block.data = xmlChild.textContent; - break; - case 'title': - // Titles were renamed to field in December 2013. - // Fall through. - case 'field': - Blockly.Xml.domToField_(block, name, xmlChild); - break; - case 'value': - case 'statement': - input = block.getInput(name); - if (!input) { - console.warn('Ignoring non-existent input ' + name + ' in block ' + - prototypeName); - break; - } - if (childShadowElement) { - input.connection.setShadowDom(childShadowElement); - } - if (childBlockElement) { - blockChild = Blockly.Xml.domToBlockHeadless_(childBlockElement, - workspace); - if (blockChild.outputConnection) { - input.connection.connect(blockChild.outputConnection); - } else if (blockChild.previousConnection) { - input.connection.connect(blockChild.previousConnection); - } else { - goog.asserts.fail( - 'Child block does not have output or previous statement.'); - } - } - break; - case 'next': - if (childShadowElement && block.nextConnection) { - block.nextConnection.setShadowDom(childShadowElement); - } - if (childBlockElement) { - goog.asserts.assert(block.nextConnection, - 'Next statement does not exist.'); - // If there is more than one XML 'next' tag. - goog.asserts.assert(!block.nextConnection.isConnected(), - 'Next statement is already connected.'); - blockChild = Blockly.Xml.domToBlockHeadless_(childBlockElement, - workspace); - goog.asserts.assert(blockChild.previousConnection, - 'Next block does not have previous statement.'); - block.nextConnection.connect(blockChild.previousConnection); - } - break; - default: - // Unknown tag; ignore. Same principle as HTML parsers. - console.warn('Ignoring unknown tag: ' + xmlChild.nodeName); - } - } - - var inline = xmlBlock.getAttribute('inline'); - if (inline) { - block.setInputsInline(inline == 'true'); - } - var disabled = xmlBlock.getAttribute('disabled'); - if (disabled) { - block.setDisabled(disabled == 'true' || disabled == 'disabled'); - } - var deletable = xmlBlock.getAttribute('deletable'); - if (deletable) { - block.setDeletable(deletable == 'true'); - } - var movable = xmlBlock.getAttribute('movable'); - if (movable) { - block.setMovable(movable == 'true'); - } - var editable = xmlBlock.getAttribute('editable'); - if (editable) { - block.setEditable(editable == 'true'); - } - var collapsed = xmlBlock.getAttribute('collapsed'); - if (collapsed) { - block.setCollapsed(collapsed == 'true'); - } - if (xmlBlock.nodeName.toLowerCase() == 'shadow') { - // Ensure all children are also shadows. - var children = block.getChildren(false); - for (var i = 0, child; child = children[i]; i++) { - goog.asserts.assert( - child.isShadow(), 'Shadow block not allowed non-shadow child.'); - } - block.setShadow(true); - } - return block; -}; - -/** - * Decode an XML variable field tag and set the value of that field. - * @param {!Blockly.Workspace} workspace The workspace that is currently being - * deserialized. - * @param {!Element} xml The field tag to decode. - * @param {string} text The text content of the XML tag. - * @param {!Blockly.FieldVariable} field The field on which the value will be - * set. - * @private - */ -Blockly.Xml.domToFieldVariable_ = function(workspace, xml, text, field) { - var type = xml.getAttribute('variabletype') || ''; - // TODO (fenichel): Does this need to be explicit or not? - if (type == '\'\'') { - type = ''; - } - - var variable; - // This check ensures that there is not both a potential variable and a real - // variable with the same name and type. - if (!workspace.getPotentialVariableMap() && !workspace.isFlyout && - workspace.getFlyout()) { - var flyoutWs = workspace.getFlyout().getWorkspace(); - variable = Blockly.Variables.realizePotentialVar(text, type, flyoutWs, true); - } - if (!variable) { - variable = Blockly.Variables.getOrCreateVariablePackage(workspace, xml.id, - text, type); - } - - // This should never happen :) - if (type != null && type !== variable.type) { - throw Error('Serialized variable type with id \'' + - variable.getId() + '\' had type ' + variable.type + ', and ' + - 'does not match variable field that references it: ' + - Blockly.Xml.domToText(xml) + '.'); - } - - field.setValue(variable.getId()); -}; - -/** - * Decode an XML field tag and set the value of that field on the given block. - * @param {!Blockly.Block} block The block that is currently being deserialized. - * @param {string} fieldName The name of the field on the block. - * @param {!Element} xml The field tag to decode. - * @private - */ -Blockly.Xml.domToField_ = function(block, fieldName, xml) { - var field = block.getField(fieldName); - if (!field) { - console.warn('Ignoring non-existent field ' + fieldName + ' in block ' + - block.type); - return; - } - - var workspace = block.workspace; - var text = xml.textContent; - if (field.referencesVariables()) { - Blockly.Xml.domToFieldVariable_(workspace, xml, text, field); - } else { - field.setValue(text); - } -}; - -/** - * Remove any 'next' block (statements in a stack). - * @param {!Element} xmlBlock XML block element. - */ -Blockly.Xml.deleteNext = function(xmlBlock) { - for (var i = 0, child; child = xmlBlock.childNodes[i]; i++) { - if (child.nodeName.toLowerCase() == 'next') { - xmlBlock.removeChild(child); - break; - } - } -}; - -// Export symbols that would otherwise be renamed by Closure compiler. -if (!goog.global['Blockly']) { - goog.global['Blockly'] = {}; -} -if (!goog.global['Blockly']['Xml']) { - goog.global['Blockly']['Xml'] = {}; -} -goog.global['Blockly']['Xml']['domToText'] = Blockly.Xml.domToText; -goog.global['Blockly']['Xml']['domToWorkspace'] = Blockly.Xml.domToWorkspace; -goog.global['Blockly']['Xml']['textToDom'] = Blockly.Xml.textToDom; -goog.global['Blockly']['Xml']['workspaceToDom'] = Blockly.Xml.workspaceToDom; -goog.global['Blockly']['Xml']['clearWorkspaceAndLoadFromXml'] = - Blockly.Xml.clearWorkspaceAndLoadFromXml; diff --git a/packages/scratch-blocks/core/zoom_controls.js b/packages/scratch-blocks/core/zoom_controls.js deleted file mode 100644 index 3f8f1ab76..000000000 --- a/packages/scratch-blocks/core/zoom_controls.js +++ /dev/null @@ -1,301 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Object representing a zoom icons. - * @author carloslfu@gmail.com (Carlos Galarza) - */ -'use strict'; - -goog.provide('Blockly.ZoomControls'); - -goog.require('Blockly.Touch'); -goog.require('goog.dom'); - - -/** - * Class for a zoom controls. - * @param {!Blockly.Workspace} workspace The workspace to sit in. - * @constructor - */ -Blockly.ZoomControls = function(workspace) { - this.workspace_ = workspace; -}; - -/** - * Zoom in icon path. - * @type {string} - * @private - */ -Blockly.ZoomControls.prototype.ZOOM_IN_PATH_ = 'zoom-in.svg'; - -/** - * Zoom out icon path. - * @type {string} - * @private - */ -Blockly.ZoomControls.prototype.ZOOM_OUT_PATH_ = 'zoom-out.svg'; - -/** - * Zoom reset icon path. - * @type {string} - * @private - */ -Blockly.ZoomControls.prototype.ZOOM_RESET_PATH_ = 'zoom-reset.svg'; - -/** - * Width of the zoom controls. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.WIDTH_ = 36; - -/** - * Height of the zoom controls. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.HEIGHT_ = 124; - -/** - * Distance between each zoom control. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.MARGIN_BETWEEN_ = 8; - -/** - * Distance between zoom controls and bottom edge of workspace. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.MARGIN_BOTTOM_ = 12; - -/** - * Distance between zoom controls and right edge of workspace. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.MARGIN_SIDE_ = 12; - -/** - * The SVG group containing the zoom controls. - * @type {Element} - * @private - */ -Blockly.ZoomControls.prototype.svgGroup_ = null; - -/** - * Left coordinate of the zoom controls. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.left_ = 0; - -/** - * Top coordinate of the zoom controls. - * @type {number} - * @private - */ -Blockly.ZoomControls.prototype.top_ = 0; - -/** - * Create the zoom controls. - * @return {!Element} The zoom controls SVG group. - */ -Blockly.ZoomControls.prototype.createDom = function() { - this.svgGroup_ = - Blockly.utils.createSvgElement('g', {'class': 'blocklyZoom'}, null); - this.createZoomOutSvg_(); - this.createZoomInSvg_(); - this.createZoomResetSvg_(); - return this.svgGroup_; -}; - -/** - * Initialize the zoom controls. - * @param {number} bottom Distance from workspace bottom to bottom of controls. - * @return {number} Distance from workspace bottom to the top of controls. - */ -Blockly.ZoomControls.prototype.init = function(bottom) { - this.bottom_ = this.MARGIN_BOTTOM_ + bottom; - return this.bottom_ + this.HEIGHT_; -}; - -/** - * Dispose of this zoom controls. - * Unlink from all DOM elements to prevent memory leaks. - */ -Blockly.ZoomControls.prototype.dispose = function() { - if (this.svgGroup_) { - goog.dom.removeNode(this.svgGroup_); - this.svgGroup_ = null; - } - this.workspace_ = null; -}; - -/** - * Move the zoom controls to the bottom-right corner. - */ -Blockly.ZoomControls.prototype.position = function() { - var metrics = this.workspace_.getMetrics(); - if (!metrics) { - // There are no metrics available (workspace is probably not visible). - return; - } - if (this.workspace_.RTL) { - this.left_ = this.MARGIN_SIDE_ + Blockly.Scrollbar.scrollbarThickness; - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { - this.left_ += metrics.flyoutWidth; - if (this.workspace_.toolbox_) { - this.left_ += metrics.absoluteLeft; - } - } - } else { - this.left_ = metrics.viewWidth + metrics.absoluteLeft - - this.WIDTH_ - this.MARGIN_SIDE_ - Blockly.Scrollbar.scrollbarThickness; - - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - this.left_ -= metrics.flyoutWidth; - } - } - this.top_ = metrics.viewHeight + metrics.absoluteTop - - this.HEIGHT_ - this.bottom_; - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - this.top_ -= metrics.flyoutHeight; - } - this.svgGroup_.setAttribute('transform', - 'translate(' + this.left_ + ',' + this.top_ + ')'); -}; - -/** - * Create the zoom in icon and its event handler. - * The Scratch Blocks implementation of this function is different from the - * Blockly implementation. - * @private - */ -Blockly.ZoomControls.prototype.createZoomOutSvg_ = function() { - /* This markup will be generated and added to the "blocklyZoom" group: - - - */ - var ws = this.workspace_; - /** - * Zoom out control. - * @type {SVGElement} - */ - var zoomoutSvg = Blockly.utils.createSvgElement( - 'image', - { - 'width': this.WIDTH_, - 'height': this.WIDTH_, - 'y': (this.WIDTH_ * 1) + (this.MARGIN_BETWEEN_ * 1) - }, - this.svgGroup_ - ); - zoomoutSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - ws.options.pathToMedia + this.ZOOM_OUT_PATH_); - // Attach listener. - Blockly.bindEventWithChecks_(zoomoutSvg, 'mousedown', null, function(e) { - ws.markFocused(); - ws.zoomCenter(-1); - Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. - e.stopPropagation(); // Don't start a workspace scroll. - e.preventDefault(); // Stop double-clicking from selecting text. - }); -}; - -/** - * Create the zoom out icon and its event handler. - * The Scratch Blocks implementation of this function is different from the - * Blockly implementation. - * @private - */ -Blockly.ZoomControls.prototype.createZoomInSvg_ = function() { - /* This markup will be generated and added to the "blocklyZoom" group: - - - */ - var ws = this.workspace_; - /** - * Zoom in control. - * @type {SVGElement} - */ - var zoominSvg = Blockly.utils.createSvgElement( - 'image', - { - 'width': this.WIDTH_, - 'height': this.WIDTH_, - 'y': 0 - }, - this.svgGroup_ - ); - zoominSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - ws.options.pathToMedia + this.ZOOM_IN_PATH_); - - // Attach listener. - Blockly.bindEventWithChecks_(zoominSvg, 'mousedown', null, function(e) { - ws.markFocused(); - ws.zoomCenter(1); - Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. - e.stopPropagation(); // Don't start a workspace scroll. - e.preventDefault(); // Stop double-clicking from selecting text. - }); -}; - -/** - * Create the zoom reset icon and its event handler. - * The Scratch Blocks implementation of this function is different from the - * Blockly implementation. - * @private - */ -Blockly.ZoomControls.prototype.createZoomResetSvg_ = function() { - /* This markup will be generated and added to the "blocklyZoom" group: - - - */ - var ws = this.workspace_; - - /** - * Zoom reset control. - * @type {SVGElement} - */ - var zoomresetSvg = Blockly.utils.createSvgElement( - 'image', - { - 'width': this.WIDTH_, - 'height': this.WIDTH_, - 'y': (this.WIDTH_ * 2) + (this.MARGIN_BETWEEN_ * 2) - }, - this.svgGroup_ - ); - zoomresetSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - ws.options.pathToMedia + this.ZOOM_RESET_PATH_); - - // Attach event listeners. - Blockly.bindEventWithChecks_(zoomresetSvg, 'mousedown', null, function(e) { - ws.markFocused(); - ws.setScale(ws.options.zoomOptions.startScale); - ws.scrollCenter(); - Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. - e.stopPropagation(); // Don't start a workspace scroll. - e.preventDefault(); // Stop double-clicking from selecting text. - }); -}; diff --git a/packages/scratch-blocks/gh-pages/Gemfile b/packages/scratch-blocks/gh-pages/Gemfile deleted file mode 100644 index 7b8154d48..000000000 --- a/packages/scratch-blocks/gh-pages/Gemfile +++ /dev/null @@ -1,15 +0,0 @@ -source "https://rubygems.org" -ruby RUBY_VERSION - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve - -# This is the default theme for new Jekyll sites. You may change this to anything you like. -gem "jekyll-theme-architect" - -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -gem "github-pages", group: :jekyll_plugins diff --git a/packages/scratch-blocks/gh-pages/_config.yml b/packages/scratch-blocks/gh-pages/_config.yml deleted file mode 100644 index 93b65eaed..000000000 --- a/packages/scratch-blocks/gh-pages/_config.yml +++ /dev/null @@ -1,2 +0,0 @@ -theme: jekyll-theme-architect -show_downloads: false diff --git a/packages/scratch-blocks/gh-pages/index.md b/packages/scratch-blocks/gh-pages/index.md deleted file mode 100644 index 5ad49ebc9..000000000 --- a/packages/scratch-blocks/gh-pages/index.md +++ /dev/null @@ -1,3 +0,0 @@ -* [Vertical Playground](playgrounds/tests/vertical_playground.html) -* [Horizontal Playground](playgrounds/tests/horizontal_playground.html) -* [Multi Playground](playgrounds/tests/multi_playground.html) diff --git a/packages/scratch-blocks/i18n/common.py b/packages/scratch-blocks/i18n/common.py deleted file mode 100644 index 90e584e16..000000000 --- a/packages/scratch-blocks/i18n/common.py +++ /dev/null @@ -1,234 +0,0 @@ -#!/usr/bin/python - -# Code shared by translation conversion scripts. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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 codecs -import json -import os -from datetime import datetime - -class InputError(Exception): - """Exception raised for errors in the input. - - Attributes: - location -- where error occurred - msg -- explanation of the error - - """ - - def __init__(self, location, msg): - Exception.__init__(self, '{0}: {1}'.format(location, msg)) - self.location = location - self.msg = msg - - -def read_json_file(filename): - """Read a JSON file as UTF-8 into a dictionary, discarding @metadata. - - Args: - filename: The filename, which must end ".json". - - Returns: - The dictionary. - - Raises: - InputError: The filename did not end with ".json" or an error occurred - while opening or reading the file. - """ - if not filename.endswith('.json'): - raise InputError(filename, 'filenames must end with ".json"') - try: - # Read in file. - with codecs.open(filename, 'r', 'utf-8') as infile: - defs = json.load(infile) - if '@metadata' in defs: - del defs['@metadata'] - return defs - except ValueError, e: - print('Error reading ' + filename) - raise InputError(filename, str(e)) - - -def _create_qqq_file(output_dir): - """Creates a qqq.json file with message documentation for translatewiki.net. - - The file consists of key-value pairs, where the keys are message ids and - the values are descriptions for the translators of the messages. - What documentation exists for the format can be found at: - http://translatewiki.net/wiki/Translating:Localisation_for_developers#Message_documentation - - The file should be closed by _close_qqq_file(). - - Parameters: - output_dir: The output directory. - - Returns: - A pointer to a file to which a left brace and newline have been written. - - Raises: - IOError: An error occurred while opening or writing the file. - """ - qqq_file_name = os.path.join(os.curdir, output_dir, 'qqq.json') - qqq_file = codecs.open(qqq_file_name, 'w', 'utf-8') - print 'Created file: ' + qqq_file_name - qqq_file.write('{\n') - return qqq_file - - -def _close_qqq_file(qqq_file): - """Closes a qqq.json file created and opened by _create_qqq_file(). - - This writes the final newlines and right brace. - - Args: - qqq_file: A file created by _create_qqq_file(). - - Raises: - IOError: An error occurred while writing to or closing the file. - """ - qqq_file.write('\n}\n') - qqq_file.close() - - -def _create_lang_file(author, lang, output_dir): - """Creates a .json file for translatewiki.net. - - The file consists of metadata, followed by key-value pairs, where the keys - are message ids and the values are the messages in the language specified - by the corresponding command-line argument. The file should be closed by - _close_lang_file(). - - Args: - author: Name and email address of contact for translators. - lang: ISO 639-1 source language code. - output_dir: Relative directory for output files. - - Returns: - A pointer to a file to which the metadata has been written. - - Raises: - IOError: An error occurred while opening or writing the file. - """ - lang_file_name = os.path.join(os.curdir, output_dir, lang + '.json') - lang_file = codecs.open(lang_file_name, 'w', 'utf-8') - print 'Created file: ' + lang_file_name - # string.format doesn't like printing braces, so break up our writes. - lang_file.write('{\n\t"@metadata": {') - lang_file.write(""" -\t\t"author": "{0}", -\t\t"lastupdated": "{1}", -\t\t"locale": "{2}", -\t\t"messagedocumentation" : "qqq" -""".format(author, str(datetime.now()), lang)) - lang_file.write('\t},\n') - return lang_file - - -def _close_lang_file(lang_file): - """Closes a .json file created with _create_lang_file(). - - This also writes the terminating left brace and newline. - - Args: - lang_file: A file opened with _create_lang_file(). - - Raises: - IOError: An error occurred while writing to or closing the file. - """ - lang_file.write('\n}\n') - lang_file.close() - - -def _create_key_file(output_dir): - """Creates a keys.json file mapping Closure keys to Blockly keys. - - Args: - output_dir: Relative directory for output files. - - Raises: - IOError: An error occurred while creating the file. - """ - key_file_name = os.path.join(os.curdir, output_dir, 'keys.json') - key_file = open(key_file_name, 'w') - key_file.write('{\n') - print 'Created file: ' + key_file_name - return key_file - - -def _close_key_file(key_file): - """Closes a key file created and opened with _create_key_file(). - - Args: - key_file: A file created by _create_key_file(). - - Raises: - IOError: An error occurred while writing to or closing the file. - """ - key_file.write('\n}\n') - key_file.close() - - -def write_files(author, lang, output_dir, units, write_key_file): - """Writes the output files for the given units. - - There are three possible output files: - * lang_file: JSON file mapping meanings (e.g., Maze.turnLeft) to the - English text. The base name of the language file is specified by the - "lang" command-line argument. - * key_file: JSON file mapping meanings to Soy-generated keys (long hash - codes). This is only output if the parameter write_key_file is True. - * qqq_file: JSON file mapping meanings to descriptions. - - Args: - author: Name and email address of contact for translators. - lang: ISO 639-1 source language code. - output_dir: Relative directory for output files. - units: A list of dictionaries with entries for 'meaning', 'source', - 'description', and 'keys' (the last only if write_key_file is true), - in the order desired in the output files. - write_key_file: Whether to output a keys.json file. - - Raises: - IOError: An error occurs opening, writing to, or closing a file. - KeyError: An expected key is missing from units. - """ - lang_file = _create_lang_file(author, lang, output_dir) - qqq_file = _create_qqq_file(output_dir) - if write_key_file: - key_file = _create_key_file(output_dir) - first_entry = True - for unit in units: - if not first_entry: - lang_file.write(',\n') - if write_key_file: - key_file.write(',\n') - qqq_file.write(',\n') - lang_file.write(u'\t"{0}": "{1}"'.format( - unit['meaning'], - unit['source'].replace('"', "'"))) - if write_key_file: - key_file.write('"{0}": "{1}"'.format(unit['meaning'], unit['key'])) - qqq_file.write(u'\t"{0}": "{1}"'.format( - unit['meaning'], - unit['description'].replace('"', "'").replace( - '{lb}', '{').replace('{rb}', '}'))) - first_entry = False - _close_lang_file(lang_file) - if write_key_file: - _close_key_file(key_file) - _close_qqq_file(qqq_file) diff --git a/packages/scratch-blocks/i18n/create_messages.py b/packages/scratch-blocks/i18n/create_messages.py deleted file mode 100755 index dc2620a31..000000000 --- a/packages/scratch-blocks/i18n/create_messages.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/python - -# Generate .js files defining Blockly core and language messages. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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 argparse -import codecs -import os -import re -import sys -from common import read_json_file - - -_NEWLINE_PATTERN = re.compile('[\n\r]') - - -def string_is_ascii(s): - try: - s.decode('ascii') - return True - except UnicodeEncodeError: - return False - -def load_constants(filename): - """Read in constants file, which must be output in every language.""" - constant_defs = read_json_file(filename); - constants_text = '\n' - for key in constant_defs: - value = constant_defs[key] - value = value.replace('"', '\\"') - constants_text += '\nBlockly.Msg["{0}"] = "{1}";'.format(key, value) - return constants_text - -def main(): - """Generate .js files defining Blockly core and language messages.""" - - # Process command-line arguments. - parser = argparse.ArgumentParser(description='Convert JSON files to JS.') - parser.add_argument('--source_lang', default='en', - help='ISO 639-1 source language code') - parser.add_argument('--source_lang_file', - default=os.path.join('json', 'en.json'), - help='Path to .json file for source language') - parser.add_argument('--source_synonym_file', - default=os.path.join('json', 'synonyms.json'), - help='Path to .json file with synonym definitions') - parser.add_argument('--source_constants_file', - default=os.path.join('json', 'constants.json'), - help='Path to .json file with constant definitions') - parser.add_argument('--output_dir', default='js/', - help='relative directory for output files') - parser.add_argument('--key_file', default='keys.json', - help='relative path to input keys file') - parser.add_argument('--quiet', action='store_true', default=False, - help='do not write anything to standard output') - parser.add_argument('files', nargs='+', help='input files') - args = parser.parse_args() - if not args.output_dir.endswith(os.path.sep): - args.output_dir += os.path.sep - - # Read in source language .json file, which provides any values missing - # in target languages' .json files. - source_defs = read_json_file(os.path.join(os.curdir, args.source_lang_file)) - # Make sure the source file doesn't contain a newline or carriage return. - for key, value in source_defs.items(): - if _NEWLINE_PATTERN.search(value): - print('ERROR: definition of {0} in {1} contained a newline character.'. - format(key, args.source_lang_file)) - sys.exit(1) - sorted_keys = source_defs.keys() - sorted_keys.sort() - - # Read in synonyms file, which must be output in every language. - synonym_defs = read_json_file(os.path.join( - os.curdir, args.source_synonym_file)) - synonym_text = '\n'.join(['Blockly.Msg.{0} = Blockly.Msg.{1};'.format( - key, synonym_defs[key]) for key in synonym_defs]) - - # Read in constants file, which must be output in every language. - constants_text = load_constants(os.path.join(os.curdir, args.source_constants_file)) - - # Create each output file. - for arg_file in args.files: - (_, filename) = os.path.split(arg_file) - target_lang = filename[:filename.index('.')] - if target_lang not in ('qqq', 'keys', 'synonyms', 'constants'): - target_defs = read_json_file(os.path.join(os.curdir, arg_file)) - - # Verify that keys are 'ascii' - bad_keys = [key for key in target_defs if not string_is_ascii(key)] - if bad_keys: - print(u'These keys in {0} contain non ascii characters: {1}'.format( - filename, ', '.join(bad_keys))) - - # If there's a '\n' or '\r', remove it and print a warning. - for key, value in target_defs.items(): - if _NEWLINE_PATTERN.search(value): - print(u'WARNING: definition of {0} in {1} contained ' - 'a newline character.'. - format(key, arg_file)) - target_defs[key] = _NEWLINE_PATTERN.sub(' ', value) - - # Output file. - outname = os.path.join(os.curdir, args.output_dir, target_lang + '.js') - with codecs.open(outname, 'w', 'utf-8') as outfile: - outfile.write( - """// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.{0}'); - -goog.require('Blockly.Msg'); - -""".format(target_lang.replace('-', '.'))) - # For each key in the source language file, output the target value - # if present; otherwise, output the source language value with a - # warning comment. - for key in sorted_keys: - if key in target_defs: - value = target_defs[key] - comment = '' - del target_defs[key] - else: - value = source_defs[key] - comment = ' // untranslated' - value = value.replace('"', '\\"') - outfile.write(u'Blockly.Msg["{0}"] = "{1}";{2}\n'.format( - key, value, comment)) - - # Announce any keys defined only for target language. - if target_defs: - extra_keys = [key for key in target_defs if key not in synonym_defs] - synonym_keys = [key for key in target_defs if key in synonym_defs] - if not args.quiet: - if extra_keys: - print(u'These extra keys appeared in {0}: {1}'.format( - filename, ', '.join(extra_keys))) - if synonym_keys: - print(u'These synonym keys appeared in {0}: {1}'.format( - filename, ', '.join(synonym_keys))) - - outfile.write(synonym_text) - outfile.write(constants_text) - - if not args.quiet: - print('Created {0}.'.format(outname)) - - -if __name__ == '__main__': - main() diff --git a/packages/scratch-blocks/i18n/create_scratch_msgs.js b/packages/scratch-blocks/i18n/create_scratch_msgs.js deleted file mode 100644 index 770693708..000000000 --- a/packages/scratch-blocks/i18n/create_scratch_msgs.js +++ /dev/null @@ -1,69 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const glob = require('glob'); -const assert = require('assert'); - -// Globals -const PATH_INPUT = path.resolve(__dirname, '../msg/json/*.json'); -const PATH_OUTPUT = path.resolve(__dirname, '../msg'); - -let en = fs.readFileSync(path.resolve(__dirname, '../msg/json/en.json')); -en = JSON.parse(en); -const enKeys = Object.keys(en).sort().toString(); - -// Check that translation is valid: -// entry: array [key, translation] corresponding to a single string from .json -// - messages with placeholders have the same number of placeholders -// - messages must not have newlines embedded -const validateEntry = function (entry) { - const re = /(%\d)/g; - const [key, translation] = entry; - const enMatch = en[key].match(re); - const tMatch = translation.match(re); - const enCount = enMatch ? enMatch.length : 0; - const tCount = tMatch ? tMatch.length : 0; - assert.strictEqual(tCount, enCount, `${key}:${en[key]} - "${translation}" placeholder mismatch`); - if (enCount > 0) { - - assert.notStrictEqual(tMatch, null, `${key} is missing a placeholder: ${translation}`); - assert.strictEqual( - tMatch.sort().toString(), - enMatch.sort().toString(), - `${key} is missing or has duplicate placeholders: ${translation}` - ); - } - assert.strictEqual(translation.match(/[\n]/), null, `${key} contains a newline character ${translation}`); -}; - -const validate = function (json, name) { - assert.strictEqual(Object.keys(json).sort().toString(), enKeys, `${name}: Locale json keys do not match en.json`); - Object.entries(json).forEach(validateEntry); -}; - -let file = `// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.ScratchMsgs.allLocales'); - -goog.require('Blockly.ScratchMsgs'); - -`; - -let files = glob.sync(PATH_INPUT); -files.forEach(function (uri) { - const name = path.parse(uri).name; - if (name !== 'qqq' && name !== 'synonyms') { - let body = fs.readFileSync(uri); - // Convert file body into an object (let this throw if invalid JSON) - body = JSON.parse(body); - validate(body, name); - file += '\n'; - file += `Blockly.ScratchMsgs.locales["${name}"] =\n`; - file += JSON.stringify(body, null, 4); - file += ';\n'; - } -}); - -// write combined file -fs.writeFileSync(`${PATH_OUTPUT}/scratch_msgs.js`, file); diff --git a/packages/scratch-blocks/i18n/dedup_json.py b/packages/scratch-blocks/i18n/dedup_json.py deleted file mode 100755 index 30e572dde..000000000 --- a/packages/scratch-blocks/i18n/dedup_json.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/python - -# Consolidates duplicate key-value pairs in a JSON file. -# If the same key is used with different values, no warning is given, -# and there is no guarantee about which key-value pair will be output. -# There is also no guarantee as to the order of the key-value pairs -# output. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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 argparse -import codecs -import json -from common import InputError - - -def main(): - """Parses arguments and iterates over files. - - Raises: - IOError: An I/O error occurred with an input or output file. - InputError: Input JSON could not be parsed. - """ - - # Set up argument parser. - parser = argparse.ArgumentParser( - description='Removes duplicate key-value pairs from JSON files.') - parser.add_argument('--suffix', default='', - help='optional suffix for output files; ' - 'if empty, files will be changed in place') - parser.add_argument('files', nargs='+', help='input files') - args = parser.parse_args() - - # Iterate over files. - for filename in args.files: - # Read in json using Python libraries. This eliminates duplicates. - print('Processing ' + filename + '...') - try: - with codecs.open(filename, 'r', 'utf-8') as infile: - j = json.load(infile) - except ValueError, e: - print('Error reading ' + filename) - raise InputError(file, str(e)) - - # Built up output strings as an array to make output of delimiters easier. - output = [] - for key in j: - if key != '@metadata': - output.append('\t"' + key + '": "' + - j[key].replace('\n', '\\n') + '"') - - # Output results. - with codecs.open(filename + args.suffix, 'w', 'utf-8') as outfile: - outfile.write('{\n') - outfile.write(',\n'.join(output)) - outfile.write('\n}\n') - - -if __name__ == '__main__': - main() diff --git a/packages/scratch-blocks/i18n/js_to_json.js b/packages/scratch-blocks/i18n/js_to_json.js deleted file mode 100644 index 3d7ce2659..000000000 --- a/packages/scratch-blocks/i18n/js_to_json.js +++ /dev/null @@ -1,46 +0,0 @@ -const es = require('event-stream'); -const fs = require('fs'); -const path = require('path'); -const assert = require('assert'); - -// Storage object -const storage = {}; - -// File paths -const PATH_INPUT = path.resolve(__dirname, '../msg/messages.js'); -const PATH_OUTPUT = path.resolve(__dirname, '../msg/json/en.json'); - -// Match function -const match = function (str) { - if (str.indexOf('Blockly.Msg.') !== 0) return false; - assert.notStrictEqual(str.indexOf('";'), str.length - 2, `[${str}] uses double quoted string, should use single quotes.`); - if (str.indexOf("';") !== str.length - 2) return false; - return true; -} - -// Extract key and value from message definition -const extract = function (str) { - str = str.split('Blockly.Msg.')[1].split(' '); - return { - key: str[0], - value: str - .splice(2, str.length) - .join(' ') - .slice(1, -2) // strip off initial ', and ending '; - .replace(/\\'/g, "'") - }; -}; - -// Stream input and push each match to the storage object -const stream = fs.createReadStream(PATH_INPUT); -stream - .pipe(es.split('\n')) - .pipe(es.mapSync(function (str) { - if (!match(str)) return; - const result = extract(str); - storage[result.key] = result.value; - })) - .pipe(es.wait(function (err) { - if (err) throw new Error(err); - fs.writeFileSync(PATH_OUTPUT, JSON.stringify(storage, null, 4)); - })); diff --git a/packages/scratch-blocks/i18n/js_to_json.py b/packages/scratch-blocks/i18n/js_to_json.py deleted file mode 100755 index e48b1cee1..000000000 --- a/packages/scratch-blocks/i18n/js_to_json.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/python - -# Gives the translation status of the specified apps and languages. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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. - -"""Extracts messages from .js files into .json files for translation. - -Specifically, lines with the following formats are extracted: - - /// Here is a description of the following message. - Blockly.SOME_KEY = 'Some value'; - -Adjacent "///" lines are concatenated. - -There are two output files, each of which is proper JSON. For each key, the -file en.json would get an entry of the form: - - "Blockly.SOME_KEY", "Some value", - -The file qqq.json would get: - - "Blockly.SOME_KEY", "Here is a description of the following message.", - -Commas would of course be omitted for the final entry of each value. - -@author Ellen Spertus (ellen.spertus@gmail.com) -""" - -import argparse -import codecs -import json -import os -import re -from common import write_files - - -_INPUT_DEF_PATTERN = re.compile("""Blockly.Msg.(\w*)\s*=\s*'(.*)';?\r?$""") - -_INPUT_SYN_PATTERN = re.compile( - """Blockly.Msg.(\w*)\s*=\s*Blockly.Msg.(\w*);""") - -_CONSTANT_DESCRIPTION_PATTERN = re.compile( - """{{Notranslate}}""", re.IGNORECASE) - -def main(): - # Set up argument parser. - parser = argparse.ArgumentParser(description='Create translation files.') - parser.add_argument( - '--author', - default='Ellen Spertus ', - help='name and email address of contact for translators') - parser.add_argument('--lang', default='en', - help='ISO 639-1 source language code') - parser.add_argument('--output_dir', default='json', - help='relative directory for output files') - parser.add_argument('--input_file', default='messages.js', - help='input file') - parser.add_argument('--quiet', action='store_true', default=False, - help='only display warnings, not routine info') - args = parser.parse_args() - if (not args.output_dir.endswith(os.path.sep)): - args.output_dir += os.path.sep - - # Read and parse input file. - results = [] - synonyms = {} - constants = {} # Values that are constant across all languages. - description = '' - infile = codecs.open(args.input_file, 'r', 'utf-8') - for line in infile: - if line.startswith('///'): - if description: - description = description + ' ' + line[3:].strip() - else: - description = line[3:].strip() - else: - match = _INPUT_DEF_PATTERN.match(line) - if match: - key = match.group(1) - value = match.group(2).replace("\\'", "'") - if not description: - print('Warning: No description for ' + result['meaning']) - if (description and _CONSTANT_DESCRIPTION_PATTERN.search(description)): - constants[key] = value - else: - result = {} - result['meaning'] = key - result['source'] = value - result['description'] = description - results.append(result) - description = '' - else: - match = _INPUT_SYN_PATTERN.match(line) - if match: - if description: - print('Warning: Description preceding definition of synonym {0}.'. - format(match.group(1))) - description = '' - synonyms[match.group(1)] = match.group(2) - infile.close() - - # Create .json, keys.json, and qqq.json. - write_files(args.author, args.lang, args.output_dir, results, False) - - # Create synonyms.json. - synonym_file_name = os.path.join(os.curdir, args.output_dir, 'synonyms.json') - with open(synonym_file_name, 'w') as outfile: - json.dump(synonyms, outfile) - if not args.quiet: - print("Wrote {0} synonym pairs to {1}.".format( - len(synonyms), synonym_file_name)) - - # Create constants.json - constants_file_name = os.path.join(os.curdir, args.output_dir, 'constants.json') - with open(constants_file_name, 'w') as outfile: - json.dump(constants, outfile) - if not args.quiet: - print("Wrote {0} constant pairs to {1}.".format( - len(constants), synonym_file_name)) - -if __name__ == '__main__': - main() diff --git a/packages/scratch-blocks/i18n/json_to_js.js b/packages/scratch-blocks/i18n/json_to_js.js deleted file mode 100644 index 7a62c7e89..000000000 --- a/packages/scratch-blocks/i18n/json_to_js.js +++ /dev/null @@ -1,52 +0,0 @@ -const async = require('async'); -const fs = require('fs'); -const path = require('path'); -const glob = require('glob'); - -// Globals -const PATH_INPUT = path.resolve(__dirname, '../msg/json/en.json'); -// If you want to generate js files for other languages, comment out the line above, -// and use the one below instead. -// const PATH_INPUT = path.resolve(__dirname, '../msg/json/*.json'); -const PATH_OUTPUT = path.resolve(__dirname, '../msg/js'); -const CONCURRENCY_LIMIT = 4; - -// Processing task -const work = function (uri, callback) { - fs.readFile(uri, function (err, body) { - const name = path.parse(uri).name; - if (err) return callback(err); - - // Convert file body into an object (let this throw if invalid JSON) - body = JSON.parse(body); - - // File storage object and preamble - let file = ''; - file += '// This file was automatically generated. Do not modify.\n'; - file += '\n'; - file += '\'use strict\';\n'; - file += '\n'; - file += `goog.provide(\'Blockly.Msg.${name}\');\n`; - file += 'goog.require(\'Blockly.Msg\');\n'; - file += '\n'; - - // Iterate over object and build up file - for (let i in body) { - file += `Blockly.Msg["${i}"] = "${body[i].replace(/"/g, '\\"')}";\n` - } - - // Write file to disk - fs.writeFile(`${PATH_OUTPUT}/${name}.js`, file, callback); - }); -}; - -// Create async processing queue -const q = async.queue(work, CONCURRENCY_LIMIT); - -// Handle errors -q.error = function (err) { - throw new Error(err); -}; - -// Get all JSON files in input directory and add to queue -q.push(glob.sync(PATH_INPUT)); diff --git a/packages/scratch-blocks/i18n/json_to_js.py b/packages/scratch-blocks/i18n/json_to_js.py deleted file mode 100755 index f8c20f6af..000000000 --- a/packages/scratch-blocks/i18n/json_to_js.py +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/python - -# Converts .json files into .js files for use within Blockly apps. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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 argparse -import codecs # for codecs.open(..., 'utf-8') -import glob -import json # for json.load() -import os # for os.path() -import subprocess # for subprocess.check_call() -from common import InputError -from common import read_json_file - - -# Store parsed command-line arguments in global variable. -args = None - - -def _create_xlf(target_lang): - """Creates a .xlf file for Soy. - - Args: - target_lang: The ISO 639 language code for the target language. - This is used in the name of the file and in the metadata. - - Returns: - A pointer to a file to which the metadata has been written. - - Raises: - IOError: An error occurred while opening or writing the file. - """ - filename = os.path.join(os.curdir, args.output_dir, target_lang + '.xlf') - out_file = codecs.open(filename, 'w', 'utf-8') - out_file.write(""" - - - """.format(args.source_lang, target_lang)) - return out_file - - -def _close_xlf(xlf_file): - """Closes a .xlf file created with create_xlf(). - - This includes writing the terminating XML. - - Args: - xlf_file: A pointer to a file created by _create_xlf(). - - Raises: - IOError: An error occurred while writing to or closing the file. - """ - xlf_file.write(""" - - - -""") - xlf_file.close() - - -def _process_file(path_to_json, target_lang, key_dict): - """Creates an .xlf file corresponding to the specified .json input file. - - The name of the input file must be target_lang followed by '.json'. - The name of the output file will be target_lang followed by '.js'. - - Args: - path_to_json: Path to the directory of xx.json files. - target_lang: A IETF language code (RFC 4646), such as 'es' or 'pt-br'. - key_dict: Dictionary mapping Blockly keys (e.g., Maze.turnLeft) to - Closure keys (hash numbers). - - Raises: - IOError: An I/O error occurred with an input or output file. - InputError: Input JSON could not be parsed. - KeyError: Key found in input file but not in key file. - """ - keyfile = os.path.join(path_to_json, target_lang + '.json') - j = read_json_file(keyfile) - out_file = _create_xlf(target_lang) - for key in j: - if key != '@metadata': - try: - identifier = key_dict[key] - except KeyError, e: - print('Key "%s" is in %s but not in %s' % - (key, keyfile, args.key_file)) - raise e - target = j.get(key) - out_file.write(u""" - - {1} - """.format(identifier, target)) - _close_xlf(out_file) - - -def main(): - """Parses arguments and iterates over files.""" - - # Set up argument parser. - parser = argparse.ArgumentParser(description='Convert JSON files to JS.') - parser.add_argument('--source_lang', default='en', - help='ISO 639-1 source language code') - parser.add_argument('--output_dir', default='generated', - help='relative directory for output files') - parser.add_argument('--key_file', default='json' + os.path.sep + 'keys.json', - help='relative path to input keys file') - parser.add_argument('--template', default='template.soy') - parser.add_argument('--path_to_jar', - default='..' + os.path.sep + 'apps' + os.path.sep - + '_soy', - help='relative path from working directory to ' - 'SoyToJsSrcCompiler.jar') - parser.add_argument('files', nargs='+', help='input files') - - # Initialize global variables. - global args - args = parser.parse_args() - - # Make sure output_dir ends with slash. - if (not args.output_dir.endswith(os.path.sep)): - args.output_dir += os.path.sep - - # Read in keys.json, mapping descriptions (e.g., Maze.turnLeft) to - # Closure keys (long hash numbers). - key_file = open(args.key_file) - key_dict = json.load(key_file) - key_file.close() - - # Process each input file. - print('Creating .xlf files...') - processed_langs = [] - if len(args.files) == 1: - # Windows does not expand globs automatically. - args.files = glob.glob(args.files[0]) - for arg_file in args.files: - (path_to_json, filename) = os.path.split(arg_file) - if not filename.endswith('.json'): - raise InputError(filename, 'filenames must end with ".json"') - target_lang = filename[:filename.index('.')] - if not target_lang in ('qqq', 'keys'): - processed_langs.append(target_lang) - _process_file(path_to_json, target_lang, key_dict) - - # Output command line for Closure compiler. - if processed_langs: - print('Creating .js files...') - processed_lang_list = ','.join(processed_langs) - subprocess.check_call([ - 'java', - '-jar', os.path.join(args.path_to_jar, 'SoyToJsSrcCompiler.jar'), - '--locales', processed_lang_list, - '--messageFilePathFormat', args.output_dir + '{LOCALE}.xlf', - '--outputPathFormat', args.output_dir + '{LOCALE}.js', - '--srcs', args.template]) - if len(processed_langs) == 1: - print('Created ' + processed_lang_list + '.js in ' + args.output_dir) - else: - print('Created {' + processed_lang_list + '}.js in ' + args.output_dir) - - for lang in processed_langs: - os.remove(args.output_dir + lang + '.xlf') - print('Removed .xlf files.') - - -if __name__ == '__main__': - main() diff --git a/packages/scratch-blocks/i18n/sync_tx_translations.js b/packages/scratch-blocks/i18n/sync_tx_translations.js deleted file mode 100755 index 747c1bc98..000000000 --- a/packages/scratch-blocks/i18n/sync_tx_translations.js +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env node - -/** - * @fileoverview - * Script to pull translations for blocks from transifex and generate the scratch_msgs file. - * Expects that the project and resource have already been defined in Transifex, and that - * the person running the script has the the TX_TOKEN environment variable set to an api - * token that has developer access. - */ - - const usage = ` - Pull supported language translations from Transifex. Usage: - node sync_tx_translations.js - NOTE: TX_TOKEN environment variable needs to be set with a Transifex API token. See - the Localization page on the GUI wiki for information about setting up Transifex. - `; -// Fail immediately if the TX_TOKEN is not defined -if (!process.env.TX_TOKEN || process.argv.length !== 2) { - process.stdout.write(usage); - process.exit(1); -}; - -const fs = require('fs'); -const path = require('path'); -const assert = require('assert'); -const transifex = require('transifex'); -const locales = require('scratch-l10n').default; - -// Globals -const PATH_OUTPUT = path.resolve(__dirname, '../msg'); -const PROJECT = 'scratch-editor' -const RESOURCE = 'blocks'; -const MODE = {mode: 'reviewed'}; - -const TX = new transifex({ - project_slug: PROJECT, - credential: 'api:' + process.env.TX_TOKEN -}); - -let en = fs.readFileSync(path.resolve(__dirname, '../msg/json/en.json')); -en = JSON.parse(en); -const enKeys = Object.keys(en).sort().toString(); - -// Check that translation is valid: -// entry: array [key, translation] corresponding to a single string from .json -// - messages with placeholders have the same number of placeholders -// - messages must not have newlines embedded -const validateEntry = function (entry) { - const re = /(%\d)/g; - const [key, translation] = entry; - const enMatch = en[key].match(re); - const tMatch = translation.match(re); - const enCount = enMatch ? enMatch.length : 0; - const tCount = tMatch ? tMatch.length : 0; - assert.strictEqual(tCount, enCount, `${key}:${en[key]} - "${translation}" placeholder mismatch`); - if (enCount > 0) { - - assert.notStrictEqual(tMatch, null, `${key} is missing a placeholder: ${translation}`); - assert.strictEqual( - tMatch.sort().toString(), - enMatch.sort().toString(), - `${key} is missing or has duplicate placeholders: ${translation}` - ); - } - assert.strictEqual(translation.match(/[\n]/), null, `${key} contains a newline character ${translation}`); -}; - -const validate = function (json, name) { - assert.strictEqual(Object.keys(json).sort().toString(), enKeys, `${name}: Locale json keys do not match en.json`); - Object.entries(json).forEach(validateEntry); -}; - -let file = `// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.ScratchMsgs.allLocales'); - -goog.require('Blockly.ScratchMsgs'); - -`; - -let localeMap = { - 'aa-dj': 'aa_DJ', - 'es-419': 'es_419', - 'pt-br': 'pt_BR', - 'zh-cn': 'zh_CN', - 'zh-tw': 'zh_TW' -}; - -function getLocaleData (locale) { - let txLocale = localeMap[locale] || locale; - return new Promise (function (resolve, reject) { - TX.translationInstanceMethod(PROJECT, RESOURCE, txLocale, MODE, function (err, data) { - if (err) { - reject(err); - } else { - resolve({ - locale: locale, - translations: JSON.parse(data) - }); - } - }) - }) -}; - -Promise.all(Object.keys(locales).map(getLocaleData)).then(function (values) { - values.forEach(function (translation) { - validate(translation.translations, translation.locale); - file += '\n'; - file += `Blockly.ScratchMsgs.locales["${translation.locale}"] =\n`; - file += JSON.stringify(translation.translations, null, 4); - file += ';\n'; - }); - file += '// End of combined translations\n'; - // write combined file - fs.writeFileSync(`${PATH_OUTPUT}/scratch_msgs.js`, file); -}).catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/packages/scratch-blocks/i18n/test_scratch_msgs.js b/packages/scratch-blocks/i18n/test_scratch_msgs.js deleted file mode 100644 index 2cc00cf49..000000000 --- a/packages/scratch-blocks/i18n/test_scratch_msgs.js +++ /dev/null @@ -1,87 +0,0 @@ -const es = require('event-stream'); -const fs = require('fs'); -const path = require('path'); -const assert = require('assert'); - -// current locale and keys for the locale -let locale = ''; -let keys = []; - -// current English keys -let en = fs.readFileSync(path.resolve(__dirname, '../msg/json/en.json')); -en = JSON.parse(en); -const enKeys = Object.keys(en); - -// File paths -const PATH_INPUT = path.resolve(__dirname, '../msg/scratch_msgs.js'); - -// Match lines of the scratch_msgs file -// Blockly.ScratchMsgs.locales indicates the start of a new locale -// ": " marks a "key": "value" pair -// Also match the end of the generated file so the last set of keys can be checked -const match = function (str) { - if (str.indexOf('Blockly.ScratchMsgs.locales') !== 0) return true; - if (str.indexOf('": "') !== 0) return true; - if (str.indexOf('End of combined translations') !== 0) return true; - return false; -} - -// Extract key and value from message definition, or locale when it changes -const extract = function (str) { - let m = str.match(/locales\["(.+)"\]/); - if (m) { - // locale changed - return m[1]; - } - m = str.match(/"(.*)": "(.*)",?$/); - if (m) { - return { - key: m[1], - value: m[2] - } - } - // return a string for the end of the file so that validate will check the last set of keys - m = str.match(/^\/\/ End of combined translations$/); - if (m) return 'last'; - return null; -}; - -const validateKeys = function () { - // ignore empty keys first time through - if (keys.length === 0) return; - assert.strictEqual(keys.length, Object.keys(en).length, `scratch_msgs-${locale}: number of keys doesn't match`); - keys.map(item => assert(enKeys.includes(item), `scratch_msgs-${locale}: has key ${item} not in en`)); - enKeys.map(item => assert(keys.includes(item), `scratch_msgs-${locale}: is missing key ${item}`)); -} - -// Stream input and push each match to the storage object -const stream = fs.createReadStream(PATH_INPUT); -stream - .pipe(es.split('\n')) - .pipe(es.mapSync(function (str) { - if (!match(str)) return; - const result = extract(str); - if (!result) return; - if (typeof result === 'string') { - // locale changed or end of file, validate the current collection of keys - try { - validateKeys(); - } - catch (err) { - console.error('Key validation FAILED: %O', err); - process.exit(1); - } - // change locale, and reset keys array - locale = result; - keys = []; - } else { - keys.push(result.key); - } - })) - .pipe(es.wait(function (err) { - if (err) { - console.err(err); - process.exit(1); - } - process.exit(0) - })); diff --git a/packages/scratch-blocks/i18n/tests.py b/packages/scratch-blocks/i18n/tests.py deleted file mode 100644 index 7e4fc49aa..000000000 --- a/packages/scratch-blocks/i18n/tests.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Tests of i18n scripts. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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 common -import re -import unittest - -class TestSequenceFunctions(unittest.TestCase): - def test_insert_breaks(self): - spaces = re.compile(r'\s+|\\n') - def contains_all_chars(orig, result): - return re.sub(spaces, '', orig) == re.sub(spaces, '', result) - - sentences = [u'Quay Pegman qua bên trái hoặc bên phải 90 độ.', - u'Foo bar baz this is english that is okay bye.', - u'If there is a path in the specified direction, \nthen ' + - u'do some actions.', - u'If there is a path in the specified direction, then do ' + - u'the first block of actions. Otherwise, do the second ' + - u'block of actions.'] - for sentence in sentences: - output = common.insert_breaks(sentence, 30, 50) - self.assert_(contains_all_chars(sentence, output), - u'Mismatch between:\n{0}\n{1}'.format( - re.sub(spaces, '', sentence), - re.sub(spaces, '', output))) - - -if __name__ == '__main__': - unittest.main() diff --git a/packages/scratch-blocks/i18n/xliff_to_json.py b/packages/scratch-blocks/i18n/xliff_to_json.py deleted file mode 100755 index b38b4d6ec..000000000 --- a/packages/scratch-blocks/i18n/xliff_to_json.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/python - -# Converts .xlf files into .json files for use at http://translatewiki.net. -# -# Copyright 2013 Google Inc. -# https://developers.google.com/blockly/ -# -# 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 argparse -import os -import re -import subprocess -import sys -from xml.dom import minidom -from common import InputError -from common import write_files - -# Global variables -args = None # Parsed command-line arguments. - - -def _parse_trans_unit(trans_unit): - """Converts a trans-unit XML node into a more convenient dictionary format. - - Args: - trans_unit: An XML representation of a .xlf translation unit. - - Returns: - A dictionary with useful information about the translation unit. - The returned dictionary is guaranteed to have an entry for 'key' and - may have entries for 'source', 'target', 'description', and 'meaning' - if present in the argument. - - Raises: - InputError: A required field was not present. - """ - - def get_value(tag_name): - elts = trans_unit.getElementsByTagName(tag_name) - if not elts: - return None - elif len(elts) == 1: - return ''.join([child.toxml() for child in elts[0].childNodes]) - else: - raise InputError('', 'Unable to extract ' + tag_name) - - result = {} - key = trans_unit.getAttribute('id') - if not key: - raise InputError('', 'id attribute not found') - result['key'] = key - - # Get source and target, if present. - try: - result['source'] = get_value('source') - result['target'] = get_value('target') - except InputError, e: - raise InputError(key, e.msg) - - # Get notes, using the from value as key and the data as value. - notes = trans_unit.getElementsByTagName('note') - for note in notes: - from_value = note.getAttribute('from') - if from_value and len(note.childNodes) == 1: - result[from_value] = note.childNodes[0].data - else: - raise InputError(key, 'Unable to extract ' + from_value) - - return result - - -def _process_file(filename): - """Builds list of translation units from input file. - - Each translation unit in the input file includes: - - an id (opaquely generated by Soy) - - the Blockly name for the message - - the text in the source language (generally English) - - a description for the translator - - The Soy and Blockly ids are joined with a hyphen and serve as the - keys in both output files. The value is the corresponding text (in the - .json file) or the description (in the qqq.json file). - - Args: - filename: The name of an .xlf file produced by Closure. - - Raises: - IOError: An I/O error occurred with an input or output file. - InputError: The input file could not be parsed or lacked required - fields. - - Returns: - A list of dictionaries produced by parse_trans_unit(). - """ - try: - results = [] # list of dictionaries (return value) - names = [] # list of names of encountered keys (local variable) - try: - parsed_xml = minidom.parse(filename) - except IOError: - # Don't get caught by below handler - raise - except Exception, e: - print - raise InputError(filename, str(e)) - - # Make sure needed fields are present and non-empty. - for trans_unit in parsed_xml.getElementsByTagName('trans-unit'): - unit = _parse_trans_unit(trans_unit) - for key in ['description', 'meaning', 'source']: - if not key in unit or not unit[key]: - raise InputError(filename + ':' + unit['key'], - key + ' not found') - if unit['description'].lower() == 'ibid': - if unit['meaning'] not in names: - # If the term has not already been described, the use of 'ibid' - # is an error. - raise InputError( - filename, - 'First encountered definition of: ' + unit['meaning'] - + ' has definition: ' + unit['description'] - + '. This error can occur if the definition was not' - + ' provided on the first appearance of the message' - + ' or if the source (English-language) messages differ.') - else: - # If term has already been described, 'ibid' was used correctly, - # and we output nothing. - pass - else: - if unit['meaning'] in names: - raise InputError(filename, - 'Second definition of: ' + unit['meaning']) - names.append(unit['meaning']) - results.append(unit) - - return results - except IOError, e: - print 'Error with file {0}: {1}'.format(filename, e.strerror) - sys.exit(1) - - -def sort_units(units, templates): - """Sorts the translation units by their definition order in the template. - - Args: - units: A list of dictionaries produced by parse_trans_unit() - that have a non-empty value for the key 'meaning'. - templates: A string containing the Soy templates in which each of - the units' meanings is defined. - - Returns: - A new list of translation units, sorted by the order in which - their meaning is defined in the templates. - - Raises: - InputError: If a meaning definition cannot be found in the - templates. - """ - def key_function(unit): - match = re.search( - '\\smeaning\\s*=\\s*"{0}"\\s'.format(unit['meaning']), - templates) - if match: - return match.start() - else: - raise InputError(args.templates, - 'msg definition for meaning not found: ' + - unit['meaning']) - return sorted(units, key=key_function) - - -def main(): - """Parses arguments and processes the specified file. - - Raises: - IOError: An I/O error occurred with an input or output file. - InputError: Input files lacked required fields. - """ - # Set up argument parser. - parser = argparse.ArgumentParser(description='Create translation files.') - parser.add_argument( - '--author', - default='Ellen Spertus ', - help='name and email address of contact for translators') - parser.add_argument('--lang', default='en', - help='ISO 639-1 source language code') - parser.add_argument('--output_dir', default='json', - help='relative directory for output files') - parser.add_argument('--xlf', help='file containing xlf definitions') - parser.add_argument('--templates', default=['template.soy'], nargs='+', - help='relative path to Soy templates, comma or space ' - 'separated (used for ordering messages)') - global args - args = parser.parse_args() - - # Make sure output_dir ends with slash. - if (not args.output_dir.endswith(os.path.sep)): - args.output_dir += os.path.sep - - # Process the input file, and sort the entries. - units = _process_file(args.xlf) - files = [] - for arg in args.templates: - for filename in arg.split(','): - filename = filename.strip(); - if filename: - with open(filename) as myfile: - files.append(' '.join(line.strip() for line in myfile)) - sorted_units = sort_units(units, ' '.join(files)) - - # Write the output files. - write_files(args.author, args.lang, args.output_dir, sorted_units, True) - - # Delete the input .xlf file. - os.remove(args.xlf) - print('Removed ' + args.xlf) - - -if __name__ == '__main__': - main() diff --git a/packages/scratch-blocks/local_build.sh b/packages/scratch-blocks/local_build.sh deleted file mode 100755 index fc02445db..000000000 --- a/packages/scratch-blocks/local_build.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -# Locally build and compress the core Blockly files into a single JavaScript -# file. -# -# Copyright 2018 Google Inc. -# https://developers.google.com/blockly/ -# -# 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. -# -# Usage: local_build.sh. -# -# This script generates only local_blockly_compressed_vertical.js. You may -# modify it as needed to build other files. -# -# The compressed file is a concatenation of all of Scratch-Blocks's core files, -# run through a local copy of Google's Closure Compiler with simple -# optimizations turned on. - -# Future work: -# - Trim down Google's Apache licenses, to match the output of build.py. -# - Generate other compressed files generated by build.py normally. -# - Add a good error message if multiple versions of the closure compiler were -# found. -# - Add a flag for generating horizontal (still default to vertical). - -# Find the Closure Compiler. -if [ -f "$(npm root)/google-closure-compiler/compiler.jar" ]; then - COMPILER="$(npm root)/google-closure-compiler/compiler.jar" -elif [ -f closure-compiler*.jar ]; then - COMPILER="closure-compiler*.jar" - # TODO: Check whether multiple files were found. -else - echo "ERROR: Closure Compiler not found." - echo "Download from this URL, and place jar file in current directory." - echo "https://dl.google.com/closure-compiler/compiler-latest.zip" - exit 1 -fi - -echo Using $COMPILER as the compiler. -rm local_blockly_compressed_vertical.js 2> /dev/null -echo Compiling Scratch-Blocks.. -java -jar $COMPILER \ - --js='core/**.js' \ - --js='!core/block_render_svg_horizontal.js' \ - --js='../closure-library/closure/goog/**.js' \ - --js='../closure-library/third_party/closure/goog/**.js' \ - --generate_exports \ - --warning_level='DEFAULT' \ - --compilation_level SIMPLE_OPTIMIZATIONS \ - --dependency_mode=STRICT \ - --entry_point=Blockly \ - --js_output_file local_blockly_compressed_vertical.js - -if [ -s local_blockly_compressed_vertical.js ]; then - echo Compilation OK. -else - echo Compilation FAIL. - exit 1 -fi diff --git a/packages/scratch-blocks/media/1x1.gif b/packages/scratch-blocks/media/1x1.gif deleted file mode 100644 index 308551123..000000000 Binary files a/packages/scratch-blocks/media/1x1.gif and /dev/null differ diff --git a/packages/scratch-blocks/media/click.mp3 b/packages/scratch-blocks/media/click.mp3 deleted file mode 100644 index 0c1b05cd2..000000000 Binary files a/packages/scratch-blocks/media/click.mp3 and /dev/null differ diff --git a/packages/scratch-blocks/media/click.ogg b/packages/scratch-blocks/media/click.ogg deleted file mode 100644 index 37535b862..000000000 Binary files a/packages/scratch-blocks/media/click.ogg and /dev/null differ diff --git a/packages/scratch-blocks/media/click.wav b/packages/scratch-blocks/media/click.wav deleted file mode 100644 index 17f71aeef..000000000 Binary files a/packages/scratch-blocks/media/click.wav and /dev/null differ diff --git a/packages/scratch-blocks/media/comment-arrow-down.svg b/packages/scratch-blocks/media/comment-arrow-down.svg deleted file mode 100644 index 31dfa1dba..000000000 --- a/packages/scratch-blocks/media/comment-arrow-down.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - dropdown-caret-up - Created with Sketch. - - - - - diff --git a/packages/scratch-blocks/media/comment-arrow-up.svg b/packages/scratch-blocks/media/comment-arrow-up.svg deleted file mode 100644 index a951282c7..000000000 --- a/packages/scratch-blocks/media/comment-arrow-up.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - dropdown-caret-down - Created with Sketch. - - - - - diff --git a/packages/scratch-blocks/media/delete-x.svg b/packages/scratch-blocks/media/delete-x.svg deleted file mode 100644 index ed1f71edf..000000000 --- a/packages/scratch-blocks/media/delete-x.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - delete-x - Created with Sketch. - - - - - diff --git a/packages/scratch-blocks/media/delete.mp3 b/packages/scratch-blocks/media/delete.mp3 deleted file mode 100644 index a937a3815..000000000 Binary files a/packages/scratch-blocks/media/delete.mp3 and /dev/null differ diff --git a/packages/scratch-blocks/media/delete.ogg b/packages/scratch-blocks/media/delete.ogg deleted file mode 100644 index e123af6b0..000000000 Binary files a/packages/scratch-blocks/media/delete.ogg and /dev/null differ diff --git a/packages/scratch-blocks/media/delete.wav b/packages/scratch-blocks/media/delete.wav deleted file mode 100644 index 8e8026e11..000000000 Binary files a/packages/scratch-blocks/media/delete.wav and /dev/null differ diff --git a/packages/scratch-blocks/media/dropdown-arrow-dark.svg b/packages/scratch-blocks/media/dropdown-arrow-dark.svg deleted file mode 100644 index 50df28793..000000000 --- a/packages/scratch-blocks/media/dropdown-arrow-dark.svg +++ /dev/null @@ -1 +0,0 @@ -dropdown-arrow diff --git a/packages/scratch-blocks/media/dropdown-arrow.svg b/packages/scratch-blocks/media/dropdown-arrow.svg deleted file mode 100644 index 4e6ce19ec..000000000 --- a/packages/scratch-blocks/media/dropdown-arrow.svg +++ /dev/null @@ -1 +0,0 @@ -dropdown-arrow \ No newline at end of file diff --git a/packages/scratch-blocks/media/extensions/microbit-block-icon.svg b/packages/scratch-blocks/media/extensions/microbit-block-icon.svg deleted file mode 100644 index 95437962c..000000000 --- a/packages/scratch-blocks/media/extensions/microbit-block-icon.svg +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - image/svg+xml - - wedo-add-button - - - - - - wedo-add-button - Created with Sketch. - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/media/extensions/music-block-icon.svg b/packages/scratch-blocks/media/extensions/music-block-icon.svg deleted file mode 100644 index f13ebe292..000000000 --- a/packages/scratch-blocks/media/extensions/music-block-icon.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - music-block-icon - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/extensions/pen-block-icon.svg b/packages/scratch-blocks/media/extensions/pen-block-icon.svg deleted file mode 100644 index 148affa33..000000000 --- a/packages/scratch-blocks/media/extensions/pen-block-icon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - pen-icon - Created with Sketch. - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/extensions/wedo2-block-icon.svg b/packages/scratch-blocks/media/extensions/wedo2-block-icon.svg deleted file mode 100644 index 51cb7710d..000000000 --- a/packages/scratch-blocks/media/extensions/wedo2-block-icon.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - wedo2-block-icon - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/eyedropper.svg b/packages/scratch-blocks/media/eyedropper.svg deleted file mode 100644 index 37ff80942..000000000 --- a/packages/scratch-blocks/media/eyedropper.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - Artboard - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/green-flag.svg b/packages/scratch-blocks/media/green-flag.svg deleted file mode 100644 index 5c3c9c15b..000000000 --- a/packages/scratch-blocks/media/green-flag.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - -greenflag - - - diff --git a/packages/scratch-blocks/media/handclosed.cur b/packages/scratch-blocks/media/handclosed.cur deleted file mode 100644 index 4851755a1..000000000 Binary files a/packages/scratch-blocks/media/handclosed.cur and /dev/null differ diff --git a/packages/scratch-blocks/media/handdelete.cur b/packages/scratch-blocks/media/handdelete.cur deleted file mode 100644 index 170320fc2..000000000 Binary files a/packages/scratch-blocks/media/handdelete.cur and /dev/null differ diff --git a/packages/scratch-blocks/media/handopen.cur b/packages/scratch-blocks/media/handopen.cur deleted file mode 100644 index da44588b2..000000000 Binary files a/packages/scratch-blocks/media/handopen.cur and /dev/null differ diff --git a/packages/scratch-blocks/media/icons/arrow.svg b/packages/scratch-blocks/media/icons/arrow.svg deleted file mode 100644 index 6debbf377..000000000 --- a/packages/scratch-blocks/media/icons/arrow.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - arrow - Created with Sketch. - - - - - - - diff --git a/packages/scratch-blocks/media/icons/arrow_button.svg b/packages/scratch-blocks/media/icons/arrow_button.svg deleted file mode 100644 index 17d6eeb8c..000000000 --- a/packages/scratch-blocks/media/icons/arrow_button.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/control_forever.svg b/packages/scratch-blocks/media/icons/control_forever.svg deleted file mode 100755 index eb095010d..000000000 --- a/packages/scratch-blocks/media/icons/control_forever.svg +++ /dev/null @@ -1 +0,0 @@ -control_forever \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/control_repeat.svg b/packages/scratch-blocks/media/icons/control_repeat.svg deleted file mode 100755 index 05e9fa8db..000000000 --- a/packages/scratch-blocks/media/icons/control_repeat.svg +++ /dev/null @@ -1 +0,0 @@ -control_repeat \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/control_stop.svg b/packages/scratch-blocks/media/icons/control_stop.svg deleted file mode 100644 index d6e9a5415..000000000 --- a/packages/scratch-blocks/media/icons/control_stop.svg +++ /dev/null @@ -1 +0,0 @@ -control_stop \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/control_wait.svg b/packages/scratch-blocks/media/icons/control_wait.svg deleted file mode 100755 index 529173540..000000000 --- a/packages/scratch-blocks/media/icons/control_wait.svg +++ /dev/null @@ -1 +0,0 @@ -wait \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_broadcast_blue.svg b/packages/scratch-blocks/media/icons/event_broadcast_blue.svg deleted file mode 100755 index 3ed7b5b7c..000000000 --- a/packages/scratch-blocks/media/icons/event_broadcast_blue.svg +++ /dev/null @@ -1 +0,0 @@ -event_broadcast_blue \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_broadcast_coral.svg b/packages/scratch-blocks/media/icons/event_broadcast_coral.svg deleted file mode 100755 index 241f34e46..000000000 --- a/packages/scratch-blocks/media/icons/event_broadcast_coral.svg +++ /dev/null @@ -1 +0,0 @@ -event_broadcast_coral \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_broadcast_green.svg b/packages/scratch-blocks/media/icons/event_broadcast_green.svg deleted file mode 100755 index e61e35a36..000000000 --- a/packages/scratch-blocks/media/icons/event_broadcast_green.svg +++ /dev/null @@ -1 +0,0 @@ -event_broadcast_green \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_broadcast_magenta.svg b/packages/scratch-blocks/media/icons/event_broadcast_magenta.svg deleted file mode 100755 index 4207ff72c..000000000 --- a/packages/scratch-blocks/media/icons/event_broadcast_magenta.svg +++ /dev/null @@ -1 +0,0 @@ -event_broadcast_magenta \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_broadcast_orange.svg b/packages/scratch-blocks/media/icons/event_broadcast_orange.svg deleted file mode 100755 index 653ce7c76..000000000 --- a/packages/scratch-blocks/media/icons/event_broadcast_orange.svg +++ /dev/null @@ -1 +0,0 @@ -event_broadcast_orange \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_broadcast_purple.svg b/packages/scratch-blocks/media/icons/event_broadcast_purple.svg deleted file mode 100755 index 547368c51..000000000 --- a/packages/scratch-blocks/media/icons/event_broadcast_purple.svg +++ /dev/null @@ -1 +0,0 @@ -send-message-purple \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_when-broadcast-received_blue.svg b/packages/scratch-blocks/media/icons/event_when-broadcast-received_blue.svg deleted file mode 100755 index ed1f580d4..000000000 --- a/packages/scratch-blocks/media/icons/event_when-broadcast-received_blue.svg +++ /dev/null @@ -1 +0,0 @@ -LetterGet_Blue \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_when-broadcast-received_coral.svg b/packages/scratch-blocks/media/icons/event_when-broadcast-received_coral.svg deleted file mode 100755 index 05f92a40e..000000000 --- a/packages/scratch-blocks/media/icons/event_when-broadcast-received_coral.svg +++ /dev/null @@ -1 +0,0 @@ -LetterGet_Coral \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_when-broadcast-received_green.svg b/packages/scratch-blocks/media/icons/event_when-broadcast-received_green.svg deleted file mode 100755 index e43e8a90b..000000000 --- a/packages/scratch-blocks/media/icons/event_when-broadcast-received_green.svg +++ /dev/null @@ -1 +0,0 @@ -LetterGet_Green \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_when-broadcast-received_magenta.svg b/packages/scratch-blocks/media/icons/event_when-broadcast-received_magenta.svg deleted file mode 100755 index c01191b65..000000000 --- a/packages/scratch-blocks/media/icons/event_when-broadcast-received_magenta.svg +++ /dev/null @@ -1 +0,0 @@ -LetterGet_Magenta \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_when-broadcast-received_orange.svg b/packages/scratch-blocks/media/icons/event_when-broadcast-received_orange.svg deleted file mode 100755 index fa99c847b..000000000 --- a/packages/scratch-blocks/media/icons/event_when-broadcast-received_orange.svg +++ /dev/null @@ -1 +0,0 @@ -LetterGet_Orange \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_when-broadcast-received_purple.svg b/packages/scratch-blocks/media/icons/event_when-broadcast-received_purple.svg deleted file mode 100755 index 12b163fc4..000000000 --- a/packages/scratch-blocks/media/icons/event_when-broadcast-received_purple.svg +++ /dev/null @@ -1 +0,0 @@ -LetterGet_Purple \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/event_whenflagclicked.svg b/packages/scratch-blocks/media/icons/event_whenflagclicked.svg deleted file mode 100755 index ff2a3bfe9..000000000 --- a/packages/scratch-blocks/media/icons/event_whenflagclicked.svg +++ /dev/null @@ -1 +0,0 @@ -greenflag \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/remove.svg b/packages/scratch-blocks/media/icons/remove.svg deleted file mode 100644 index 9f50efc19..000000000 --- a/packages/scratch-blocks/media/icons/remove.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - delete-argument v2 - Created with Sketch. - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_blue.svg b/packages/scratch-blocks/media/icons/set-led_blue.svg deleted file mode 100755 index 7bb73f980..000000000 --- a/packages/scratch-blocks/media/icons/set-led_blue.svg +++ /dev/null @@ -1 +0,0 @@ -set-led_blue \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_coral.svg b/packages/scratch-blocks/media/icons/set-led_coral.svg deleted file mode 100755 index 26487a30d..000000000 --- a/packages/scratch-blocks/media/icons/set-led_coral.svg +++ /dev/null @@ -1 +0,0 @@ -set-led_coral \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_green.svg b/packages/scratch-blocks/media/icons/set-led_green.svg deleted file mode 100755 index 3c9cd170f..000000000 --- a/packages/scratch-blocks/media/icons/set-led_green.svg +++ /dev/null @@ -1 +0,0 @@ -set-led_green \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_magenta.svg b/packages/scratch-blocks/media/icons/set-led_magenta.svg deleted file mode 100755 index a13b8f1a0..000000000 --- a/packages/scratch-blocks/media/icons/set-led_magenta.svg +++ /dev/null @@ -1 +0,0 @@ -set-led-magenta \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_mystery.svg b/packages/scratch-blocks/media/icons/set-led_mystery.svg deleted file mode 100755 index 4b0a2e337..000000000 --- a/packages/scratch-blocks/media/icons/set-led_mystery.svg +++ /dev/null @@ -1 +0,0 @@ -set-led-mystery \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_orange.svg b/packages/scratch-blocks/media/icons/set-led_orange.svg deleted file mode 100755 index 9821c7998..000000000 --- a/packages/scratch-blocks/media/icons/set-led_orange.svg +++ /dev/null @@ -1 +0,0 @@ -set-led-orange \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_purple.svg b/packages/scratch-blocks/media/icons/set-led_purple.svg deleted file mode 100755 index efb7132f1..000000000 --- a/packages/scratch-blocks/media/icons/set-led_purple.svg +++ /dev/null @@ -1 +0,0 @@ -set-led-purple \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_white.svg b/packages/scratch-blocks/media/icons/set-led_white.svg deleted file mode 100755 index 5ae43ab75..000000000 --- a/packages/scratch-blocks/media/icons/set-led_white.svg +++ /dev/null @@ -1 +0,0 @@ -set-led-white \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/set-led_yellow.svg b/packages/scratch-blocks/media/icons/set-led_yellow.svg deleted file mode 100755 index 7dba71f71..000000000 --- a/packages/scratch-blocks/media/icons/set-led_yellow.svg +++ /dev/null @@ -1 +0,0 @@ -set-led-yellow \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_motor-clockwise.svg b/packages/scratch-blocks/media/icons/wedo_motor-clockwise.svg deleted file mode 100755 index 29bdf2ab8..000000000 --- a/packages/scratch-blocks/media/icons/wedo_motor-clockwise.svg +++ /dev/null @@ -1 +0,0 @@ -wedo_motorclockwise \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_motor-counterclockwise.svg b/packages/scratch-blocks/media/icons/wedo_motor-counterclockwise.svg deleted file mode 100755 index 3631e8bb1..000000000 --- a/packages/scratch-blocks/media/icons/wedo_motor-counterclockwise.svg +++ /dev/null @@ -1 +0,0 @@ -wedo_motorclockwise \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_motor-speed_fast.svg b/packages/scratch-blocks/media/icons/wedo_motor-speed_fast.svg deleted file mode 100644 index 0e9308fbd..000000000 --- a/packages/scratch-blocks/media/icons/wedo_motor-speed_fast.svg +++ /dev/null @@ -1 +0,0 @@ -set-motor-speed_fast \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_motor-speed_med.svg b/packages/scratch-blocks/media/icons/wedo_motor-speed_med.svg deleted file mode 100644 index 49bc2b432..000000000 --- a/packages/scratch-blocks/media/icons/wedo_motor-speed_med.svg +++ /dev/null @@ -1 +0,0 @@ -set-motor-speed_med \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_motor-speed_slow.svg b/packages/scratch-blocks/media/icons/wedo_motor-speed_slow.svg deleted file mode 100644 index b9232edc1..000000000 --- a/packages/scratch-blocks/media/icons/wedo_motor-speed_slow.svg +++ /dev/null @@ -1 +0,0 @@ -set-motor-speed_slow \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_when-distance_close.svg b/packages/scratch-blocks/media/icons/wedo_when-distance_close.svg deleted file mode 100755 index fa735776d..000000000 --- a/packages/scratch-blocks/media/icons/wedo_when-distance_close.svg +++ /dev/null @@ -1 +0,0 @@ -wedo_whendistanceclose \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_when-tilt-backward.svg b/packages/scratch-blocks/media/icons/wedo_when-tilt-backward.svg deleted file mode 100755 index e7a41042c..000000000 --- a/packages/scratch-blocks/media/icons/wedo_when-tilt-backward.svg +++ /dev/null @@ -1 +0,0 @@ -wedo_whentiltbackward \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_when-tilt-forward.svg b/packages/scratch-blocks/media/icons/wedo_when-tilt-forward.svg deleted file mode 100755 index 00ef173ba..000000000 --- a/packages/scratch-blocks/media/icons/wedo_when-tilt-forward.svg +++ /dev/null @@ -1 +0,0 @@ -start-when-tilted-forward \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_when-tilt-left.svg b/packages/scratch-blocks/media/icons/wedo_when-tilt-left.svg deleted file mode 100755 index 35beebc0c..000000000 --- a/packages/scratch-blocks/media/icons/wedo_when-tilt-left.svg +++ /dev/null @@ -1 +0,0 @@ -start-when-tilted-left \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_when-tilt-right.svg b/packages/scratch-blocks/media/icons/wedo_when-tilt-right.svg deleted file mode 100755 index a05dbf0b0..000000000 --- a/packages/scratch-blocks/media/icons/wedo_when-tilt-right.svg +++ /dev/null @@ -1 +0,0 @@ -start-when-tilted-right \ No newline at end of file diff --git a/packages/scratch-blocks/media/icons/wedo_when-tilt.svg b/packages/scratch-blocks/media/icons/wedo_when-tilt.svg deleted file mode 100755 index a4c10c39b..000000000 --- a/packages/scratch-blocks/media/icons/wedo_when-tilt.svg +++ /dev/null @@ -1 +0,0 @@ -start-when-tilted-any \ No newline at end of file diff --git a/packages/scratch-blocks/media/repeat.svg b/packages/scratch-blocks/media/repeat.svg deleted file mode 100644 index e51234e71..000000000 --- a/packages/scratch-blocks/media/repeat.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - -repeat - - - diff --git a/packages/scratch-blocks/media/rotate-left.svg b/packages/scratch-blocks/media/rotate-left.svg deleted file mode 100644 index 42f59191a..000000000 --- a/packages/scratch-blocks/media/rotate-left.svg +++ /dev/null @@ -1 +0,0 @@ -rotate-clockwise \ No newline at end of file diff --git a/packages/scratch-blocks/media/rotate-right.svg b/packages/scratch-blocks/media/rotate-right.svg deleted file mode 100644 index c3f464704..000000000 --- a/packages/scratch-blocks/media/rotate-right.svg +++ /dev/null @@ -1 +0,0 @@ -rotate-counter-clockwise \ No newline at end of file diff --git a/packages/scratch-blocks/media/sprites.png b/packages/scratch-blocks/media/sprites.png deleted file mode 100644 index 7f704a5f1..000000000 Binary files a/packages/scratch-blocks/media/sprites.png and /dev/null differ diff --git a/packages/scratch-blocks/media/sprites.svg b/packages/scratch-blocks/media/sprites.svg deleted file mode 100644 index 3f09ef3a4..000000000 --- a/packages/scratch-blocks/media/sprites.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/media/status-not-ready.svg b/packages/scratch-blocks/media/status-not-ready.svg deleted file mode 100644 index 27747447c..000000000 --- a/packages/scratch-blocks/media/status-not-ready.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - not-connected - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/status-ready.svg b/packages/scratch-blocks/media/status-ready.svg deleted file mode 100644 index 6116d5ae9..000000000 --- a/packages/scratch-blocks/media/status-ready.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - connected - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-blocks/media/zoom-in.svg b/packages/scratch-blocks/media/zoom-in.svg deleted file mode 100644 index a3bed5c26..000000000 --- a/packages/scratch-blocks/media/zoom-in.svg +++ /dev/null @@ -1 +0,0 @@ -zoom-in \ No newline at end of file diff --git a/packages/scratch-blocks/media/zoom-out.svg b/packages/scratch-blocks/media/zoom-out.svg deleted file mode 100644 index 637973fb9..000000000 --- a/packages/scratch-blocks/media/zoom-out.svg +++ /dev/null @@ -1 +0,0 @@ -zoom-out \ No newline at end of file diff --git a/packages/scratch-blocks/media/zoom-reset.svg b/packages/scratch-blocks/media/zoom-reset.svg deleted file mode 100644 index 8089bf9f4..000000000 --- a/packages/scratch-blocks/media/zoom-reset.svg +++ /dev/null @@ -1 +0,0 @@ -zoom-reset \ No newline at end of file diff --git a/packages/scratch-blocks/msg/js/en.js b/packages/scratch-blocks/msg/js/en.js deleted file mode 100644 index 7edcb84a2..000000000 --- a/packages/scratch-blocks/msg/js/en.js +++ /dev/null @@ -1,289 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.Msg.en'); -goog.require('Blockly.Msg'); - -Blockly.Msg["CONTROL_FOREVER"] = "forever"; -Blockly.Msg["CONTROL_REPEAT"] = "repeat %1"; -Blockly.Msg["CONTROL_IF"] = "if %1 then"; -Blockly.Msg["CONTROL_ELSE"] = "else"; -Blockly.Msg["CONTROL_STOP"] = "stop"; -Blockly.Msg["CONTROL_STOP_ALL"] = "all"; -Blockly.Msg["CONTROL_STOP_THIS"] = "this script"; -Blockly.Msg["CONTROL_STOP_OTHER"] = "other scripts in sprite"; -Blockly.Msg["CONTROL_WAIT"] = "wait %1 seconds"; -Blockly.Msg["CONTROL_WAITUNTIL"] = "wait until %1"; -Blockly.Msg["CONTROL_REPEATUNTIL"] = "repeat until %1"; -Blockly.Msg["CONTROL_WHILE"] = "while %1"; -Blockly.Msg["CONTROL_FOREACH"] = "for each %1 in %2"; -Blockly.Msg["CONTROL_STARTASCLONE"] = "when I start as a clone"; -Blockly.Msg["CONTROL_CREATECLONEOF"] = "create clone of %1"; -Blockly.Msg["CONTROL_CREATECLONEOF_MYSELF"] = "myself"; -Blockly.Msg["CONTROL_DELETETHISCLONE"] = "delete this clone"; -Blockly.Msg["CONTROL_COUNTER"] = "counter"; -Blockly.Msg["CONTROL_INCRCOUNTER"] = "increment counter"; -Blockly.Msg["CONTROL_CLEARCOUNTER"] = "clear counter"; -Blockly.Msg["CONTROL_ALLATONCE"] = "all at once"; -Blockly.Msg["DATA_SETVARIABLETO"] = "set %1 to %2"; -Blockly.Msg["DATA_CHANGEVARIABLEBY"] = "change %1 by %2"; -Blockly.Msg["DATA_SHOWVARIABLE"] = "show variable %1"; -Blockly.Msg["DATA_HIDEVARIABLE"] = "hide variable %1"; -Blockly.Msg["DATA_ADDTOLIST"] = "add %1 to %2"; -Blockly.Msg["DATA_DELETEOFLIST"] = "delete %1 of %2"; -Blockly.Msg["DATA_DELETEALLOFLIST"] = "delete all of %1"; -Blockly.Msg["DATA_INSERTATLIST"] = "insert %1 at %2 of %3"; -Blockly.Msg["DATA_REPLACEITEMOFLIST"] = "replace item %1 of %2 with %3"; -Blockly.Msg["DATA_ITEMOFLIST"] = "item %1 of %2"; -Blockly.Msg["DATA_ITEMNUMOFLIST"] = "item # of %1 in %2"; -Blockly.Msg["DATA_LENGTHOFLIST"] = "length of %1"; -Blockly.Msg["DATA_LISTCONTAINSITEM"] = "%1 contains %2?"; -Blockly.Msg["DATA_SHOWLIST"] = "show list %1"; -Blockly.Msg["DATA_HIDELIST"] = "hide list %1"; -Blockly.Msg["DATA_INDEX_ALL"] = "all"; -Blockly.Msg["DATA_INDEX_LAST"] = "last"; -Blockly.Msg["DATA_INDEX_RANDOM"] = "random"; -Blockly.Msg["EVENT_WHENFLAGCLICKED"] = "when %1 clicked"; -Blockly.Msg["EVENT_WHENTHISSPRITECLICKED"] = "when this sprite clicked"; -Blockly.Msg["EVENT_WHENSTAGECLICKED"] = "when stage clicked"; -Blockly.Msg["EVENT_WHENTOUCHINGOBJECT"] = "when this sprite touches %1"; -Blockly.Msg["EVENT_WHENBROADCASTRECEIVED"] = "when I receive %1"; -Blockly.Msg["EVENT_WHENBACKDROPSWITCHESTO"] = "when backdrop switches to %1"; -Blockly.Msg["EVENT_WHENGREATERTHAN"] = "when %1 > %2"; -Blockly.Msg["EVENT_WHENGREATERTHAN_TIMER"] = "timer"; -Blockly.Msg["EVENT_WHENGREATERTHAN_LOUDNESS"] = "loudness"; -Blockly.Msg["EVENT_BROADCAST"] = "broadcast %1"; -Blockly.Msg["EVENT_BROADCASTANDWAIT"] = "broadcast %1 and wait"; -Blockly.Msg["EVENT_WHENKEYPRESSED"] = "when %1 key pressed"; -Blockly.Msg["EVENT_WHENKEYPRESSED_SPACE"] = "space"; -Blockly.Msg["EVENT_WHENKEYPRESSED_LEFT"] = "left arrow"; -Blockly.Msg["EVENT_WHENKEYPRESSED_RIGHT"] = "right arrow"; -Blockly.Msg["EVENT_WHENKEYPRESSED_DOWN"] = "down arrow"; -Blockly.Msg["EVENT_WHENKEYPRESSED_UP"] = "up arrow"; -Blockly.Msg["EVENT_WHENKEYPRESSED_ANY"] = "any"; -Blockly.Msg["LOOKS_SAYFORSECS"] = "say %1 for %2 seconds"; -Blockly.Msg["LOOKS_SAY"] = "say %1"; -Blockly.Msg["LOOKS_HELLO"] = "Hello!"; -Blockly.Msg["LOOKS_THINKFORSECS"] = "think %1 for %2 seconds"; -Blockly.Msg["LOOKS_THINK"] = "think %1"; -Blockly.Msg["LOOKS_HMM"] = "Hmm..."; -Blockly.Msg["LOOKS_SHOW"] = "show"; -Blockly.Msg["LOOKS_HIDE"] = "hide"; -Blockly.Msg["LOOKS_HIDEALLSPRITES"] = "hide all sprites"; -Blockly.Msg["LOOKS_EFFECT_COLOR"] = "color"; -Blockly.Msg["LOOKS_EFFECT_FISHEYE"] = "fisheye"; -Blockly.Msg["LOOKS_EFFECT_WHIRL"] = "whirl"; -Blockly.Msg["LOOKS_EFFECT_PIXELATE"] = "pixelate"; -Blockly.Msg["LOOKS_EFFECT_MOSAIC"] = "mosaic"; -Blockly.Msg["LOOKS_EFFECT_BRIGHTNESS"] = "brightness"; -Blockly.Msg["LOOKS_EFFECT_GHOST"] = "ghost"; -Blockly.Msg["LOOKS_CHANGEEFFECTBY"] = "change %1 effect by %2"; -Blockly.Msg["LOOKS_SETEFFECTTO"] = "set %1 effect to %2"; -Blockly.Msg["LOOKS_CLEARGRAPHICEFFECTS"] = "clear graphic effects"; -Blockly.Msg["LOOKS_CHANGESIZEBY"] = "change size by %1"; -Blockly.Msg["LOOKS_SETSIZETO"] = "set size to %1 %"; -Blockly.Msg["LOOKS_SIZE"] = "size"; -Blockly.Msg["LOOKS_CHANGESTRETCHBY"] = "change stretch by %1"; -Blockly.Msg["LOOKS_SETSTRETCHTO"] = "set stretch to %1 %"; -Blockly.Msg["LOOKS_SWITCHCOSTUMETO"] = "switch costume to %1"; -Blockly.Msg["LOOKS_NEXTCOSTUME"] = "next costume"; -Blockly.Msg["LOOKS_SWITCHBACKDROPTO"] = "switch backdrop to %1"; -Blockly.Msg["LOOKS_GOTOFRONTBACK"] = "go to %1 layer"; -Blockly.Msg["LOOKS_GOTOFRONTBACK_FRONT"] = "front"; -Blockly.Msg["LOOKS_GOTOFRONTBACK_BACK"] = "back"; -Blockly.Msg["LOOKS_GOFORWARDBACKWARDLAYERS"] = "go %1 %2 layers"; -Blockly.Msg["LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD"] = "forward"; -Blockly.Msg["LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD"] = "backward"; -Blockly.Msg["LOOKS_BACKDROPNUMBERNAME"] = "backdrop %1"; -Blockly.Msg["LOOKS_COSTUMENUMBERNAME"] = "costume %1"; -Blockly.Msg["LOOKS_NUMBERNAME_NUMBER"] = "number"; -Blockly.Msg["LOOKS_NUMBERNAME_NAME"] = "name"; -Blockly.Msg["LOOKS_SWITCHBACKDROPTOANDWAIT"] = "switch backdrop to %1 and wait"; -Blockly.Msg["LOOKS_NEXTBACKDROP_BLOCK"] = "next backdrop"; -Blockly.Msg["LOOKS_NEXTBACKDROP"] = "next backdrop"; -Blockly.Msg["LOOKS_PREVIOUSBACKDROP"] = "previous backdrop"; -Blockly.Msg["LOOKS_RANDOMBACKDROP"] = "random backdrop"; -Blockly.Msg["MOTION_MOVESTEPS"] = "move %1 steps"; -Blockly.Msg["MOTION_TURNLEFT"] = "turn %1 %2 degrees"; -Blockly.Msg["MOTION_TURNRIGHT"] = "turn %1 %2 degrees"; -Blockly.Msg["MOTION_POINTINDIRECTION"] = "point in direction %1"; -Blockly.Msg["MOTION_POINTTOWARDS"] = "point towards %1"; -Blockly.Msg["MOTION_POINTTOWARDS_POINTER"] = "mouse-pointer"; -Blockly.Msg["MOTION_POINTTOWARDS_RANDOM"] = "random direction"; -Blockly.Msg["MOTION_GOTO"] = "go to %1"; -Blockly.Msg["MOTION_GOTO_POINTER"] = "mouse-pointer"; -Blockly.Msg["MOTION_GOTO_RANDOM"] = "random position"; -Blockly.Msg["MOTION_GOTOXY"] = "go to x: %1 y: %2"; -Blockly.Msg["MOTION_GLIDESECSTOXY"] = "glide %1 secs to x: %2 y: %3"; -Blockly.Msg["MOTION_GLIDETO"] = "glide %1 secs to %2"; -Blockly.Msg["MOTION_GLIDETO_POINTER"] = "mouse-pointer"; -Blockly.Msg["MOTION_GLIDETO_RANDOM"] = "random position"; -Blockly.Msg["MOTION_CHANGEXBY"] = "change x by %1"; -Blockly.Msg["MOTION_SETX"] = "set x to %1"; -Blockly.Msg["MOTION_CHANGEYBY"] = "change y by %1"; -Blockly.Msg["MOTION_SETY"] = "set y to %1"; -Blockly.Msg["MOTION_IFONEDGEBOUNCE"] = "if on edge, bounce"; -Blockly.Msg["MOTION_SETROTATIONSTYLE"] = "set rotation style %1"; -Blockly.Msg["MOTION_SETROTATIONSTYLE_LEFTRIGHT"] = "left-right"; -Blockly.Msg["MOTION_SETROTATIONSTYLE_DONTROTATE"] = "don't rotate"; -Blockly.Msg["MOTION_SETROTATIONSTYLE_ALLAROUND"] = "all around"; -Blockly.Msg["MOTION_XPOSITION"] = "x position"; -Blockly.Msg["MOTION_YPOSITION"] = "y position"; -Blockly.Msg["MOTION_DIRECTION"] = "direction"; -Blockly.Msg["MOTION_SCROLLRIGHT"] = "scroll right %1"; -Blockly.Msg["MOTION_SCROLLUP"] = "scroll up %1"; -Blockly.Msg["MOTION_ALIGNSCENE"] = "align scene %1"; -Blockly.Msg["MOTION_ALIGNSCENE_BOTTOMLEFT"] = "bottom-left"; -Blockly.Msg["MOTION_ALIGNSCENE_BOTTOMRIGHT"] = "bottom-right"; -Blockly.Msg["MOTION_ALIGNSCENE_MIDDLE"] = "middle"; -Blockly.Msg["MOTION_ALIGNSCENE_TOPLEFT"] = "top-left"; -Blockly.Msg["MOTION_ALIGNSCENE_TOPRIGHT"] = "top-right"; -Blockly.Msg["MOTION_XSCROLL"] = "x scroll"; -Blockly.Msg["MOTION_YSCROLL"] = "y scroll"; -Blockly.Msg["MOTION_STAGE_SELECTED"] = "Stage selected: no motion blocks"; -Blockly.Msg["OPERATORS_ADD"] = "%1 + %2"; -Blockly.Msg["OPERATORS_SUBTRACT"] = "%1 - %2"; -Blockly.Msg["OPERATORS_MULTIPLY"] = "%1 * %2"; -Blockly.Msg["OPERATORS_DIVIDE"] = "%1 / %2"; -Blockly.Msg["OPERATORS_RANDOM"] = "pick random %1 to %2"; -Blockly.Msg["OPERATORS_GT"] = "%1 > %2"; -Blockly.Msg["OPERATORS_LT"] = "%1 < %2"; -Blockly.Msg["OPERATORS_EQUALS"] = "%1 = %2"; -Blockly.Msg["OPERATORS_AND"] = "%1 and %2"; -Blockly.Msg["OPERATORS_OR"] = "%1 or %2"; -Blockly.Msg["OPERATORS_NOT"] = "not %1"; -Blockly.Msg["OPERATORS_JOIN"] = "join %1 %2"; -Blockly.Msg["OPERATORS_JOIN_APPLE"] = "apple"; -Blockly.Msg["OPERATORS_JOIN_BANANA"] = "banana"; -Blockly.Msg["OPERATORS_LETTEROF"] = "letter %1 of %2"; -Blockly.Msg["OPERATORS_LETTEROF_APPLE"] = "a"; -Blockly.Msg["OPERATORS_LENGTH"] = "length of %1"; -Blockly.Msg["OPERATORS_CONTAINS"] = "%1 contains %2?"; -Blockly.Msg["OPERATORS_MOD"] = "%1 mod %2"; -Blockly.Msg["OPERATORS_ROUND"] = "round %1"; -Blockly.Msg["OPERATORS_MATHOP"] = "%1 of %2"; -Blockly.Msg["OPERATORS_MATHOP_ABS"] = "abs"; -Blockly.Msg["OPERATORS_MATHOP_FLOOR"] = "floor"; -Blockly.Msg["OPERATORS_MATHOP_CEILING"] = "ceiling"; -Blockly.Msg["OPERATORS_MATHOP_SQRT"] = "sqrt"; -Blockly.Msg["OPERATORS_MATHOP_SIN"] = "sin"; -Blockly.Msg["OPERATORS_MATHOP_COS"] = "cos"; -Blockly.Msg["OPERATORS_MATHOP_TAN"] = "tan"; -Blockly.Msg["OPERATORS_MATHOP_ASIN"] = "asin"; -Blockly.Msg["OPERATORS_MATHOP_ACOS"] = "acos"; -Blockly.Msg["OPERATORS_MATHOP_ATAN"] = "atan"; -Blockly.Msg["OPERATORS_MATHOP_LN"] = "ln"; -Blockly.Msg["OPERATORS_MATHOP_LOG"] = "log"; -Blockly.Msg["OPERATORS_MATHOP_EEXP"] = "e ^"; -Blockly.Msg["OPERATORS_MATHOP_10EXP"] = "10 ^"; -Blockly.Msg["PROCEDURES_DEFINITION"] = "define %1"; -Blockly.Msg["SENSING_TOUCHINGOBJECT"] = "touching %1?"; -Blockly.Msg["SENSING_TOUCHINGOBJECT_POINTER"] = "mouse-pointer"; -Blockly.Msg["SENSING_TOUCHINGOBJECT_EDGE"] = "edge"; -Blockly.Msg["SENSING_TOUCHINGCOLOR"] = "touching color %1?"; -Blockly.Msg["SENSING_COLORISTOUCHINGCOLOR"] = "color %1 is touching %2?"; -Blockly.Msg["SENSING_DISTANCETO"] = "distance to %1"; -Blockly.Msg["SENSING_DISTANCETO_POINTER"] = "mouse-pointer"; -Blockly.Msg["SENSING_ASKANDWAIT"] = "ask %1 and wait"; -Blockly.Msg["SENSING_ASK_TEXT"] = "What's your name?"; -Blockly.Msg["SENSING_ANSWER"] = "answer"; -Blockly.Msg["SENSING_KEYPRESSED"] = "key %1 pressed?"; -Blockly.Msg["SENSING_MOUSEDOWN"] = "mouse down?"; -Blockly.Msg["SENSING_MOUSEX"] = "mouse x"; -Blockly.Msg["SENSING_MOUSEY"] = "mouse y"; -Blockly.Msg["SENSING_SETDRAGMODE"] = "set drag mode %1"; -Blockly.Msg["SENSING_SETDRAGMODE_DRAGGABLE"] = "draggable"; -Blockly.Msg["SENSING_SETDRAGMODE_NOTDRAGGABLE"] = "not draggable"; -Blockly.Msg["SENSING_LOUDNESS"] = "loudness"; -Blockly.Msg["SENSING_LOUD"] = "loud?"; -Blockly.Msg["SENSING_TIMER"] = "timer"; -Blockly.Msg["SENSING_RESETTIMER"] = "reset timer"; -Blockly.Msg["SENSING_OF"] = "%1 of %2"; -Blockly.Msg["SENSING_OF_XPOSITION"] = "x position"; -Blockly.Msg["SENSING_OF_YPOSITION"] = "y position"; -Blockly.Msg["SENSING_OF_DIRECTION"] = "direction"; -Blockly.Msg["SENSING_OF_COSTUMENUMBER"] = "costume #"; -Blockly.Msg["SENSING_OF_COSTUMENAME"] = "costume name"; -Blockly.Msg["SENSING_OF_SIZE"] = "size"; -Blockly.Msg["SENSING_OF_VOLUME"] = "volume"; -Blockly.Msg["SENSING_OF_BACKDROPNUMBER"] = "backdrop #"; -Blockly.Msg["SENSING_OF_BACKDROPNAME"] = "backdrop name"; -Blockly.Msg["SENSING_OF_STAGE"] = "Stage"; -Blockly.Msg["SENSING_CURRENT"] = "current %1"; -Blockly.Msg["SENSING_CURRENT_YEAR"] = "year"; -Blockly.Msg["SENSING_CURRENT_MONTH"] = "month"; -Blockly.Msg["SENSING_CURRENT_DATE"] = "date"; -Blockly.Msg["SENSING_CURRENT_DAYOFWEEK"] = "day of week"; -Blockly.Msg["SENSING_CURRENT_HOUR"] = "hour"; -Blockly.Msg["SENSING_CURRENT_MINUTE"] = "minute"; -Blockly.Msg["SENSING_CURRENT_SECOND"] = "second"; -Blockly.Msg["SENSING_DAYSSINCE2000"] = "days since 2000"; -Blockly.Msg["SENSING_USERNAME"] = "username"; -Blockly.Msg["SENSING_USERID"] = "user id"; -Blockly.Msg["SOUND_PLAY"] = "start sound %1"; -Blockly.Msg["SOUND_PLAYUNTILDONE"] = "play sound %1 until done"; -Blockly.Msg["SOUND_STOPALLSOUNDS"] = "stop all sounds"; -Blockly.Msg["SOUND_SETEFFECTO"] = "set %1 effect to %2"; -Blockly.Msg["SOUND_CHANGEEFFECTBY"] = "change %1 effect by %2"; -Blockly.Msg["SOUND_CLEAREFFECTS"] = "clear sound effects"; -Blockly.Msg["SOUND_EFFECTS_PITCH"] = "pitch"; -Blockly.Msg["SOUND_EFFECTS_PAN"] = "pan left/right"; -Blockly.Msg["SOUND_CHANGEVOLUMEBY"] = "change volume by %1"; -Blockly.Msg["SOUND_SETVOLUMETO"] = "set volume to %1%"; -Blockly.Msg["SOUND_VOLUME"] = "volume"; -Blockly.Msg["SOUND_RECORD"] = "record..."; -Blockly.Msg["CATEGORY_MOTION"] = "Motion"; -Blockly.Msg["CATEGORY_LOOKS"] = "Looks"; -Blockly.Msg["CATEGORY_SOUND"] = "Sound"; -Blockly.Msg["CATEGORY_EVENTS"] = "Events"; -Blockly.Msg["CATEGORY_CONTROL"] = "Control"; -Blockly.Msg["CATEGORY_SENSING"] = "Sensing"; -Blockly.Msg["CATEGORY_OPERATORS"] = "Operators"; -Blockly.Msg["CATEGORY_VARIABLES"] = "Variables"; -Blockly.Msg["CATEGORY_MYBLOCKS"] = "My Blocks"; -Blockly.Msg["DUPLICATE"] = "Duplicate"; -Blockly.Msg["DELETE"] = "Delete"; -Blockly.Msg["ADD_COMMENT"] = "Add Comment"; -Blockly.Msg["REMOVE_COMMENT"] = "Remove Comment"; -Blockly.Msg["DELETE_BLOCK"] = "Delete Block"; -Blockly.Msg["DELETE_X_BLOCKS"] = "Delete %1 Blocks"; -Blockly.Msg["DELETE_ALL_BLOCKS"] = "Delete all %1 blocks?"; -Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; -Blockly.Msg["HELP"] = "Help"; -Blockly.Msg["UNDO"] = "Undo"; -Blockly.Msg["REDO"] = "Redo"; -Blockly.Msg["EDIT_PROCEDURE"] = "Edit"; -Blockly.Msg["SHOW_PROCEDURE_DEFINITION"] = "Go to definition"; -Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; -Blockly.Msg["COLOUR_HUE_LABEL"] = "Color"; -Blockly.Msg["COLOUR_SATURATION_LABEL"] = "Saturation"; -Blockly.Msg["COLOUR_BRIGHTNESS_LABEL"] = "Brightness"; -Blockly.Msg["CHANGE_VALUE_TITLE"] = "Change value:"; -Blockly.Msg["RENAME_VARIABLE"] = "Rename variable"; -Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Rename all \"%1\" variables to:"; -Blockly.Msg["RENAME_VARIABLE_MODAL_TITLE"] = "Rename Variable"; -Blockly.Msg["NEW_VARIABLE"] = "Make a Variable"; -Blockly.Msg["NEW_VARIABLE_TITLE"] = "New variable name:"; -Blockly.Msg["VARIABLE_MODAL_TITLE"] = "New Variable"; -Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named \"%1\" already exists."; -Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named \"%1\" already exists for another variable of type \"%2\"."; -Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the \"%2\" variable?"; -Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\""; -Blockly.Msg["DELETE_VARIABLE"] = "Delete the \"%1\" variable"; -Blockly.Msg["NEW_PROCEDURE"] = "Make a Block"; -Blockly.Msg["PROCEDURE_ALREADY_EXISTS"] = "A procedure named \"%1\" already exists."; -Blockly.Msg["PROCEDURE_DEFAULT_NAME"] = "block name"; -Blockly.Msg["NEW_LIST"] = "Make a List"; -Blockly.Msg["NEW_LIST_TITLE"] = "New list name:"; -Blockly.Msg["LIST_MODAL_TITLE"] = "New List"; -Blockly.Msg["LIST_ALREADY_EXISTS"] = "A list named \"%1\" already exists."; -Blockly.Msg["RENAME_LIST_TITLE"] = "Rename all \"%1\" lists to:"; -Blockly.Msg["RENAME_LIST_MODAL_TITLE"] = "Rename List"; -Blockly.Msg["DEFAULT_LIST_ITEM"] = "thing"; -Blockly.Msg["DELETE_LIST"] = "Delete the \"%1\" list"; -Blockly.Msg["RENAME_LIST"] = "Rename list"; -Blockly.Msg["NEW_BROADCAST_MESSAGE"] = "New message"; -Blockly.Msg["NEW_BROADCAST_MESSAGE_TITLE"] = "New message name:"; -Blockly.Msg["BROADCAST_MODAL_TITLE"] = "New Message"; -Blockly.Msg["DEFAULT_BROADCAST_MESSAGE_NAME"] = "message1"; diff --git a/packages/scratch-blocks/msg/json/en.json b/packages/scratch-blocks/msg/json/en.json deleted file mode 100644 index 5bd9750f5..000000000 --- a/packages/scratch-blocks/msg/json/en.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "CONTROL_FOREVER": "forever", - "CONTROL_REPEAT": "repeat %1", - "CONTROL_IF": "if %1 then", - "CONTROL_ELSE": "else", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "all", - "CONTROL_STOP_THIS": "this script", - "CONTROL_STOP_OTHER": "other scripts in sprite", - "CONTROL_WAIT": "wait %1 seconds", - "CONTROL_WAITUNTIL": "wait until %1", - "CONTROL_REPEATUNTIL": "repeat until %1", - "CONTROL_WHILE": "while %1", - "CONTROL_FOREACH": "for each %1 in %2", - "CONTROL_STARTASCLONE": "when I start as a clone", - "CONTROL_CREATECLONEOF": "create clone of %1", - "CONTROL_CREATECLONEOF_MYSELF": "myself", - "CONTROL_DELETETHISCLONE": "delete this clone", - "CONTROL_COUNTER": "counter", - "CONTROL_INCRCOUNTER": "increment counter", - "CONTROL_CLEARCOUNTER": "clear counter", - "CONTROL_ALLATONCE": "all at once", - "DATA_SETVARIABLETO": "set %1 to %2", - "DATA_CHANGEVARIABLEBY": "change %1 by %2", - "DATA_SHOWVARIABLE": "show variable %1", - "DATA_HIDEVARIABLE": "hide variable %1", - "DATA_ADDTOLIST": "add %1 to %2", - "DATA_DELETEOFLIST": "delete %1 of %2", - "DATA_DELETEALLOFLIST": "delete all of %1", - "DATA_INSERTATLIST": "insert %1 at %2 of %3", - "DATA_REPLACEITEMOFLIST": "replace item %1 of %2 with %3", - "DATA_ITEMOFLIST": "item %1 of %2", - "DATA_ITEMNUMOFLIST": "item # of %1 in %2", - "DATA_LENGTHOFLIST": "length of %1", - "DATA_LISTCONTAINSITEM": "%1 contains %2?", - "DATA_SHOWLIST": "show list %1", - "DATA_HIDELIST": "hide list %1", - "DATA_INDEX_ALL": "all", - "DATA_INDEX_LAST": "last", - "DATA_INDEX_RANDOM": "random", - "EVENT_WHENFLAGCLICKED": "when %1 clicked", - "EVENT_WHENTHISSPRITECLICKED": "when this sprite clicked", - "EVENT_WHENSTAGECLICKED": "when stage clicked", - "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", - "EVENT_WHENBROADCASTRECEIVED": "when I receive %1", - "EVENT_WHENBACKDROPSWITCHESTO": "when backdrop switches to %1", - "EVENT_WHENGREATERTHAN": "when %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "timer", - "EVENT_WHENGREATERTHAN_LOUDNESS": "loudness", - "EVENT_BROADCAST": "broadcast %1", - "EVENT_BROADCASTANDWAIT": "broadcast %1 and wait", - "EVENT_WHENKEYPRESSED": "when %1 key pressed", - "EVENT_WHENKEYPRESSED_SPACE": "space", - "EVENT_WHENKEYPRESSED_LEFT": "left arrow", - "EVENT_WHENKEYPRESSED_RIGHT": "right arrow", - "EVENT_WHENKEYPRESSED_DOWN": "down arrow", - "EVENT_WHENKEYPRESSED_UP": "up arrow", - "EVENT_WHENKEYPRESSED_ANY": "any", - "LOOKS_SAYFORSECS": "say %1 for %2 seconds", - "LOOKS_SAY": "say %1", - "LOOKS_HELLO": "Hello!", - "LOOKS_THINKFORSECS": "think %1 for %2 seconds", - "LOOKS_THINK": "think %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "show", - "LOOKS_HIDE": "hide", - "LOOKS_HIDEALLSPRITES": "hide all sprites", - "LOOKS_EFFECT_COLOR": "color", - "LOOKS_EFFECT_FISHEYE": "fisheye", - "LOOKS_EFFECT_WHIRL": "whirl", - "LOOKS_EFFECT_PIXELATE": "pixelate", - "LOOKS_EFFECT_MOSAIC": "mosaic", - "LOOKS_EFFECT_BRIGHTNESS": "brightness", - "LOOKS_EFFECT_GHOST": "ghost", - "LOOKS_CHANGEEFFECTBY": "change %1 effect by %2", - "LOOKS_SETEFFECTTO": "set %1 effect to %2", - "LOOKS_CLEARGRAPHICEFFECTS": "clear graphic effects", - "LOOKS_CHANGESIZEBY": "change size by %1", - "LOOKS_SETSIZETO": "set size to %1 %", - "LOOKS_SIZE": "size", - "LOOKS_CHANGESTRETCHBY": "change stretch by %1", - "LOOKS_SETSTRETCHTO": "set stretch to %1 %", - "LOOKS_SWITCHCOSTUMETO": "switch costume to %1", - "LOOKS_NEXTCOSTUME": "next costume", - "LOOKS_SWITCHBACKDROPTO": "switch backdrop to %1", - "LOOKS_GOTOFRONTBACK": "go to %1 layer", - "LOOKS_GOTOFRONTBACK_FRONT": "front", - "LOOKS_GOTOFRONTBACK_BACK": "back", - "LOOKS_GOFORWARDBACKWARDLAYERS": "go %1 %2 layers", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "forward", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "backward", - "LOOKS_BACKDROPNUMBERNAME": "backdrop %1", - "LOOKS_COSTUMENUMBERNAME": "costume %1", - "LOOKS_NUMBERNAME_NUMBER": "number", - "LOOKS_NUMBERNAME_NAME": "name", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "switch backdrop to %1 and wait", - "LOOKS_NEXTBACKDROP_BLOCK": "next backdrop", - "LOOKS_NEXTBACKDROP": "next backdrop", - "LOOKS_PREVIOUSBACKDROP": "previous backdrop", - "LOOKS_RANDOMBACKDROP": "random backdrop", - "MOTION_MOVESTEPS": "move %1 steps", - "MOTION_TURNLEFT": "turn %1 %2 degrees", - "MOTION_TURNRIGHT": "turn %1 %2 degrees", - "MOTION_POINTINDIRECTION": "point in direction %1", - "MOTION_POINTTOWARDS": "point towards %1", - "MOTION_POINTTOWARDS_POINTER": "mouse-pointer", - "MOTION_POINTTOWARDS_RANDOM": "random direction", - "MOTION_GOTO": "go to %1", - "MOTION_GOTO_POINTER": "mouse-pointer", - "MOTION_GOTO_RANDOM": "random position", - "MOTION_GOTOXY": "go to x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "glide %1 secs to x: %2 y: %3", - "MOTION_GLIDETO": "glide %1 secs to %2", - "MOTION_GLIDETO_POINTER": "mouse-pointer", - "MOTION_GLIDETO_RANDOM": "random position", - "MOTION_CHANGEXBY": "change x by %1", - "MOTION_SETX": "set x to %1", - "MOTION_CHANGEYBY": "change y by %1", - "MOTION_SETY": "set y to %1", - "MOTION_IFONEDGEBOUNCE": "if on edge, bounce", - "MOTION_SETROTATIONSTYLE": "set rotation style %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "left-right", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "don't rotate", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "all around", - "MOTION_XPOSITION": "x position", - "MOTION_YPOSITION": "y position", - "MOTION_DIRECTION": "direction", - "MOTION_SCROLLRIGHT": "scroll right %1", - "MOTION_SCROLLUP": "scroll up %1", - "MOTION_ALIGNSCENE": "align scene %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "bottom-left", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bottom-right", - "MOTION_ALIGNSCENE_MIDDLE": "middle", - "MOTION_ALIGNSCENE_TOPLEFT": "top-left", - "MOTION_ALIGNSCENE_TOPRIGHT": "top-right", - "MOTION_XSCROLL": "x scroll", - "MOTION_YSCROLL": "y scroll", - "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "pick random %1 to %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 and %2", - "OPERATORS_OR": "%1 or %2", - "OPERATORS_NOT": "not %1", - "OPERATORS_JOIN": "join %1 %2", - "OPERATORS_JOIN_APPLE": "apple", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "letter %1 of %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "length of %1", - "OPERATORS_CONTAINS": "%1 contains %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "round %1", - "OPERATORS_MATHOP": "%1 of %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "floor", - "OPERATORS_MATHOP_CEILING": "ceiling", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "define %1", - "SENSING_TOUCHINGOBJECT": "touching %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "mouse-pointer", - "SENSING_TOUCHINGOBJECT_EDGE": "edge", - "SENSING_TOUCHINGCOLOR": "touching color %1?", - "SENSING_COLORISTOUCHINGCOLOR": "color %1 is touching %2?", - "SENSING_DISTANCETO": "distance to %1", - "SENSING_DISTANCETO_POINTER": "mouse-pointer", - "SENSING_ASKANDWAIT": "ask %1 and wait", - "SENSING_ASK_TEXT": "What's your name?", - "SENSING_ANSWER": "answer", - "SENSING_KEYPRESSED": "key %1 pressed?", - "SENSING_MOUSEDOWN": "mouse down?", - "SENSING_MOUSEX": "mouse x", - "SENSING_MOUSEY": "mouse y", - "SENSING_SETDRAGMODE": "set drag mode %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "draggable", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "not draggable", - "SENSING_LOUDNESS": "loudness", - "SENSING_LOUD": "loud?", - "SENSING_TIMER": "timer", - "SENSING_RESETTIMER": "reset timer", - "SENSING_OF": "%1 of %2", - "SENSING_OF_XPOSITION": "x position", - "SENSING_OF_YPOSITION": "y position", - "SENSING_OF_DIRECTION": "direction", - "SENSING_OF_COSTUMENUMBER": "costume #", - "SENSING_OF_COSTUMENAME": "costume name", - "SENSING_OF_SIZE": "size", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "backdrop #", - "SENSING_OF_BACKDROPNAME": "backdrop name", - "SENSING_OF_STAGE": "Stage", - "SENSING_CURRENT": "current %1", - "SENSING_CURRENT_YEAR": "year", - "SENSING_CURRENT_MONTH": "month", - "SENSING_CURRENT_DATE": "date", - "SENSING_CURRENT_DAYOFWEEK": "day of week", - "SENSING_CURRENT_HOUR": "hour", - "SENSING_CURRENT_MINUTE": "minute", - "SENSING_CURRENT_SECOND": "second", - "SENSING_DAYSSINCE2000": "days since 2000", - "SENSING_USERNAME": "username", - "SENSING_USERID": "user id", - "SOUND_PLAY": "start sound %1", - "SOUND_PLAYUNTILDONE": "play sound %1 until done", - "SOUND_STOPALLSOUNDS": "stop all sounds", - "SOUND_SETEFFECTO": "set %1 effect to %2", - "SOUND_CHANGEEFFECTBY": "change %1 effect by %2", - "SOUND_CLEAREFFECTS": "clear sound effects", - "SOUND_EFFECTS_PITCH": "pitch", - "SOUND_EFFECTS_PAN": "pan left/right", - "SOUND_CHANGEVOLUMEBY": "change volume by %1", - "SOUND_SETVOLUMETO": "set volume to %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "record...", - "CATEGORY_MOTION": "Motion", - "CATEGORY_LOOKS": "Looks", - "CATEGORY_SOUND": "Sound", - "CATEGORY_EVENTS": "Events", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Sensing", - "CATEGORY_OPERATORS": "Operators", - "CATEGORY_VARIABLES": "Variables", - "CATEGORY_MYBLOCKS": "My Blocks", - "DUPLICATE": "Duplicate", - "DELETE": "Delete", - "ADD_COMMENT": "Add Comment", - "REMOVE_COMMENT": "Remove Comment", - "DELETE_BLOCK": "Delete Block", - "DELETE_X_BLOCKS": "Delete %1 Blocks", - "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", - "CLEAN_UP": "Clean up Blocks", - "HELP": "Help", - "UNDO": "Undo", - "REDO": "Redo", - "EDIT_PROCEDURE": "Edit", - "SHOW_PROCEDURE_DEFINITION": "Go to definition", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", - "COLOUR_HUE_LABEL": "Color", - "COLOUR_SATURATION_LABEL": "Saturation", - "COLOUR_BRIGHTNESS_LABEL": "Brightness", - "CHANGE_VALUE_TITLE": "Change value:", - "RENAME_VARIABLE": "Rename variable", - "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", - "RENAME_VARIABLE_MODAL_TITLE": "Rename Variable", - "NEW_VARIABLE": "Make a Variable", - "NEW_VARIABLE_TITLE": "New variable name:", - "VARIABLE_MODAL_TITLE": "New Variable", - "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", - "DELETE_VARIABLE": "Delete the \"%1\" variable", - "NEW_PROCEDURE": "Make a Block", - "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", - "PROCEDURE_DEFAULT_NAME": "block name", - "NEW_LIST": "Make a List", - "NEW_LIST_TITLE": "New list name:", - "LIST_MODAL_TITLE": "New List", - "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", - "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", - "RENAME_LIST_MODAL_TITLE": "Rename List", - "DEFAULT_LIST_ITEM": "thing", - "DELETE_LIST": "Delete the \"%1\" list", - "RENAME_LIST": "Rename list", - "NEW_BROADCAST_MESSAGE": "New message", - "NEW_BROADCAST_MESSAGE_TITLE": "New message name:", - "BROADCAST_MODAL_TITLE": "New Message", - "DEFAULT_BROADCAST_MESSAGE_NAME": "message1" -} \ No newline at end of file diff --git a/packages/scratch-blocks/msg/messages.js b/packages/scratch-blocks/msg/messages.js deleted file mode 100644 index 51b747873..000000000 --- a/packages/scratch-blocks/msg/messages.js +++ /dev/null @@ -1,352 +0,0 @@ -/** - * @license - * Visual Blocks Language - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview English strings. - * @author ascii@media.mit.edu (Andrew Sliwinski) - * - * After modifying this file, run `npm run translate` from the root directory - * to regenerate `./msg/json/en.json`. - * IMPORTANT: - * All message strings must use single quotes for the scripts to work properly - */ -'use strict'; - -goog.provide('Blockly.Msg.en'); - -goog.require('Blockly.Msg'); - -// Control blocks -Blockly.Msg.CONTROL_FOREVER = 'forever'; -Blockly.Msg.CONTROL_REPEAT = 'repeat %1'; -Blockly.Msg.CONTROL_IF = 'if %1 then'; -Blockly.Msg.CONTROL_ELSE = 'else'; -Blockly.Msg.CONTROL_STOP = 'stop'; -Blockly.Msg.CONTROL_STOP_ALL = 'all'; -Blockly.Msg.CONTROL_STOP_THIS = 'this script'; -Blockly.Msg.CONTROL_STOP_OTHER = 'other scripts in sprite'; -Blockly.Msg.CONTROL_WAIT = 'wait %1 seconds'; -Blockly.Msg.CONTROL_WAITUNTIL = 'wait until %1'; -Blockly.Msg.CONTROL_REPEATUNTIL = 'repeat until %1'; -Blockly.Msg.CONTROL_WHILE = 'while %1'; -Blockly.Msg.CONTROL_FOREACH = 'for each %1 in %2'; -Blockly.Msg.CONTROL_STARTASCLONE = 'when I start as a clone'; -Blockly.Msg.CONTROL_CREATECLONEOF = 'create clone of %1'; -Blockly.Msg.CONTROL_CREATECLONEOF_MYSELF = 'myself'; -Blockly.Msg.CONTROL_DELETETHISCLONE = 'delete this clone'; -Blockly.Msg.CONTROL_COUNTER = 'counter'; -Blockly.Msg.CONTROL_INCRCOUNTER = 'increment counter'; -Blockly.Msg.CONTROL_CLEARCOUNTER = 'clear counter'; -Blockly.Msg.CONTROL_ALLATONCE = 'all at once'; - -// Data blocks -Blockly.Msg.DATA_SETVARIABLETO = 'set %1 to %2'; -Blockly.Msg.DATA_CHANGEVARIABLEBY = 'change %1 by %2'; -Blockly.Msg.DATA_SHOWVARIABLE = 'show variable %1'; -Blockly.Msg.DATA_HIDEVARIABLE = 'hide variable %1'; -Blockly.Msg.DATA_ADDTOLIST = 'add %1 to %2'; -Blockly.Msg.DATA_DELETEOFLIST = 'delete %1 of %2'; -Blockly.Msg.DATA_DELETEALLOFLIST = 'delete all of %1'; -Blockly.Msg.DATA_INSERTATLIST = 'insert %1 at %2 of %3'; -Blockly.Msg.DATA_REPLACEITEMOFLIST = 'replace item %1 of %2 with %3'; -Blockly.Msg.DATA_ITEMOFLIST = 'item %1 of %2'; -Blockly.Msg.DATA_ITEMNUMOFLIST = 'item # of %1 in %2'; -Blockly.Msg.DATA_LENGTHOFLIST = 'length of %1'; -Blockly.Msg.DATA_LISTCONTAINSITEM = '%1 contains %2?'; -Blockly.Msg.DATA_SHOWLIST = 'show list %1'; -Blockly.Msg.DATA_HIDELIST = 'hide list %1'; -Blockly.Msg.DATA_INDEX_ALL = 'all'; -Blockly.Msg.DATA_INDEX_LAST = 'last'; -Blockly.Msg.DATA_INDEX_RANDOM = 'random'; - -// Event blocks -Blockly.Msg.EVENT_WHENFLAGCLICKED = 'when %1 clicked'; -Blockly.Msg.EVENT_WHENTHISSPRITECLICKED = 'when this sprite clicked'; -Blockly.Msg.EVENT_WHENSTAGECLICKED = 'when stage clicked'; -Blockly.Msg.EVENT_WHENTOUCHINGOBJECT = 'when this sprite touches %1'; -Blockly.Msg.EVENT_WHENBROADCASTRECEIVED = 'when I receive %1'; -Blockly.Msg.EVENT_WHENBACKDROPSWITCHESTO = 'when backdrop switches to %1'; -Blockly.Msg.EVENT_WHENGREATERTHAN = 'when %1 > %2'; -Blockly.Msg.EVENT_WHENGREATERTHAN_TIMER = 'timer'; -Blockly.Msg.EVENT_WHENGREATERTHAN_LOUDNESS = 'loudness'; -Blockly.Msg.EVENT_BROADCAST = 'broadcast %1'; -Blockly.Msg.EVENT_BROADCASTANDWAIT = 'broadcast %1 and wait'; -Blockly.Msg.EVENT_WHENKEYPRESSED = 'when %1 key pressed'; -Blockly.Msg.EVENT_WHENKEYPRESSED_SPACE = 'space'; -Blockly.Msg.EVENT_WHENKEYPRESSED_LEFT = 'left arrow'; -Blockly.Msg.EVENT_WHENKEYPRESSED_RIGHT = 'right arrow'; -Blockly.Msg.EVENT_WHENKEYPRESSED_DOWN = 'down arrow'; -Blockly.Msg.EVENT_WHENKEYPRESSED_UP = 'up arrow'; -Blockly.Msg.EVENT_WHENKEYPRESSED_ANY = 'any'; - -// Looks blocks -Blockly.Msg.LOOKS_SAYFORSECS = 'say %1 for %2 seconds'; -Blockly.Msg.LOOKS_SAY = 'say %1'; -Blockly.Msg.LOOKS_HELLO = 'Hello!'; -Blockly.Msg.LOOKS_THINKFORSECS = 'think %1 for %2 seconds'; -Blockly.Msg.LOOKS_THINK = 'think %1'; -Blockly.Msg.LOOKS_HMM = 'Hmm...'; -Blockly.Msg.LOOKS_SHOW = 'show'; -Blockly.Msg.LOOKS_HIDE = 'hide'; -Blockly.Msg.LOOKS_HIDEALLSPRITES = 'hide all sprites'; -Blockly.Msg.LOOKS_EFFECT_COLOR = 'color'; -Blockly.Msg.LOOKS_EFFECT_FISHEYE = 'fisheye'; -Blockly.Msg.LOOKS_EFFECT_WHIRL = 'whirl'; -Blockly.Msg.LOOKS_EFFECT_PIXELATE = 'pixelate'; -Blockly.Msg.LOOKS_EFFECT_MOSAIC = 'mosaic'; -Blockly.Msg.LOOKS_EFFECT_BRIGHTNESS = 'brightness'; -Blockly.Msg.LOOKS_EFFECT_GHOST = 'ghost'; -Blockly.Msg.LOOKS_CHANGEEFFECTBY = 'change %1 effect by %2'; -Blockly.Msg.LOOKS_SETEFFECTTO = 'set %1 effect to %2'; -Blockly.Msg.LOOKS_CLEARGRAPHICEFFECTS = 'clear graphic effects'; -Blockly.Msg.LOOKS_CHANGESIZEBY = 'change size by %1'; -Blockly.Msg.LOOKS_SETSIZETO = 'set size to %1 %'; -Blockly.Msg.LOOKS_SIZE = 'size'; -Blockly.Msg.LOOKS_CHANGESTRETCHBY = 'change stretch by %1'; -Blockly.Msg.LOOKS_SETSTRETCHTO = 'set stretch to %1 %'; -Blockly.Msg.LOOKS_SWITCHCOSTUMETO = 'switch costume to %1'; -Blockly.Msg.LOOKS_NEXTCOSTUME = 'next costume'; -Blockly.Msg.LOOKS_SWITCHBACKDROPTO = 'switch backdrop to %1'; -Blockly.Msg.LOOKS_GOTOFRONTBACK = 'go to %1 layer'; -Blockly.Msg.LOOKS_GOTOFRONTBACK_FRONT = 'front'; -Blockly.Msg.LOOKS_GOTOFRONTBACK_BACK = 'back'; -Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS = 'go %1 %2 layers'; -Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD = 'forward'; -Blockly.Msg.LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD = 'backward'; -Blockly.Msg.LOOKS_BACKDROPNUMBERNAME = 'backdrop %1'; -Blockly.Msg.LOOKS_COSTUMENUMBERNAME = 'costume %1'; -Blockly.Msg.LOOKS_NUMBERNAME_NUMBER = 'number'; -Blockly.Msg.LOOKS_NUMBERNAME_NAME = 'name'; -Blockly.Msg.LOOKS_SWITCHBACKDROPTOANDWAIT = 'switch backdrop to %1 and wait'; -Blockly.Msg.LOOKS_NEXTBACKDROP_BLOCK = 'next backdrop'; -Blockly.Msg.LOOKS_NEXTBACKDROP = 'next backdrop'; -Blockly.Msg.LOOKS_PREVIOUSBACKDROP = 'previous backdrop'; -Blockly.Msg.LOOKS_RANDOMBACKDROP = 'random backdrop'; - -// Motion blocks -Blockly.Msg.MOTION_MOVESTEPS = 'move %1 steps'; -Blockly.Msg.MOTION_TURNLEFT = 'turn %1 %2 degrees'; -Blockly.Msg.MOTION_TURNRIGHT = 'turn %1 %2 degrees'; -Blockly.Msg.MOTION_POINTINDIRECTION = 'point in direction %1'; -Blockly.Msg.MOTION_POINTTOWARDS = 'point towards %1'; -Blockly.Msg.MOTION_POINTTOWARDS_POINTER = 'mouse-pointer'; -Blockly.Msg.MOTION_POINTTOWARDS_RANDOM = 'random direction'; -Blockly.Msg.MOTION_GOTO = 'go to %1'; -Blockly.Msg.MOTION_GOTO_POINTER = 'mouse-pointer'; -Blockly.Msg.MOTION_GOTO_RANDOM = 'random position'; -Blockly.Msg.MOTION_GOTOXY = 'go to x: %1 y: %2'; -Blockly.Msg.MOTION_GLIDESECSTOXY = 'glide %1 secs to x: %2 y: %3'; -Blockly.Msg.MOTION_GLIDETO = 'glide %1 secs to %2'; -Blockly.Msg.MOTION_GLIDETO_POINTER = 'mouse-pointer'; -Blockly.Msg.MOTION_GLIDETO_RANDOM = 'random position'; -Blockly.Msg.MOTION_CHANGEXBY = 'change x by %1'; -Blockly.Msg.MOTION_SETX = 'set x to %1'; -Blockly.Msg.MOTION_CHANGEYBY = 'change y by %1'; -Blockly.Msg.MOTION_SETY = 'set y to %1'; -Blockly.Msg.MOTION_IFONEDGEBOUNCE = 'if on edge, bounce'; -Blockly.Msg.MOTION_SETROTATIONSTYLE = 'set rotation style %1'; -Blockly.Msg.MOTION_SETROTATIONSTYLE_LEFTRIGHT = 'left-right'; -Blockly.Msg.MOTION_SETROTATIONSTYLE_DONTROTATE = 'don\'t rotate'; -Blockly.Msg.MOTION_SETROTATIONSTYLE_ALLAROUND = 'all around'; -Blockly.Msg.MOTION_XPOSITION = 'x position'; -Blockly.Msg.MOTION_YPOSITION = 'y position'; -Blockly.Msg.MOTION_DIRECTION = 'direction'; -Blockly.Msg.MOTION_SCROLLRIGHT = 'scroll right %1'; -Blockly.Msg.MOTION_SCROLLUP = 'scroll up %1'; -Blockly.Msg.MOTION_ALIGNSCENE = 'align scene %1'; -Blockly.Msg.MOTION_ALIGNSCENE_BOTTOMLEFT = 'bottom-left'; -Blockly.Msg.MOTION_ALIGNSCENE_BOTTOMRIGHT = 'bottom-right'; -Blockly.Msg.MOTION_ALIGNSCENE_MIDDLE = 'middle'; -Blockly.Msg.MOTION_ALIGNSCENE_TOPLEFT = 'top-left'; -Blockly.Msg.MOTION_ALIGNSCENE_TOPRIGHT = 'top-right'; -Blockly.Msg.MOTION_XSCROLL = 'x scroll'; -Blockly.Msg.MOTION_YSCROLL = 'y scroll'; -Blockly.Msg.MOTION_STAGE_SELECTED = 'Stage selected: no motion blocks'; - -// Operators blocks -Blockly.Msg.OPERATORS_ADD = '%1 + %2'; -Blockly.Msg.OPERATORS_SUBTRACT = '%1 - %2'; -Blockly.Msg.OPERATORS_MULTIPLY = '%1 * %2'; -Blockly.Msg.OPERATORS_DIVIDE = '%1 / %2'; -Blockly.Msg.OPERATORS_RANDOM = 'pick random %1 to %2'; -Blockly.Msg.OPERATORS_GT = '%1 > %2'; -Blockly.Msg.OPERATORS_LT = '%1 < %2'; -Blockly.Msg.OPERATORS_EQUALS = '%1 = %2'; -Blockly.Msg.OPERATORS_AND = '%1 and %2'; -Blockly.Msg.OPERATORS_OR = '%1 or %2'; -Blockly.Msg.OPERATORS_NOT = 'not %1'; -Blockly.Msg.OPERATORS_JOIN = 'join %1 %2'; -Blockly.Msg.OPERATORS_JOIN_APPLE = 'apple'; -Blockly.Msg.OPERATORS_JOIN_BANANA = 'banana'; -Blockly.Msg.OPERATORS_LETTEROF = 'letter %1 of %2'; -Blockly.Msg.OPERATORS_LETTEROF_APPLE = 'a'; -Blockly.Msg.OPERATORS_LENGTH = 'length of %1'; -Blockly.Msg.OPERATORS_CONTAINS = '%1 contains %2?'; -Blockly.Msg.OPERATORS_MOD = '%1 mod %2'; -Blockly.Msg.OPERATORS_ROUND = 'round %1'; -Blockly.Msg.OPERATORS_MATHOP = '%1 of %2'; -Blockly.Msg.OPERATORS_MATHOP_ABS = 'abs'; -Blockly.Msg.OPERATORS_MATHOP_FLOOR = 'floor'; -Blockly.Msg.OPERATORS_MATHOP_CEILING = 'ceiling'; -Blockly.Msg.OPERATORS_MATHOP_SQRT = 'sqrt'; -Blockly.Msg.OPERATORS_MATHOP_SIN = 'sin'; -Blockly.Msg.OPERATORS_MATHOP_COS = 'cos'; -Blockly.Msg.OPERATORS_MATHOP_TAN = 'tan'; -Blockly.Msg.OPERATORS_MATHOP_ASIN = 'asin'; -Blockly.Msg.OPERATORS_MATHOP_ACOS = 'acos'; -Blockly.Msg.OPERATORS_MATHOP_ATAN = 'atan'; -Blockly.Msg.OPERATORS_MATHOP_LN = 'ln'; -Blockly.Msg.OPERATORS_MATHOP_LOG = 'log'; -Blockly.Msg.OPERATORS_MATHOP_EEXP = 'e ^'; -Blockly.Msg.OPERATORS_MATHOP_10EXP = '10 ^'; - -// Procedures blocks -Blockly.Msg.PROCEDURES_DEFINITION = 'define %1'; - -// Sensing blocks -Blockly.Msg.SENSING_TOUCHINGOBJECT = 'touching %1?'; -Blockly.Msg.SENSING_TOUCHINGOBJECT_POINTER = 'mouse-pointer'; -Blockly.Msg.SENSING_TOUCHINGOBJECT_EDGE = 'edge'; -Blockly.Msg.SENSING_TOUCHINGCOLOR = 'touching color %1?'; -Blockly.Msg.SENSING_COLORISTOUCHINGCOLOR = 'color %1 is touching %2?'; -Blockly.Msg.SENSING_DISTANCETO = 'distance to %1'; -Blockly.Msg.SENSING_DISTANCETO_POINTER = 'mouse-pointer'; -Blockly.Msg.SENSING_ASKANDWAIT = 'ask %1 and wait'; -Blockly.Msg.SENSING_ASK_TEXT = 'What\'s your name?'; -Blockly.Msg.SENSING_ANSWER = 'answer'; -Blockly.Msg.SENSING_KEYPRESSED = 'key %1 pressed?'; -Blockly.Msg.SENSING_MOUSEDOWN = 'mouse down?'; -Blockly.Msg.SENSING_MOUSEX = 'mouse x'; -Blockly.Msg.SENSING_MOUSEY = 'mouse y'; -Blockly.Msg.SENSING_SETDRAGMODE = 'set drag mode %1'; -Blockly.Msg.SENSING_SETDRAGMODE_DRAGGABLE = 'draggable'; -Blockly.Msg.SENSING_SETDRAGMODE_NOTDRAGGABLE = 'not draggable'; -Blockly.Msg.SENSING_LOUDNESS = 'loudness'; -Blockly.Msg.SENSING_LOUD = 'loud?'; -Blockly.Msg.SENSING_TIMER = 'timer'; -Blockly.Msg.SENSING_RESETTIMER = 'reset timer'; -Blockly.Msg.SENSING_OF = '%1 of %2'; -Blockly.Msg.SENSING_OF_XPOSITION = 'x position'; -Blockly.Msg.SENSING_OF_YPOSITION = 'y position'; -Blockly.Msg.SENSING_OF_DIRECTION = 'direction'; -Blockly.Msg.SENSING_OF_COSTUMENUMBER = 'costume #'; -Blockly.Msg.SENSING_OF_COSTUMENAME = 'costume name'; -Blockly.Msg.SENSING_OF_SIZE = 'size'; -Blockly.Msg.SENSING_OF_VOLUME = 'volume'; -Blockly.Msg.SENSING_OF_BACKDROPNUMBER = 'backdrop #'; -Blockly.Msg.SENSING_OF_BACKDROPNAME = 'backdrop name'; -Blockly.Msg.SENSING_OF_STAGE = 'Stage'; -Blockly.Msg.SENSING_CURRENT = 'current %1'; -Blockly.Msg.SENSING_CURRENT_YEAR = 'year'; -Blockly.Msg.SENSING_CURRENT_MONTH = 'month'; -Blockly.Msg.SENSING_CURRENT_DATE = 'date'; -Blockly.Msg.SENSING_CURRENT_DAYOFWEEK = 'day of week'; -Blockly.Msg.SENSING_CURRENT_HOUR = 'hour'; -Blockly.Msg.SENSING_CURRENT_MINUTE = 'minute'; -Blockly.Msg.SENSING_CURRENT_SECOND = 'second'; -Blockly.Msg.SENSING_DAYSSINCE2000 = 'days since 2000'; -Blockly.Msg.SENSING_USERNAME = 'username'; -Blockly.Msg.SENSING_USERID = 'user id'; - -// Sound blocks -Blockly.Msg.SOUND_PLAY = 'start sound %1'; -Blockly.Msg.SOUND_PLAYUNTILDONE = 'play sound %1 until done'; -Blockly.Msg.SOUND_STOPALLSOUNDS = 'stop all sounds'; -Blockly.Msg.SOUND_SETEFFECTO = 'set %1 effect to %2'; -Blockly.Msg.SOUND_CHANGEEFFECTBY = 'change %1 effect by %2'; -Blockly.Msg.SOUND_CLEAREFFECTS = 'clear sound effects'; -Blockly.Msg.SOUND_EFFECTS_PITCH = 'pitch'; -Blockly.Msg.SOUND_EFFECTS_PAN = 'pan left/right'; -Blockly.Msg.SOUND_CHANGEVOLUMEBY = 'change volume by %1'; -Blockly.Msg.SOUND_SETVOLUMETO = 'set volume to %1%'; -Blockly.Msg.SOUND_VOLUME = 'volume'; -Blockly.Msg.SOUND_RECORD = 'record...'; - -// Category labels -Blockly.Msg.CATEGORY_MOTION = 'Motion'; -Blockly.Msg.CATEGORY_LOOKS = 'Looks'; -Blockly.Msg.CATEGORY_SOUND = 'Sound'; -Blockly.Msg.CATEGORY_EVENTS = 'Events'; -Blockly.Msg.CATEGORY_CONTROL = 'Control'; -Blockly.Msg.CATEGORY_SENSING = 'Sensing'; -Blockly.Msg.CATEGORY_OPERATORS = 'Operators'; -Blockly.Msg.CATEGORY_VARIABLES = 'Variables'; -Blockly.Msg.CATEGORY_MYBLOCKS = 'My Blocks'; - -// Context menus -Blockly.Msg.DUPLICATE = 'Duplicate'; -Blockly.Msg.DELETE = 'Delete'; -Blockly.Msg.ADD_COMMENT = 'Add Comment'; -Blockly.Msg.REMOVE_COMMENT = 'Remove Comment'; -Blockly.Msg.DELETE_BLOCK = 'Delete Block'; -Blockly.Msg.DELETE_X_BLOCKS = 'Delete %1 Blocks'; -Blockly.Msg.DELETE_ALL_BLOCKS = 'Delete all %1 blocks?'; -Blockly.Msg.CLEAN_UP = 'Clean up Blocks'; -Blockly.Msg.HELP = 'Help'; -Blockly.Msg.UNDO = 'Undo'; -Blockly.Msg.REDO = 'Redo'; -Blockly.Msg.EDIT_PROCEDURE = 'Edit'; -Blockly.Msg.SHOW_PROCEDURE_DEFINITION = 'Go to definition'; -Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT = 'Say something...'; - -// Color -Blockly.Msg.COLOUR_HUE_LABEL = 'Color'; -Blockly.Msg.COLOUR_SATURATION_LABEL = 'Saturation'; -Blockly.Msg.COLOUR_BRIGHTNESS_LABEL = 'Brightness'; - -// Variables -// @todo Remove these once fully managed by Scratch VM / Scratch GUI -Blockly.Msg.CHANGE_VALUE_TITLE = 'Change value:'; -Blockly.Msg.RENAME_VARIABLE = 'Rename variable'; -Blockly.Msg.RENAME_VARIABLE_TITLE = 'Rename all "%1" variables to:'; -Blockly.Msg.RENAME_VARIABLE_MODAL_TITLE = 'Rename Variable'; -Blockly.Msg.NEW_VARIABLE = 'Make a Variable'; -Blockly.Msg.NEW_VARIABLE_TITLE = 'New variable name:'; -Blockly.Msg.VARIABLE_MODAL_TITLE = 'New Variable'; -Blockly.Msg.VARIABLE_ALREADY_EXISTS = 'A variable named "%1" already exists.'; -Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = 'A variable named "%1" already exists for another variable of type "%2".'; -Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = 'Delete %1 uses of the "%2" variable?'; -Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = 'Can\'t delete the variable "%1" because it\'s part of the definition of the function "%2"'; -Blockly.Msg.DELETE_VARIABLE = 'Delete the "%1" variable'; - -// Custom Procedures -// @todo Remove these once fully managed by Scratch VM / Scratch GUI -Blockly.Msg.NEW_PROCEDURE = 'Make a Block'; -Blockly.Msg.PROCEDURE_ALREADY_EXISTS = 'A procedure named "%1" already exists.'; -Blockly.Msg.PROCEDURE_DEFAULT_NAME = 'block name'; - -// Lists -// @todo Remove these once fully managed by Scratch VM / Scratch GUI -Blockly.Msg.NEW_LIST = 'Make a List'; -Blockly.Msg.NEW_LIST_TITLE = 'New list name:'; -Blockly.Msg.LIST_MODAL_TITLE = 'New List'; -Blockly.Msg.LIST_ALREADY_EXISTS = 'A list named "%1" already exists.'; -Blockly.Msg.RENAME_LIST_TITLE = 'Rename all "%1" lists to:'; -Blockly.Msg.RENAME_LIST_MODAL_TITLE = 'Rename List'; -Blockly.Msg.DEFAULT_LIST_ITEM = 'thing'; -Blockly.Msg.DELETE_LIST = 'Delete the "%1" list'; -Blockly.Msg.RENAME_LIST = 'Rename list'; - -// Broadcast Messages -// @todo Remove these once fully managed by Scratch VM / Scratch GUI -Blockly.Msg.NEW_BROADCAST_MESSAGE = 'New message'; -Blockly.Msg.NEW_BROADCAST_MESSAGE_TITLE = 'New message name:'; -Blockly.Msg.BROADCAST_MODAL_TITLE = 'New Message'; -Blockly.Msg.DEFAULT_BROADCAST_MESSAGE_NAME = 'message1'; diff --git a/packages/scratch-blocks/msg/scratch_msgs.js b/packages/scratch-blocks/msg/scratch_msgs.js deleted file mode 100644 index 3d6729795..000000000 --- a/packages/scratch-blocks/msg/scratch_msgs.js +++ /dev/null @@ -1,17455 +0,0 @@ -// This file was automatically generated. Do not modify. - -'use strict'; - -goog.provide('Blockly.ScratchMsgs.allLocales'); - -goog.require('Blockly.ScratchMsgs'); - - -Blockly.ScratchMsgs.locales["ab"] = -{ - "CONTROL_FOREVER": "инагӡалатәуп", - "CONTROL_REPEAT": "инагӡалатәуп %1 - нтә", - "CONTROL_IF": "%1 акәзар", - "CONTROL_ELSE": "акәымзар", - "CONTROL_STOP": "иаанкылатәуп", - "CONTROL_STOP_ALL": "зегьы", - "CONTROL_STOP_THIS": "ари апрограмма", - "CONTROL_STOP_OTHER": "анагӡаҩ егьырҭ ипрограммақәа", - "CONTROL_WAIT": "иԥштәуп %1 секундк", - "CONTROL_WAITUNTIL": "иԥштәуп %1 -нӡа", - "CONTROL_REPEATUNTIL": "инагӡалатәуп %1 акәымзар", - "CONTROL_WHILE": "%1 иашанаҵ", - "CONTROL_FOREACH": "рыцԥхьаӡа %1 рзы %2 аҟны", - "CONTROL_STARTASCLONE": "сара аклон ҳасабла саналаго", - "CONTROL_CREATECLONEOF": "иаԥҵатәуп аклон %1", - "CONTROL_CREATECLONEOF_MYSELF": "сара исеиԥшу", - "CONTROL_DELETETHISCLONE": "ианыхтәуп ари аклон", - "CONTROL_COUNTER": "аԥхьаӡага", - "CONTROL_INCRCOUNTER": "аԥхьаӡага иазырҳатәуп", - "CONTROL_CLEARCOUNTER": "ирыцқьатәуп аԥхьаӡага", - "CONTROL_ALLATONCE": "зегьы иаразнак", - "DATA_SETVARIABLETO": "%1 иаҭатәуп %2 ", - "DATA_CHANGEVARIABLEBY": "иԥсахтәуп %1 %2 ала", - "DATA_SHOWVARIABLE": "иаарԥштәуп аҽеиҭак %1", - "DATA_HIDEVARIABLE": "иҵәахтәуп аҽеиҭак %1", - "DATA_ADDTOLIST": "иацҵатәуп %1 %2 ахь ", - "DATA_DELETEOFLIST": "ианыхтәуп %1 %2 аҟынтәи ", - "DATA_DELETEALLOFLIST": "ианыхтәуп зегьы %1 ", - "DATA_INSERTATLIST": "%3 аҟны ибжьаргылатәуп %1 %2 аҭыԥан ", - "DATA_REPLACEITEMOFLIST": "%2 аҟны иԥсахтәуп аелемент %1 %3 ала ", - "DATA_ITEMOFLIST": "аелемент %1 %2 аҟны", - "DATA_ITEMNUMOFLIST": "апункт # %1 аҟынтәи %2 аҟны", - "DATA_LENGTHOFLIST": "%1 аура", - "DATA_LISTCONTAINSITEM": "%1 иаҵанакуама %2?", - "DATA_SHOWLIST": "иаарԥштәуп асиа %1", - "DATA_HIDELIST": "иҵәахтәуп асиа %1", - "DATA_INDEX_ALL": "зегьы", - "DATA_INDEX_LAST": "аҵыхәтәантәи", - "DATA_INDEX_RANDOM": "иарбанзаалакь", - "EVENT_WHENFLAGCLICKED": "%1 ҳанақәыӷәӷәалакь", - "EVENT_WHENTHISSPRITECLICKED": "анагӡаҩ ҳаниқәыӷәӷәалакь", - "EVENT_WHENSTAGECLICKED": "асцена ҳанақәыӷәӷәалакь", - "EVENT_WHENTOUCHINGOBJECT": "ари анагӡаҩ %1 данадкьысло", - "EVENT_WHENBROADCASTRECEIVED": " %1 аус арура", - "EVENT_WHENBACKDROPSWITCHESTO": "аҿаԥшыра %1 ала аҽанаԥсахуа ", - "EVENT_WHENGREATERTHAN": "%1 > %2 акәзар", - "EVENT_WHENGREATERTHAN_TIMER": "аамҭарбага", - "EVENT_WHENGREATERTHAN_LOUDNESS": "абжьы адура", - "EVENT_BROADCAST": "идәықәҵатәуп %1 ", - "EVENT_BROADCASTANDWAIT": "идәықәҵатәуп %1 нас иԥштәуп", - "EVENT_WHENKEYPRESSED": "аклавиша %1 ҳанақәыӷәӷәалакь", - "EVENT_WHENKEYPRESSED_SPACE": "абжьажьга", - "EVENT_WHENKEYPRESSED_LEFT": "ахыц арӷьарахь", - "EVENT_WHENKEYPRESSED_RIGHT": "ахыц армарахь", - "EVENT_WHENKEYPRESSED_DOWN": "ахыц алада", - "EVENT_WHENKEYPRESSED_UP": "ахыц аҩада", - "EVENT_WHENKEYPRESSED_ANY": "иарбанзаалакь", - "LOOKS_SAYFORSECS": "иҳәалатәуп %1 %2 секундк ", - "LOOKS_SAY": "иҳәатәуп %1 ", - "LOOKS_HELLO": "Салам!", - "LOOKS_THINKFORSECS": "ахәыцра %1 %2 секундк ", - "LOOKS_THINK": "ахәыцра %1 ", - "LOOKS_HMM": "М-м-м...", - "LOOKS_SHOW": "ацәырҵра", - "LOOKS_HIDE": "аҽыҵәахра", - "LOOKS_HIDEALLSPRITES": "иҵәахтәуп анагӡаҩцәа зегьы", - "LOOKS_EFFECT_COLOR": "аԥштәы", - "LOOKS_EFFECT_FISHEYE": "аԥсыӡ аблақәа", - "LOOKS_EFFECT_WHIRL": "акьаҳәхара", - "LOOKS_EFFECT_PIXELATE": "апиксельқәа рыԥсахра", - "LOOKS_EFFECT_MOSAIC": "амозаика", - "LOOKS_EFFECT_BRIGHTNESS": "ажжара", - "LOOKS_EFFECT_GHOST": "алаԥшҵашәара", - "LOOKS_CHANGEEFFECTBY": "иԥсахтәуп аеффект %1 %2 ала ", - "LOOKS_SETEFFECTTO": "иқәыргылатәуп аеффект %1 %2", - "LOOKS_CLEARGRAPHICEFFECTS": "иқәгатәуп аграфикатә еффектқәа", - "LOOKS_CHANGESIZEBY": "иԥсахтәуп ашәагаа %1 ала", - "LOOKS_SETSIZETO": "иқәыргылатәуп ашәагаа %1 % ", - "LOOKS_SIZE": "ашәагаа", - "LOOKS_CHANGESTRETCHBY": "иԥсахтәуп арххара %1 ала ", - "LOOKS_SETSTRETCHTO": "иқыргылатәуп арххара %1", - "LOOKS_SWITCHCOSTUMETO": "иԥсахтәуп акостиум %1 ала", - "LOOKS_NEXTCOSTUME": "анаҩстәи акостиум", - "LOOKS_SWITCHBACKDROPTO": "иԥсахтәуп аҿаԥшыра %1 ала", - "LOOKS_GOTOFRONTBACK": "ииастәуп %1 аҿыгҳара ахь ", - "LOOKS_GOTOFRONTBACK_FRONT": "аԥхьаҟатәи", - "LOOKS_GOTOFRONTBACK_BACK": "ашьҭахьҟатәи", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ииастәуп %1 %2 ҿыгҳарак ", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ԥхьаҟа", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "шьҭахьҟа", - "LOOKS_BACKDROPNUMBERNAME": "аҿаԥшыра %1 ", - "LOOKS_COSTUMENUMBERNAME": "акостиум %1", - "LOOKS_NUMBERNAME_NUMBER": "аномер", - "LOOKS_NUMBERNAME_NAME": "ахьӡ", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "иԥсахтәуп аҿаԥшыра %1 ала нас иԥштәуп ", - "LOOKS_NEXTBACKDROP_BLOCK": "анаҩстәи аҿаԥшыра", - "LOOKS_NEXTBACKDROP": "анаҩстәи аҿаԥшыра", - "LOOKS_PREVIOUSBACKDROP": "аԥхьатәи аҿаԥшыра", - "LOOKS_RANDOMBACKDROP": "иарбанзаалакь аҿаԥшыра", - "MOTION_MOVESTEPS": "ицатәуп %1 шьаҿак", - "MOTION_TURNLEFT": "иргьежьтәуп %1 %2 градус рыла ", - "MOTION_TURNRIGHT": "иргьежьтәуп %1 %2 градус рыла ", - "MOTION_POINTINDIRECTION": "инарҳәтәуп %1 ахь", - "MOTION_POINTTOWARDS": "%1 ахь инаҳәтәуп", - "MOTION_POINTTOWARDS_POINTER": "аҳәынаԥ арбага", - "MOTION_POINTTOWARDS_RANDOM": "машәыршақәтәи ахырхарҭа", - "MOTION_GOTO": "ииастәуп %1 ахь", - "MOTION_GOTO_POINTER": "аҳәынаԥ арбага", - "MOTION_GOTO_RANDOM": "иарбанзаалакь апозициа", - "MOTION_GOTOXY": "ииастәуп x: %1 y: %2 ахь ", - "MOTION_GLIDESECSTOXY": "иқәҵәраатәуп x: %2 y: %3 ахь %1 секундк ", - "MOTION_GLIDETO": "иқәҵәраатәуп %2 ахь %1 секундк ", - "MOTION_GLIDETO_POINTER": "аҳәынаԥ арбага", - "MOTION_GLIDETO_RANDOM": "иарбанзаалакь апозициа", - "MOTION_CHANGEXBY": "иԥсахтәуп x %1 ала ", - "MOTION_SETX": "иқәыргылатәуп x %1 аҟны ", - "MOTION_CHANGEYBY": "иԥсахтәуп y %1 ала ", - "MOTION_SETY": "иқәыргылатәуп y %1 аҟны ", - "MOTION_IFONEDGEBOUNCE": "акьыԥшь акәзар, иадԥатәуп", - "MOTION_SETROTATIONSTYLE": "иқәыргылатәуп аргьежьра астиль %1 ", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "армарахь-арӷьарахь", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "иргьежьтәӡам", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "иргьежьтәуп", - "MOTION_XPOSITION": "x аҭыԥ", - "MOTION_YPOSITION": "y аҭыԥ", - "MOTION_DIRECTION": "ахырхарҭа", - "MOTION_SCROLLRIGHT": "иҭарҵәитәуп арӷьарахь %1", - "MOTION_SCROLLUP": "иҭарҵәитәуп хыхь %1", - "MOTION_ALIGNSCENE": "еиҟаратәтәуп асцена %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ҵаҟа-армарахьтәи", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ҵаҟа-арӷьарахьтәи", - "MOTION_ALIGNSCENE_MIDDLE": "агәҭа", - "MOTION_ALIGNSCENE_TOPLEFT": "хыхьтәи-армарахьтәи", - "MOTION_ALIGNSCENE_TOPRIGHT": "хыхьтәи-арӷьарахьтәи", - "MOTION_XSCROLL": "горизонталла аҭаргьежьра", - "MOTION_YSCROLL": "вертикалла аҭаргьежьра", - "MOTION_STAGE_SELECTED": "Асцена алхуп: иҟам аиҭаҵратә блокқәа", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "иарбанзаалакь %1 -и %2 -и рыбжьара ", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 - еи %2 - еи", - "OPERATORS_OR": "%1 ма %2", - "OPERATORS_NOT": "%1 акәӡам", - "OPERATORS_JOIN": "еиԥшьтәуп %1 %2 ", - "OPERATORS_JOIN_APPLE": "аҵәа", - "OPERATORS_JOIN_BANANA": "абанан", - "OPERATORS_LETTEROF": "асимвол %1 %2 аҟны", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "%1 аура", - "OPERATORS_CONTAINS": "%1 иаҵанакуама %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "ихаргьежьтәуп %1 ", - "OPERATORS_MATHOP": "%1 %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "еиҵоу еибгоу", - "OPERATORS_MATHOP_CEILING": "еиҳау еибгоу", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "еиҿкаатәуп %1", - "SENSING_TOUCHINGOBJECT": "иадкьыслома %1? ", - "SENSING_TOUCHINGOBJECT_POINTER": "аҳәынаԥ арбага", - "SENSING_TOUCHINGOBJECT_EDGE": "аҵкарқәа", - "SENSING_TOUCHINGCOLOR": "иадкьыслома аԥштәы %1? ", - "SENSING_COLORISTOUCHINGCOLOR": "аԥштәы %1 иадкьыслома %2? ", - "SENSING_DISTANCETO": "%1 аҟынӡа ибжьоу", - "SENSING_DISTANCETO_POINTER": "аҳәынаԥ арбага", - "SENSING_ASKANDWAIT": "иазҵаатәуп %1 нас иԥштәуп ", - "SENSING_ASK_TEXT": "Иухьӡуи уара?", - "SENSING_ANSWER": "аҭак", - "SENSING_KEYPRESSED": "аклавиша %1 иақәыӷәӷәома? ", - "SENSING_MOUSEDOWN": "аҳәынаԥ иақәыӷәӷәома?", - "SENSING_MOUSEX": "аҳәынаԥ x ала", - "SENSING_MOUSEY": "аҳәынаԥ y ала", - "SENSING_SETDRAGMODE": "анаскьагара ауама %1 ", - "SENSING_SETDRAGMODE_DRAGGABLE": "ааи", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "мап", - "SENSING_LOUDNESS": "абжьы адура", - "SENSING_LOUD": "абжьы дуума?", - "SENSING_TIMER": "аамҭарбага", - "SENSING_RESETTIMER": "аамҭарбага ҿыц адәықәҵара", - "SENSING_OF": "%1 %2 аҟынтәи", - "SENSING_OF_XPOSITION": "x аҭыԥ", - "SENSING_OF_YPOSITION": "y аҭыԥ", - "SENSING_OF_DIRECTION": "ахырхарҭа", - "SENSING_OF_COSTUMENUMBER": "акостиум №", - "SENSING_OF_COSTUMENAME": "акостиум ахьӡ", - "SENSING_OF_SIZE": "ашәагаа", - "SENSING_OF_VOLUME": "абжьы адура", - "SENSING_OF_BACKDROPNUMBER": "аҿаԥшыра №", - "SENSING_OF_BACKDROPNAME": "аҿаԥшыра ахьӡ", - "SENSING_OF_STAGE": "Асцена", - "SENSING_CURRENT": "уажәтәи %1 ", - "SENSING_CURRENT_YEAR": "ашықәс", - "SENSING_CURRENT_MONTH": "амза", - "SENSING_CURRENT_DATE": "арыцхә", - "SENSING_CURRENT_DAYOFWEEK": "амчыбжь амш", - "SENSING_CURRENT_HOUR": "асааҭ", - "SENSING_CURRENT_MINUTE": "аминуҭ", - "SENSING_CURRENT_SECOND": "асекунд", - "SENSING_DAYSSINCE2000": "амшқәа 01.01.2000 инаркны ", - "SENSING_USERNAME": "алахәылаҩ ихьӡ", - "SENSING_USERID": "Алахәылаҩ ID", - "SOUND_PLAY": "иргатәуп абжьы %1 ", - "SOUND_PLAYUNTILDONE": "иргатәуп абжьы %1 инҵәаанӡа ", - "SOUND_STOPALLSOUNDS": "иаанкылатәуп абжьқәа зегьы", - "SOUND_SETEFFECTO": "иқәыргылатәуп аеффект %1 %2 аҟны ", - "SOUND_CHANGEEFFECTBY": "иԥсахтәуп %1 аеффект %2 ала ", - "SOUND_CLEAREFFECTS": "иқәгатәуп абжьы аеффектқәа", - "SOUND_EFFECTS_PITCH": "атемп", - "SOUND_EFFECTS_PAN": "апанорама армарахь/арӷьарахь", - "SOUND_CHANGEVOLUMEBY": "иԥсахтәуп абжьы %1 ала ", - "SOUND_SETVOLUMETO": "иқәыргылатәуп абжьы адура %1%", - "SOUND_VOLUME": "абжьы адура", - "SOUND_RECORD": "аҭаҩра...", - "CATEGORY_MOTION": "Аиҭаҵра", - "CATEGORY_LOOKS": "Аԥшра-асахьа", - "CATEGORY_SOUND": "Абжьы", - "CATEGORY_EVENTS": "Ахҭысқәа", - "CATEGORY_CONTROL": "Аконтроль", - "CATEGORY_SENSING": "Асенсорқәа", - "CATEGORY_OPERATORS": "Аоператорқәа", - "CATEGORY_VARIABLES": "Аҽеиҭакқәа", - "CATEGORY_MYBLOCKS": "Сара сблокқәа", - "DUPLICATE": "Адубликат", - "DELETE": "Ианыхтәуп", - "ADD_COMMENT": "Иацҵатәуп акомментари", - "REMOVE_COMMENT": "Ианыхтәуп акомментари", - "DELETE_BLOCK": "Ианыхтәуп аблок", - "DELETE_X_BLOCKS": "Ианыхтәуп %1 блокк ", - "DELETE_ALL_BLOCKS": "Ианыхтәума аблокқәа %1 зегьы?", - "CLEAN_UP": "Ирыцқьатәуп аблокқәа", - "HELP": "Ацхыраара", - "UNDO": "Иаҟәыхтәуп", - "REDO": "Ирхынҳәтәуп", - "EDIT_PROCEDURE": "Ариашара", - "SHOW_PROCEDURE_DEFINITION": "Ииастәуп аиқәыршәарахь", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Иҳәатәуп џьара акы...", - "COLOUR_HUE_LABEL": "Аԥштәы", - "COLOUR_SATURATION_LABEL": "Аԥштәылгазаара", - "COLOUR_BRIGHTNESS_LABEL": "Ажжара", - "CHANGE_VALUE_TITLE": "Иԥсахтәуп аҵакы:", - "RENAME_VARIABLE": "Аҽеиҭак ахьӡ ԥсахтәуп", - "RENAME_VARIABLE_TITLE": "Аҽеиҭакқәа \"%1\" зегь рыхьӡ ԥсахтәуп аҟны:", - "RENAME_VARIABLE_MODAL_TITLE": "Аҽеиҭак ахьӡ ԥсахтәуп", - "NEW_VARIABLE": "Иаԥҵатәуп аҽеиҭак", - "NEW_VARIABLE_TITLE": "Аҽеиҭак ахьӡ ҿыц:", - "VARIABLE_MODAL_TITLE": "Аҽеиҭак ҿыц", - "VARIABLE_ALREADY_EXISTS": "Аҽеиҭак ахьӡ \"%1\" змоу ыҟоуп.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Аҽеиҭак ахьӡ \"%1\" змоу ыҟоуп аҽеиҭакқәа ртип \"%2\" аҟны. ", - "DELETE_VARIABLE_CONFIRMATION": "Ианыхтәума алахәрақәа %1 аҽеиҭак \"%2\" азы?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Иауам аҽеиҭак \"%1\" аныхра, избанзар иара афункциа \"%2\" ашьқәыргылара иахәҭакуп ", - "DELETE_VARIABLE": "Ианыхтәуп аҽеиҭак \"%1\"", - "NEW_PROCEDURE": "Иаԥҵатәуп аблок", - "PROCEDURE_ALREADY_EXISTS": "Апроцедура ахьӡ \"%1\" змоу ыҟоуп.", - "PROCEDURE_DEFAULT_NAME": "аблок ахьӡ", - "NEW_LIST": "Асиа аԥҵара", - "NEW_LIST_TITLE": "Асиа ахьӡ ҿыц:", - "LIST_MODAL_TITLE": "Асиа ҿыц", - "LIST_ALREADY_EXISTS": "Асиа ахьӡ \"%1\" змоу ыҟоуп.", - "RENAME_LIST_TITLE": "Асиақәа \"%1\" зегьы рыхьӡ ԥсахтәуп аҟны:", - "RENAME_LIST_MODAL_TITLE": "Асиа ахьӡ ԥсахтәуп", - "DEFAULT_LIST_ITEM": "џьара акы", - "DELETE_LIST": "Ианыхтәуп асиа \"%1\"", - "RENAME_LIST": "Асиа ахьӡ ԥсахтәуп", - "NEW_BROADCAST_MESSAGE": "Ацҳамҭа ҿыц", - "NEW_BROADCAST_MESSAGE_TITLE": "Ацҳамҭа ҿыц ахьӡ:", - "BROADCAST_MODAL_TITLE": "Ацҳамҭа ҿыц", - "DEFAULT_BROADCAST_MESSAGE_NAME": "ацҳамҭа1" -}; - -Blockly.ScratchMsgs.locales["ar"] = -{ - "CONTROL_FOREVER": "كرِّر باستمرار", - "CONTROL_REPEAT": "كرِّر %1 مرة", - "CONTROL_IF": "إذا %1", - "CONTROL_ELSE": "وإلا", - "CONTROL_STOP": "أوقف", - "CONTROL_STOP_ALL": "الكل", - "CONTROL_STOP_THIS": "المقطع البرمجي الحالي", - "CONTROL_STOP_OTHER": "المقاطع الأخرى في الكائن", - "CONTROL_WAIT": "انتظر %1 ثانية", - "CONTROL_WAITUNTIL": "انتظر حتى %1", - "CONTROL_REPEATUNTIL": "كرِّر حتى %1", - "CONTROL_WHILE": "طالما %1", - "CONTROL_FOREACH": "من أجل %1 من %2", - "CONTROL_STARTASCLONE": "عندما تبدأ نسخة مني", - "CONTROL_CREATECLONEOF": "أنشئ نسخة من %1", - "CONTROL_CREATECLONEOF_MYSELF": "نفسي", - "CONTROL_DELETETHISCLONE": "احذف هذه النسخة", - "CONTROL_COUNTER": "عداد", - "CONTROL_INCRCOUNTER": "زد العداد", - "CONTROL_CLEARCOUNTER": "صفِّر العداد", - "CONTROL_ALLATONCE": "الكل مرة واحدة", - "DATA_SETVARIABLETO": "اجعل %1 مساويًا %2", - "DATA_CHANGEVARIABLEBY": "غيِّر %1 بمقدار %2", - "DATA_SHOWVARIABLE": "أظهر المتغير %1", - "DATA_HIDEVARIABLE": "أخفِ المتغير %1", - "DATA_ADDTOLIST": "أضف %1 إلى %2", - "DATA_DELETEOFLIST": "احذف %1 من %2", - "DATA_DELETEALLOFLIST": "احذف كل العناصر في %1", - "DATA_INSERTATLIST": "أدرج %1 في الموقع %2 من %3", - "DATA_REPLACEITEMOFLIST": "استبدل %3 بالعنصر %1 من %2", - "DATA_ITEMOFLIST": "العنصر %1 من %2", - "DATA_ITEMNUMOFLIST": "رقم العنصر ذي القيمة %1 في %2", - "DATA_LENGTHOFLIST": "طول %1", - "DATA_LISTCONTAINSITEM": "%1 تحتوي %2؟", - "DATA_SHOWLIST": "أظهر اللائحة %1", - "DATA_HIDELIST": "أخفِ اللائحة %1", - "DATA_INDEX_ALL": "الكل", - "DATA_INDEX_LAST": "الأخير", - "DATA_INDEX_RANDOM": "عشوائي", - "EVENT_WHENFLAGCLICKED": "عند نقر %1", - "EVENT_WHENTHISSPRITECLICKED": "عند نقر هذا الكائن", - "EVENT_WHENSTAGECLICKED": "عند نقر المنصة", - "EVENT_WHENTOUCHINGOBJECT": "عندما يلامس هذا الكائن %1", - "EVENT_WHENBROADCASTRECEIVED": "عندما أتلقى %1", - "EVENT_WHENBACKDROPSWITCHESTO": "عندما تتبدل الخلفية إلى %1", - "EVENT_WHENGREATERTHAN": "عندما %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "المؤقت", - "EVENT_WHENGREATERTHAN_LOUDNESS": "الضجيج", - "EVENT_BROADCAST": "بث %1", - "EVENT_BROADCASTANDWAIT": "بث %1 وانتظر", - "EVENT_WHENKEYPRESSED": "عند ضغط مفتاح %1", - "EVENT_WHENKEYPRESSED_SPACE": "المسافة", - "EVENT_WHENKEYPRESSED_LEFT": "السهم الأيسر", - "EVENT_WHENKEYPRESSED_RIGHT": "السهم الأيمن", - "EVENT_WHENKEYPRESSED_DOWN": "السهم السفلي", - "EVENT_WHENKEYPRESSED_UP": "السهم العلوي", - "EVENT_WHENKEYPRESSED_ANY": "أي مفتاح", - "LOOKS_SAYFORSECS": "قل %1 لمدة %2 ثانية", - "LOOKS_SAY": "قل %1", - "LOOKS_HELLO": "السلام عليكم!", - "LOOKS_THINKFORSECS": "فكِّر %1 لمدة %2 ثانية", - "LOOKS_THINK": "فكِّر %1", - "LOOKS_HMM": "هممم...", - "LOOKS_SHOW": "اظهر", - "LOOKS_HIDE": "اختفِ", - "LOOKS_HIDEALLSPRITES": "أخفِ كل الكائنات", - "LOOKS_EFFECT_COLOR": "اللون", - "LOOKS_EFFECT_FISHEYE": "عين السمكة", - "LOOKS_EFFECT_WHIRL": "الدوامة", - "LOOKS_EFFECT_PIXELATE": "البكسلة", - "LOOKS_EFFECT_MOSAIC": "الموزاييك", - "LOOKS_EFFECT_BRIGHTNESS": "شدة الإضاءة", - "LOOKS_EFFECT_GHOST": "الشبح", - "LOOKS_CHANGEEFFECTBY": "غيِّر مؤثر %1 بمقدار %2", - "LOOKS_SETEFFECTTO": "اجعل مؤثر %1 مساويًا %2", - "LOOKS_CLEARGRAPHICEFFECTS": "أزل المؤثرات الرسومية", - "LOOKS_CHANGESIZEBY": "غيِّر الحجم بمقدار %1", - "LOOKS_SETSIZETO": "اجعل الحجم مساويًا %1 ٪", - "LOOKS_SIZE": "الحجم", - "LOOKS_CHANGESTRETCHBY": "غيِّر المط بمقدار %1", - "LOOKS_SETSTRETCHTO": "اجعل المط مساويًا %1 ٪", - "LOOKS_SWITCHCOSTUMETO": "غيِّر المظهر إلى %1", - "LOOKS_NEXTCOSTUME": "المظهر التالي", - "LOOKS_SWITCHBACKDROPTO": "غيِّر الخلفية إلى %1", - "LOOKS_GOTOFRONTBACK": "انتقل إلى الطبقة %1", - "LOOKS_GOTOFRONTBACK_FRONT": "الأولى", - "LOOKS_GOTOFRONTBACK_BACK": "الأخيرة", - "LOOKS_GOFORWARDBACKWARDLAYERS": "انتقل إلى %1 %2 طبقة", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "الأمام", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "الخلف", - "LOOKS_BACKDROPNUMBERNAME": "%1 الخلفية", - "LOOKS_COSTUMENUMBERNAME": "%1 المظهر", - "LOOKS_NUMBERNAME_NUMBER": "رقم", - "LOOKS_NUMBERNAME_NAME": "اسم", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "غيِّر الخلفية إلى %1 وانتظر", - "LOOKS_NEXTBACKDROP_BLOCK": "الخلفية التالية", - "LOOKS_NEXTBACKDROP": "الخلفية التالية", - "LOOKS_PREVIOUSBACKDROP": "الخلفية السابقة", - "LOOKS_RANDOMBACKDROP": "خلفية عشوائية", - "MOTION_MOVESTEPS": "تحرك %1 خطوة", - "MOTION_TURNLEFT": "استدر %1 %2 درجة", - "MOTION_TURNRIGHT": "استدر %1 %2 درجة", - "MOTION_POINTINDIRECTION": "اتجه نحو الاتجاه %1", - "MOTION_POINTTOWARDS": "اتجه نحو %1", - "MOTION_POINTTOWARDS_POINTER": "مؤشر الفأرة", - "MOTION_POINTTOWARDS_RANDOM": "اتجاه عشوائي", - "MOTION_GOTO": "اذهب إلى %1", - "MOTION_GOTO_POINTER": "مؤشر الفأرة", - "MOTION_GOTO_RANDOM": "موضع عشوائي", - "MOTION_GOTOXY": "اذهب إلى الموضع س: %1 ص: %2", - "MOTION_GLIDESECSTOXY": "انزلق خلال %1 ثانية إلى الموضع س: %2 ص: %3", - "MOTION_GLIDETO": "انزلق خلال %1 ثانية إلى %2", - "MOTION_GLIDETO_POINTER": "مؤشر الفأرة", - "MOTION_GLIDETO_RANDOM": "موضع عشوائي", - "MOTION_CHANGEXBY": "غيِّر الموضع س بمقدار %1", - "MOTION_SETX": "اجعل الموضع س مساويًا %1", - "MOTION_CHANGEYBY": "غيِّر الموضع ص بمقدار %1", - "MOTION_SETY": "اجعل الموضع ص مساويًا %1", - "MOTION_IFONEDGEBOUNCE": "ارتد إذا كنت عند الحافة", - "MOTION_SETROTATIONSTYLE": "اجعل نمط الدوران %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "يمين - يسار", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "لا دوران", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "في جميع الاتجاهات", - "MOTION_XPOSITION": "الموضع س", - "MOTION_YPOSITION": "الموضع ص", - "MOTION_DIRECTION": "الاتجاه", - "MOTION_SCROLLRIGHT": "انزلق يمينًا %1", - "MOTION_SCROLLUP": "انزلق للأعلى %1", - "MOTION_ALIGNSCENE": "حاذِ المشهد %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "أسفل اليسار", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "أسفل اليمين", - "MOTION_ALIGNSCENE_MIDDLE": "المنتصف", - "MOTION_ALIGNSCENE_TOPLEFT": "أعلى اليسار", - "MOTION_ALIGNSCENE_TOPRIGHT": "أعلى اليمين", - "MOTION_XSCROLL": "تمرير على محور س", - "MOTION_YSCROLL": "تمرير على محور ص", - "MOTION_STAGE_SELECTED": "المنصة محددة: لا توجد لبنات للحركة", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 × %2", - "OPERATORS_DIVIDE": "%1 ÷ %2", - "OPERATORS_RANDOM": "عدد عشوائي بين %1 و %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 و %2", - "OPERATORS_OR": "%1 أو %2", - "OPERATORS_NOT": "ليس %1", - "OPERATORS_JOIN": "اربط %1 %2", - "OPERATORS_JOIN_APPLE": "تفاحة", - "OPERATORS_JOIN_BANANA": "موزة", - "OPERATORS_LETTEROF": "الحرف %1 من %2", - "OPERATORS_LETTEROF_APPLE": "ت", - "OPERATORS_LENGTH": "طول %1", - "OPERATORS_CONTAINS": "%1 تحتوي %2؟", - "OPERATORS_MOD": " باقي قسمة %1 على %2", - "OPERATORS_ROUND": "تقريب %1", - "OPERATORS_MATHOP": "%1 للقيمة %2", - "OPERATORS_MATHOP_ABS": "القيمة المطلقة", - "OPERATORS_MATHOP_FLOOR": "الجزء الصحيح ", - "OPERATORS_MATHOP_CEILING": "السقف", - "OPERATORS_MATHOP_SQRT": "الجذر التربيعي", - "OPERATORS_MATHOP_SIN": "الجيب (sin)", - "OPERATORS_MATHOP_COS": "جيب التمام (cos)", - "OPERATORS_MATHOP_TAN": "الظل (tan)", - "OPERATORS_MATHOP_ASIN": "الجيب العكسي (asin)", - "OPERATORS_MATHOP_ACOS": "جيب التمام العكسي (acos)", - "OPERATORS_MATHOP_ATAN": "الظل العكسي (atan)", - "OPERATORS_MATHOP_LN": "اللوغارتم الطبيعي", - "OPERATORS_MATHOP_LOG": "اللوغارتم العشري", - "OPERATORS_MATHOP_EEXP": "هـ^", - "OPERATORS_MATHOP_10EXP": "10^", - "PROCEDURES_DEFINITION": "عرِّف %1", - "SENSING_TOUCHINGOBJECT": "ملامس لـ %1؟", - "SENSING_TOUCHINGOBJECT_POINTER": "مؤشر الفأرة", - "SENSING_TOUCHINGOBJECT_EDGE": "الحافة", - "SENSING_TOUCHINGCOLOR": "ملامس للون %1؟", - "SENSING_COLORISTOUCHINGCOLOR": "اللون %1 ملامس للون %2؟", - "SENSING_DISTANCETO": "المسافة إلى %1", - "SENSING_DISTANCETO_POINTER": "مؤشر الفأرة", - "SENSING_ASKANDWAIT": "اسأل %1 وانتظر", - "SENSING_ASK_TEXT": "ما اسمك؟", - "SENSING_ANSWER": "الإجابة", - "SENSING_KEYPRESSED": "مفتاح %1 مضغوط؟", - "SENSING_MOUSEDOWN": "زر الفأرة مضغوط؟", - "SENSING_MOUSEX": "الموضع س للفأرة", - "SENSING_MOUSEY": "الموضع ص للفأرة", - "SENSING_SETDRAGMODE": "اجعل السحب %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ممكنًا", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "غير ممكن", - "SENSING_LOUDNESS": "الضجيج", - "SENSING_LOUD": "الصوت مرتفع؟", - "SENSING_TIMER": "المؤقت", - "SENSING_RESETTIMER": "صفِّر المؤقت", - "SENSING_OF": "%1 الخاص بـ %2", - "SENSING_OF_XPOSITION": "الموضع س", - "SENSING_OF_YPOSITION": "الموضع ص", - "SENSING_OF_DIRECTION": "الاتجاه", - "SENSING_OF_COSTUMENUMBER": "رقم المظهر", - "SENSING_OF_COSTUMENAME": "اسم المظهر", - "SENSING_OF_SIZE": "الحجم", - "SENSING_OF_VOLUME": "شدة الصوت", - "SENSING_OF_BACKDROPNUMBER": "رقم الخلفية", - "SENSING_OF_BACKDROPNAME": "اسم الخلفية", - "SENSING_OF_STAGE": "المنصة", - "SENSING_CURRENT": "%1 الآن", - "SENSING_CURRENT_YEAR": "السنة", - "SENSING_CURRENT_MONTH": "الشهر", - "SENSING_CURRENT_DATE": "تاريخ اليوم", - "SENSING_CURRENT_DAYOFWEEK": "يوم الأسبوع", - "SENSING_CURRENT_HOUR": "الساعة", - "SENSING_CURRENT_MINUTE": "الدقيقة", - "SENSING_CURRENT_SECOND": "الثانية", - "SENSING_DAYSSINCE2000": "الأيام منذ عام 2000", - "SENSING_USERNAME": "اسم المستخدم", - "SENSING_USERID": "رقم المستخدم", - "SOUND_PLAY": "ابدأ الصوت %1", - "SOUND_PLAYUNTILDONE": "شغِّل الصوت %1 وانتظر انتهاءه", - "SOUND_STOPALLSOUNDS": "أوقف كل الأصوات", - "SOUND_SETEFFECTO": "اجعل مؤثر %1 مساويًا %2", - "SOUND_CHANGEEFFECTBY": "غيِّر مؤثر %1 بمقدار %2", - "SOUND_CLEAREFFECTS": "أزل المؤثرات الصوتية", - "SOUND_EFFECTS_PITCH": "طبقة الصوت", - "SOUND_EFFECTS_PAN": "توزيع الصوت يسار/يمين", - "SOUND_CHANGEVOLUMEBY": "غيِّر شدة الصوت بمقدار %1", - "SOUND_SETVOLUMETO": "اجعل شدّة الصوت مساويةً %1%", - "SOUND_VOLUME": "شدة الصوت", - "SOUND_RECORD": "سجِّل...", - "CATEGORY_MOTION": "الحركة", - "CATEGORY_LOOKS": "المظاهر", - "CATEGORY_SOUND": "الصوت", - "CATEGORY_EVENTS": "الأحداث", - "CATEGORY_CONTROL": "التحكم", - "CATEGORY_SENSING": "الاستشعار", - "CATEGORY_OPERATORS": "العمليات", - "CATEGORY_VARIABLES": "المتغيرات", - "CATEGORY_MYBLOCKS": "لبناتي", - "DUPLICATE": "مضاعفة", - "DELETE": "حذف", - "ADD_COMMENT": "إضافة تعليق", - "REMOVE_COMMENT": "حذف التعليق", - "DELETE_BLOCK": "حذف اللبنة", - "DELETE_X_BLOCKS": "حذف اللبنات الـ%1", - "DELETE_ALL_BLOCKS": "حذف اللبنات الـ%1 كلها؟", - "CLEAN_UP": "ترتيب اللبنات", - "HELP": "مساعدة", - "UNDO": "تراجع", - "REDO": "إعادة", - "EDIT_PROCEDURE": "تعديل", - "SHOW_PROCEDURE_DEFINITION": "اذهب إلى التعريف", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "قل شيئًا...", - "COLOUR_HUE_LABEL": "اللون", - "COLOUR_SATURATION_LABEL": "الإشباع", - "COLOUR_BRIGHTNESS_LABEL": "السطوع", - "CHANGE_VALUE_TITLE": "غيِّر القيمة:", - "RENAME_VARIABLE": "إعادة تسمية المتغير", - "RENAME_VARIABLE_TITLE": "إعادة تسمية جميع المتغيرات \"%1\" إلى:", - "RENAME_VARIABLE_MODAL_TITLE": "إعادة تسمية المتغير", - "NEW_VARIABLE": "إنشاء متغير", - "NEW_VARIABLE_TITLE": "اسم المتغير الجديد:", - "VARIABLE_MODAL_TITLE": "متغير جديد", - "VARIABLE_ALREADY_EXISTS": "يوجد مسبقًا متغير بالاسم \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "اسم المتغير \"%1\" مستخدم مسبقًا في متغير آخر من النوع \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "احذف الاستخدامات الـ%1 للمتغير \"%2\"؟", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "لا يمكن حذف المتغير \"%1\" لأنه جزء من تعريف الدالة \"%2\"", - "DELETE_VARIABLE": "حذف المتغير \"%1\"", - "NEW_PROCEDURE": "إنشاء لبنة", - "PROCEDURE_ALREADY_EXISTS": "يوجد مسبقًا إجراء بالاسم \"%1\".", - "PROCEDURE_DEFAULT_NAME": "اسم اللبنة", - "NEW_LIST": "إنشاء لائحة", - "NEW_LIST_TITLE": "اسم اللائحة الجديدة:", - "LIST_MODAL_TITLE": "لائحة جديدة", - "LIST_ALREADY_EXISTS": "توجد مسبقًا لائحة بالاسم \"%1\".", - "RENAME_LIST_TITLE": "إعادة تسمية جميع اللوائح \"%1\" إلى:", - "RENAME_LIST_MODAL_TITLE": "إعادة تسمية اللائحة", - "DEFAULT_LIST_ITEM": "غرض", - "DELETE_LIST": "حذف اللائحة \"%1\"", - "RENAME_LIST": "إعادة تسمية اللائحة", - "NEW_BROADCAST_MESSAGE": "رسالة جديدة", - "NEW_BROADCAST_MESSAGE_TITLE": "اسم الرسالة الجديدة:", - "BROADCAST_MODAL_TITLE": "رسالة جديدة", - "DEFAULT_BROADCAST_MESSAGE_NAME": "الرسالة 1" -}; - -Blockly.ScratchMsgs.locales["am"] = -{ - "CONTROL_FOREVER": "ለዘላለም", - "CONTROL_REPEAT": "%1ን ድገም", - "CONTROL_IF": "%1 ከሆነ", - "CONTROL_ELSE": "ካልሆነ", - "CONTROL_STOP": "አቁም", - "CONTROL_STOP_ALL": "ሁሉም", - "CONTROL_STOP_THIS": "ይሄ ስክሪፕት", - "CONTROL_STOP_OTHER": "ሌሎች በስፕራይት ላይ ያሉ ስክሪፕቶች", - "CONTROL_WAIT": "ጠብቅ ለ%1 ሰከንድ", - "CONTROL_WAITUNTIL": "ጠብቅ እስከ %1", - "CONTROL_REPEATUNTIL": "ድገም እስከ %1", - "CONTROL_WHILE": "%1 ያለ", - "CONTROL_FOREACH": "ለያንዳንድ %1 በ%2 ውስጥ", - "CONTROL_STARTASCLONE": "እንደ አምሳያ ስጀምር", - "CONTROL_CREATECLONEOF": "የ%1 አምሳያ ፍጠር", - "CONTROL_CREATECLONEOF_MYSELF": "ራሴ", - "CONTROL_DELETETHISCLONE": "ይህንን አምሳያ አጥፋ", - "CONTROL_COUNTER": "ቆጣሪ", - "CONTROL_INCRCOUNTER": "ቆጣሪውን ጨምር", - "CONTROL_CLEARCOUNTER": "ቆጣሪውን አጽዳ", - "CONTROL_ALLATONCE": "ሁሉም በአንድ ግዜ", - "DATA_SETVARIABLETO": "%1 ወደ %2 ለውጥ", - "DATA_CHANGEVARIABLEBY": "%1 በ%2 ቀይር", - "DATA_SHOWVARIABLE": "%1ን ተለዋዋጭ አሳይ", - "DATA_HIDEVARIABLE": "%1ን ተለዋዋጭ ደብቅ", - "DATA_ADDTOLIST": "%1 ጨምር በ%2", - "DATA_DELETEOFLIST": "%1 ሰርዝ ከ%2", - "DATA_DELETEALLOFLIST": "%1 ሁሉ ሰርዝ", - "DATA_INSERTATLIST": "%1 አስገባ በ%2 ላይ %3 ውስጥ", - "DATA_REPLACEITEMOFLIST": "%1 ከ%2 ቀይር ወደ %3", - "DATA_ITEMOFLIST": "%1 ከ%2", - "DATA_ITEMNUMOFLIST": "item # of %1 in %2", - "DATA_LENGTHOFLIST": "%1 ርዝመት", - "DATA_LISTCONTAINSITEM": "%2 %1 አለበት?", - "DATA_SHOWLIST": "%1ን ዝርዝር አሳይ", - "DATA_HIDELIST": "%1ን ዝርዝር ደብቅ", - "DATA_INDEX_ALL": "ሁሉም", - "DATA_INDEX_LAST": "መጨረሻ", - "DATA_INDEX_RANDOM": "የማይታወቅ", - "EVENT_WHENFLAGCLICKED": "%1 ጠቅ ሲደረግ", - "EVENT_WHENTHISSPRITECLICKED": "ይህ ስፕራይት ሲነካ", - "EVENT_WHENSTAGECLICKED": "መድረኩ ጠቅ ሲደረግ", - "EVENT_WHENTOUCHINGOBJECT": "ይህ ስፕራይት %1ን ሲነካ", - "EVENT_WHENBROADCASTRECEIVED": "%1ን ስቀበል", - "EVENT_WHENBACKDROPSWITCHESTO": "የጀርባ ምስል ወደ %1 ሲቀየር", - "EVENT_WHENGREATERTHAN": "%1 > %2 ሲሆን", - "EVENT_WHENGREATERTHAN_TIMER": "የጊዜ ቆጣሪ", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ጮክታ", - "EVENT_BROADCAST": "%1ን አሰራጭ", - "EVENT_BROADCASTANDWAIT": "%1ን አሰራጭና ጠብቅ", - "EVENT_WHENKEYPRESSED": "%1ን ቁልፍ ጫን ሲደረግ", - "EVENT_WHENKEYPRESSED_SPACE": "ቦታ", - "EVENT_WHENKEYPRESSED_LEFT": "ወደ ግራ ጠቋሚ ቀስት", - "EVENT_WHENKEYPRESSED_RIGHT": "የቀኝ አቅጣጫ ጠቋሚ ቀስት", - "EVENT_WHENKEYPRESSED_DOWN": "ወደታች ጠቋሚ ቀስት", - "EVENT_WHENKEYPRESSED_UP": "ወደ ላይ አቅጣጫ ጠቋሚ ቀስት", - "EVENT_WHENKEYPRESSED_ANY": "የቱም", - "LOOKS_SAYFORSECS": "%1ን በል ለ%2 ሰከንድ", - "LOOKS_SAY": "%1ን በል", - "LOOKS_HELLO": "ሰላም!", - "LOOKS_THINKFORSECS": "%1ን አስብ ለ%2 ሰከንድ", - "LOOKS_THINK": "%1ን አስብ", - "LOOKS_HMM": "እ...", - "LOOKS_SHOW": "አሳይ", - "LOOKS_HIDE": "ደብቅ", - "LOOKS_HIDEALLSPRITES": "ሁሉም ስፕራይቶች ደብቅ", - "LOOKS_EFFECT_COLOR": "ቀለም", - "LOOKS_EFFECT_FISHEYE": "fisheye", - "LOOKS_EFFECT_WHIRL": "መሽከርከር", - "LOOKS_EFFECT_PIXELATE": "ፒክሰሌት", - "LOOKS_EFFECT_MOSAIC": "ሞዚያክ", - "LOOKS_EFFECT_BRIGHTNESS": "የብርሀን መጠን", - "LOOKS_EFFECT_GHOST": "መንፈስ", - "LOOKS_CHANGEEFFECTBY": "%1ን ተጽኖ በ%2 ለውጥ", - "LOOKS_SETEFFECTTO": "%1ን ተጽኖ ወደ %2 ለውጥ", - "LOOKS_CLEARGRAPHICEFFECTS": "የምስል ማስዋብያዎቹን አጥፋ", - "LOOKS_CHANGESIZEBY": "ልክን ቀይር በ%1", - "LOOKS_SETSIZETO": "ልክን ወደ %1 ቀይር", - "LOOKS_SIZE": "መጠን", - "LOOKS_CHANGESTRETCHBY": "ዝርጋት በ%1 ቀይር", - "LOOKS_SETSTRETCHTO": "ዝርጋት ወደ %1 ቀይር", - "LOOKS_SWITCHCOSTUMETO": "ልብስ ወደ %1 ለውጥ", - "LOOKS_NEXTCOSTUME": "ቀጣይ አልባስ", - "LOOKS_SWITCHBACKDROPTO": "የጀርባ ምስል ወደ %1 ለውጥ", - "LOOKS_GOTOFRONTBACK": "ወደ %1 ተደራቢ ሂድ", - "LOOKS_GOTOFRONTBACK_FRONT": "ፊት", - "LOOKS_GOTOFRONTBACK_BACK": "ኋላ", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ወደ %1ና %2 ተደራቢዎች ሂድ", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ወደፊት", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ወደኋላ", - "LOOKS_BACKDROPNUMBERNAME": "የጀርባ ምስል %1", - "LOOKS_COSTUMENUMBERNAME": "ልብስ %1", - "LOOKS_NUMBERNAME_NUMBER": "ቁጥር", - "LOOKS_NUMBERNAME_NAME": "ስም", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "የጀርባ ምስል ወደ %1 ለውጥና ጠብቅ", - "LOOKS_NEXTBACKDROP_BLOCK": "ቀጣይ የጀርባ ምስል", - "LOOKS_NEXTBACKDROP": "ቀጣይ የጀርባ ምስል", - "LOOKS_PREVIOUSBACKDROP": "ቀድሞ የነበረው የጀርባ ምስል", - "LOOKS_RANDOMBACKDROP": "ራንደም የጀርባ ምስል", - "MOTION_MOVESTEPS": "%1 እርምጃዎች ተንቀሳቀስ", - "MOTION_TURNLEFT": "ዙር %1 %2 ድግሪዎች", - "MOTION_TURNRIGHT": "ዙር %1 %2 ድግሪዎች", - "MOTION_POINTINDIRECTION": "ወደ %1 አቅጣጫ ደግን", - "MOTION_POINTTOWARDS": "ወደ %1 ደግን", - "MOTION_POINTTOWARDS_POINTER": "የማውሱ መጠቆሚያ", - "MOTION_POINTTOWARDS_RANDOM": "random direction", - "MOTION_GOTO": "ወደ %1 ሂድ", - "MOTION_GOTO_POINTER": "የማውሱ መጠቆሚያ", - "MOTION_GOTO_RANDOM": "የማይታወቅ ቦታ", - "MOTION_GOTOXY": "ወደ x: %1 y: %2 ሂድ", - "MOTION_GLIDESECSTOXY": "ተንሸራተት %1 ሰከንድ ወደ x: %2 y: %3", - "MOTION_GLIDETO": "ተንሸራተት %1 ሰከንድ ወደ %2", - "MOTION_GLIDETO_POINTER": "የማውሱ መጠቆሚያ", - "MOTION_GLIDETO_RANDOM": "የማይታወቅ ቦታ", - "MOTION_CHANGEXBY": "xን ቀይር በ%1", - "MOTION_SETX": "xን ወደ %1 ለውጥ", - "MOTION_CHANGEYBY": "yን ቀይር በ%1", - "MOTION_SETY": "yን ወደ %1 ለውጥ", - "MOTION_IFONEDGEBOUNCE": "ጠርዝ ላይ ነጥረህ ተመለስ", - "MOTION_SETROTATIONSTYLE": "የዙር ዘዴ ወደ %1 ለውጥ", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "ግራ-ቀኝ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "አትሽከርከር", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "በአካባቢው በሙሉ", - "MOTION_XPOSITION": "x ቦታ", - "MOTION_YPOSITION": "y ቦታ", - "MOTION_DIRECTION": "አቅጣጫ", - "MOTION_SCROLLRIGHT": "ሸብልል %1 ወደ ቀኝ", - "MOTION_SCROLLUP": "ሸብልል %1 ወደ ላይ", - "MOTION_ALIGNSCENE": "%1ን ሥፍራ ገባበር ", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ታች-ግራ", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ታች-ቀኝ", - "MOTION_ALIGNSCENE_MIDDLE": "መሃከል", - "MOTION_ALIGNSCENE_TOPLEFT": "ላይ-ግራ", - "MOTION_ALIGNSCENE_TOPRIGHT": "ላይ-ቀኝ", - "MOTION_XSCROLL": "xን ሸብልል", - "MOTION_YSCROLL": "yን ሸብልል", - "MOTION_STAGE_SELECTED": "መድረክ ተመርጧል፡ ተንቀሳቃሽ ጥምሮች የሉም", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 እስከ %2 በራንደም ምረጥ", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1ና %2", - "OPERATORS_OR": "%1 ወይስ %2", - "OPERATORS_NOT": "%1 አይደለም", - "OPERATORS_JOIN": "%1 %2 አገናኝ", - "OPERATORS_JOIN_APPLE": "ፖም", - "OPERATORS_JOIN_BANANA": "ሙዝ", - "OPERATORS_LETTEROF": "ፊደል %1 ከ%2", - "OPERATORS_LETTEROF_APPLE": "አንድ", - "OPERATORS_LENGTH": "%1 ርዝመት", - "OPERATORS_CONTAINS": "%2 %1 አለበት?", - "OPERATORS_MOD": "%1 ሞዱሎ %2", - "OPERATORS_ROUND": "%1ን አጠጋጋ", - "OPERATORS_MATHOP": "%1 ከ%2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "መሬት", - "OPERATORS_MATHOP_CEILING": "ጣራ", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ውስጥ", - "OPERATORS_MATHOP_LOG": "ግባ", - "OPERATORS_MATHOP_EEXP": "e^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "%1ን ደንግግ", - "SENSING_TOUCHINGOBJECT": "%1ን የነካ ነው?", - "SENSING_TOUCHINGOBJECT_POINTER": "የማውሱ መጠቆሚያ", - "SENSING_TOUCHINGOBJECT_EDGE": "ዳር", - "SENSING_TOUCHINGCOLOR": "%1ን ቀለም የነካ ነው?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 ቀለም %2ን የነካ ነው?", - "SENSING_DISTANCETO": "ርቀት እስከ %1", - "SENSING_DISTANCETO_POINTER": "የማውሱ መጠቆሚያ", - "SENSING_ASKANDWAIT": "%1 ጠይቅና ጠብቅ", - "SENSING_ASK_TEXT": "ስምህ ማን ነው?", - "SENSING_ANSWER": "መልስ", - "SENSING_KEYPRESSED": "ቁልፍ %1 ጫን ተብሏል?", - "SENSING_MOUSEDOWN": "መዳፊት ወደታች?", - "SENSING_MOUSEX": "መዳፊት x", - "SENSING_MOUSEY": "መዳፊት y", - "SENSING_SETDRAGMODE": "የጉትት ሞድ ወደ %1 ለውጥ", - "SENSING_SETDRAGMODE_DRAGGABLE": "ይጎተታል", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "አይጎተትም", - "SENSING_LOUDNESS": "ጮክታ", - "SENSING_LOUD": "ጮክ ነው?", - "SENSING_TIMER": "የጊዜ ቆጣሪ", - "SENSING_RESETTIMER": "ጊዜ ቆጣሪውን ከዜሮ ጀምር", - "SENSING_OF": "%1 ከ%2", - "SENSING_OF_XPOSITION": "x ቦታ", - "SENSING_OF_YPOSITION": "y ቦታ", - "SENSING_OF_DIRECTION": "አቅጣጫ", - "SENSING_OF_COSTUMENUMBER": "ልብስ ቁጥር", - "SENSING_OF_COSTUMENAME": "የአልባሳት ስም", - "SENSING_OF_SIZE": "መጠን", - "SENSING_OF_VOLUME": "የድምጽ መጠን", - "SENSING_OF_BACKDROPNUMBER": "የጀርባ ምስል #", - "SENSING_OF_BACKDROPNAME": "የጀርባ ምስል ስም", - "SENSING_OF_STAGE": "መድረክ", - "SENSING_CURRENT": "ያሁኑ %1", - "SENSING_CURRENT_YEAR": "አመት", - "SENSING_CURRENT_MONTH": "ወር", - "SENSING_CURRENT_DATE": "ቀን", - "SENSING_CURRENT_DAYOFWEEK": "የሳምንቱ ቀን", - "SENSING_CURRENT_HOUR": "ሰዓት", - "SENSING_CURRENT_MINUTE": "ደቂቃ", - "SENSING_CURRENT_SECOND": "ሁለተኛ", - "SENSING_DAYSSINCE2000": "ከ2000 ጀምሮ ያሉ ቀናት", - "SENSING_USERNAME": "የተጠቃሚ ስም", - "SENSING_USERID": "የተጠቃሚ መታወቂያ", - "SOUND_PLAY": "%1ን ድምጽ ጀምር", - "SOUND_PLAYUNTILDONE": "%1ን ድምጽ ተጫወት እስከሚያልቅ", - "SOUND_STOPALLSOUNDS": "ሁሉንም ድምጾች አቁም", - "SOUND_SETEFFECTO": "%1ን ተጽኖ ወደ %2 ለውጥ", - "SOUND_CHANGEEFFECTBY": "%1ን ተጽኖ በ%2 ለውጥ", - "SOUND_CLEAREFFECTS": "የድምጽ ተጽኖዎች አጽዳ", - "SOUND_EFFECTS_PITCH": "ፒች", - "SOUND_EFFECTS_PAN": "ሸብልል ወደ ግራ/ቀኝ", - "SOUND_CHANGEVOLUMEBY": "ድምጽ ቀይር በ%1", - "SOUND_SETVOLUMETO": "ድምጽ ወደ %1% ለውጥ", - "SOUND_VOLUME": "የድምጽ መጠን", - "SOUND_RECORD": "record...", - "CATEGORY_MOTION": "እንቅስቃሴ", - "CATEGORY_LOOKS": "ገጽታ", - "CATEGORY_SOUND": "ድምጽ", - "CATEGORY_EVENTS": "ክስተት", - "CATEGORY_CONTROL": "ቁጥጥር", - "CATEGORY_SENSING": "ስሜት", - "CATEGORY_OPERATORS": "ስሌቶች", - "CATEGORY_VARIABLES": "ተለዋዋጮች", - "CATEGORY_MYBLOCKS": "የኔ ጥምሮች", - "DUPLICATE": "ቅጂ አድርገህ ገልብጥ", - "DELETE": "አጥፋ", - "ADD_COMMENT": "አስተያየት ጨምር", - "REMOVE_COMMENT": "አስተያየት አውጣ", - "DELETE_BLOCK": "ጥምር ሰርዝ", - "DELETE_X_BLOCKS": "%1 ጥምሮች ሰርዝ", - "DELETE_ALL_BLOCKS": "ሁሉም %1 ጥምሮች ሰርዝ?", - "CLEAN_UP": "ጥምሮች አጽዳ", - "HELP": "እርዳታ", - "UNDO": "መልስ", - "REDO": "ድጋሜ አድርግ", - "EDIT_PROCEDURE": "ቀይር", - "SHOW_PROCEDURE_DEFINITION": "ወደ ትርጓሜ ሂድ", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "አንድ ነገር በል...", - "COLOUR_HUE_LABEL": "ቀለም", - "COLOUR_SATURATION_LABEL": "ርኬት", - "COLOUR_BRIGHTNESS_LABEL": "ብሩህነት", - "CHANGE_VALUE_TITLE": "እሴት ቀይር", - "RENAME_VARIABLE": "ተለዋዋጭ ደግመህ ሰይም", - "RENAME_VARIABLE_TITLE": "ሁሉም \"%1\" ተለዋዋጮች ደግመህ ሰይም ወደ፡", - "RENAME_VARIABLE_MODAL_TITLE": "ተለዋዋጭ ደግመህ ሰይም", - "NEW_VARIABLE": "ተለዋጭ ፍጠር", - "NEW_VARIABLE_TITLE": "አዲስ ተለዋዋጭ ስም", - "VARIABLE_MODAL_TITLE": "አዲስ ተለዋዋጭ", - "VARIABLE_ALREADY_EXISTS": "የተሰየመ ተለዋዋጭ \"%1\" አስቀድሞ አለ", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "አንድ ተለዋዋጭ \"%1\" የተሰየመ አስቀድሞ ይኖራል ለሌ ተለዋዋጭ በ\"%2\" ዓይነት.", - "DELETE_VARIABLE_CONFIRMATION": "የ%1 ጥቅሞች በ%2 ተለዋዋጭ ይሰረዙ?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "%1ን ተለዋዋጭ መሰረዝ አይቻልም የ%2ን ተግባር አባል ስለሆነ", - "DELETE_VARIABLE": "%1ን ተለዋዋጭ ይሰረዝ?", - "NEW_PROCEDURE": "ጡብ ፍጠር", - "PROCEDURE_ALREADY_EXISTS": "አንድ \"%1\" የተሰየመ ተግባር አስቀድሞ አለ", - "PROCEDURE_DEFAULT_NAME": "የጥምር ስም", - "NEW_LIST": "ዝርዝር ፍጠር", - "NEW_LIST_TITLE": "አዲስ ዝርዝር ስም", - "LIST_MODAL_TITLE": "አዲስ ዝርዝር", - "LIST_ALREADY_EXISTS": "አንድ \"%1\" የተሰየመ ዝርዝር አስቀድሞ አለ", - "RENAME_LIST_TITLE": "ሁሉም \"%1\" ዝርዝሮች ደግሞ ይሰየሙ ወደ፡ ", - "RENAME_LIST_MODAL_TITLE": "ዝርዝር ደግመህ ሰይም", - "DEFAULT_LIST_ITEM": "ነገር", - "DELETE_LIST": "Delete the \"%1\" list", - "RENAME_LIST": "Rename list", - "NEW_BROADCAST_MESSAGE": "አዲስ መልዕክት", - "NEW_BROADCAST_MESSAGE_TITLE": "አዲስ የመልዕክት ስም፡", - "BROADCAST_MODAL_TITLE": "አዲስ መልእክት", - "DEFAULT_BROADCAST_MESSAGE_NAME": "መልእክት1" -}; - -Blockly.ScratchMsgs.locales["az"] = -{ - "CONTROL_FOREVER": "həmişə", - "CONTROL_REPEAT": "təkrarla %1 dəfə", - "CONTROL_IF": "əgər %1, onda", - "CONTROL_ELSE": "əks halda", - "CONTROL_STOP": "dayandır", - "CONTROL_STOP_ALL": "hamısı", - "CONTROL_STOP_THIS": "bu skript", - "CONTROL_STOP_OTHER": "spraytın digər skriptləri", - "CONTROL_WAIT": "%1 saniyə gözlə", - "CONTROL_WAITUNTIL": "%1 qədər gözlə", - "CONTROL_REPEATUNTIL": "təkrarla nə qədər ki, %1 deyil", - "CONTROL_WHILE": "təkrarla nə qədər ki, %1 ", - "CONTROL_FOREACH": "hər bir %1 üçün %2 -də", - "CONTROL_STARTASCLONE": "mən klon kimi başlayanda", - "CONTROL_CREATECLONEOF": "%1 klonunu yarat", - "CONTROL_CREATECLONEOF_MYSELF": "özümün", - "CONTROL_DELETETHISCLONE": "bu klonu sil", - "CONTROL_COUNTER": "sayğac", - "CONTROL_INCRCOUNTER": "sayğacın göstəricisini artır", - "CONTROL_CLEARCOUNTER": "sayğacı təmizlə", - "CONTROL_ALLATONCE": "hamısı birlikdə", - "DATA_SETVARIABLETO": "%1 təyin et: %2", - "DATA_CHANGEVARIABLEBY": "%1 -i %2 qədər dəyiş", - "DATA_SHOWVARIABLE": "%1 dəyişənini göstər", - "DATA_HIDEVARIABLE": "%1 dəyişənini gizlət", - "DATA_ADDTOLIST": "%1 -i %2 siyahısına əlavə et", - "DATA_DELETEOFLIST": "%1 elementini %2 siyahısından sil", - "DATA_DELETEALLOFLIST": "%1 siyahısının bütün elementlərini sil", - "DATA_INSERTATLIST": "%1 elementini %2 mövqeyində %3 siyahısına daxil et", - "DATA_REPLACEITEMOFLIST": "%1 elementini %2 siyahısında %3 ilə əvəz et", - "DATA_ITEMOFLIST": "%1 elementi %2 siyahısından", - "DATA_ITEMNUMOFLIST": "item # of %1 in %2", - "DATA_LENGTHOFLIST": "%1 siyahısının uzunluğu", - "DATA_LISTCONTAINSITEM": "%1 tərkibində %2 var?", - "DATA_SHOWLIST": "%1 siyahısını göstər", - "DATA_HIDELIST": "%1 siyahısını gizlət", - "DATA_INDEX_ALL": "bütün", - "DATA_INDEX_LAST": "son", - "DATA_INDEX_RANDOM": "təsadüfi", - "EVENT_WHENFLAGCLICKED": "%1 kliklənəndə", - "EVENT_WHENTHISSPRITECLICKED": "sprayt kliklənəndə", - "EVENT_WHENSTAGECLICKED": "səhnə kliklənəndə", - "EVENT_WHENTOUCHINGOBJECT": "sprayt %1 toxunanda", - "EVENT_WHENBROADCASTRECEIVED": "mən %1 qəbul edəndə", - "EVENT_WHENBACKDROPSWITCHESTO": "fon %1 fonuna dəyişdiriləndə", - "EVENT_WHENGREATERTHAN": "%1 > %2 olduqda", - "EVENT_WHENGREATERTHAN_TIMER": "taymer", - "EVENT_WHENGREATERTHAN_LOUDNESS": "səs ucalığı", - "EVENT_BROADCAST": "%1 ötür", - "EVENT_BROADCASTANDWAIT": "%1 ötür və gözlə", - "EVENT_WHENKEYPRESSED": "%1 düyməsinə basdıqda", - "EVENT_WHENKEYPRESSED_SPACE": "boşluq", - "EVENT_WHENKEYPRESSED_LEFT": "sol ox", - "EVENT_WHENKEYPRESSED_RIGHT": "sağ ox", - "EVENT_WHENKEYPRESSED_DOWN": "aşağı ox", - "EVENT_WHENKEYPRESSED_UP": "yuxarı ox", - "EVENT_WHENKEYPRESSED_ANY": "hər hansı", - "LOOKS_SAYFORSECS": "%1 de %2 saniyə", - "LOOKS_SAY": "%1 de", - "LOOKS_HELLO": "Salam!", - "LOOKS_THINKFORSECS": "%1 düşün %2 saniyə", - "LOOKS_THINK": "%1 düşün", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "görün", - "LOOKS_HIDE": "gizlən", - "LOOKS_HIDEALLSPRITES": "bütün spraytları gizlət", - "LOOKS_EFFECT_COLOR": "rəng", - "LOOKS_EFFECT_FISHEYE": "qabarma", - "LOOKS_EFFECT_WHIRL": "burulma", - "LOOKS_EFFECT_PIXELATE": "piksel", - "LOOKS_EFFECT_MOSAIC": "mozaika", - "LOOKS_EFFECT_BRIGHTNESS": "parlaqlıq", - "LOOKS_EFFECT_GHOST": "ruh", - "LOOKS_CHANGEEFFECTBY": "%1 effektini %2 qədər dəyiş", - "LOOKS_SETEFFECTTO": "%1 effektini %2 təyin et", - "LOOKS_CLEARGRAPHICEFFECTS": "qrafik effektləri sil", - "LOOKS_CHANGESIZEBY": "ölçünü %1 qədər dəyiş", - "LOOKS_SETSIZETO": "ölçünü %1 % təyin et", - "LOOKS_SIZE": "ölçü", - "LOOKS_CHANGESTRETCHBY": "uzunluğu %1 qədər dəyiş", - "LOOKS_SETSTRETCHTO": "uzunluğu %1 % təyin et", - "LOOKS_SWITCHCOSTUMETO": "%1 libasına dəyiş", - "LOOKS_NEXTCOSTUME": "növbəti libas", - "LOOKS_SWITCHBACKDROPTO": "%1 fonuna dəyiş", - "LOOKS_GOTOFRONTBACK": "%1 fonuna keç", - "LOOKS_GOTOFRONTBACK_FRONT": "ön", - "LOOKS_GOTOFRONTBACK_BACK": "arxa", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 fonuna keç", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "irəli", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "geri", - "LOOKS_BACKDROPNUMBERNAME": "%1 fonu", - "LOOKS_COSTUMENUMBERNAME": "%1 libası", - "LOOKS_NUMBERNAME_NUMBER": "rəqəm", - "LOOKS_NUMBERNAME_NAME": "ad", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "fonu %1 fonuna dəyiş və gözlə", - "LOOKS_NEXTBACKDROP_BLOCK": "növbəti fon", - "LOOKS_NEXTBACKDROP": "növbəti fon", - "LOOKS_PREVIOUSBACKDROP": "əvvəlki fon", - "LOOKS_RANDOMBACKDROP": "təsadüfi fon", - "MOTION_MOVESTEPS": "%1 addım at", - "MOTION_TURNLEFT": "dön %1 %2 dərəcə", - "MOTION_TURNRIGHT": "dön %1 %2 dərəcə", - "MOTION_POINTINDIRECTION": "%1 istiqamətində dön", - "MOTION_POINTTOWARDS": "%1 tərəfinə dön", - "MOTION_POINTTOWARDS_POINTER": "siçanın göstəricisi", - "MOTION_POINTTOWARDS_RANDOM": "random direction", - "MOTION_GOTO": "keç: %1", - "MOTION_GOTO_POINTER": "siçanın göstəricisi", - "MOTION_GOTO_RANDOM": "təsadüfi mövqe", - "MOTION_GOTOXY": "keç: x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "%1 saniyə x: %2 y: %3 nöqtəsinə üz", - "MOTION_GLIDETO": "%1 saniyə %2 tərəfə üz", - "MOTION_GLIDETO_POINTER": "siçanın göstəricisi", - "MOTION_GLIDETO_RANDOM": "təsadüfi mövqe", - "MOTION_CHANGEXBY": "x-i %1 qədər dəyiş", - "MOTION_SETX": "x-i %1 təyin et", - "MOTION_CHANGEYBY": "y-i %1 qədər dəyiş", - "MOTION_SETY": "y-i %1 təyin et", - "MOTION_IFONEDGEBOUNCE": "kənara çatdınsa, geri çəkil", - "MOTION_SETROTATIONSTYLE": "dönmə istiqamətini %1 təyin et", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "sol-sağ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "dönməmək", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "hər tərəfə", - "MOTION_XPOSITION": "x mövqeyi", - "MOTION_YPOSITION": "y mövqeyi", - "MOTION_DIRECTION": "istiqamət", - "MOTION_SCROLLRIGHT": "sağa doğru %1 qədər sürüş", - "MOTION_SCROLLUP": "yuxarı doğru %1 qədər sürüş", - "MOTION_ALIGNSCENE": "%1 istiqamətdən səhnəni düzləndir", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "aşağı-sol", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "aşağı-sağ", - "MOTION_ALIGNSCENE_MIDDLE": "orta", - "MOTION_ALIGNSCENE_TOPLEFT": "yuxarı-sol", - "MOTION_ALIGNSCENE_TOPRIGHT": "yuxarı-sağ", - "MOTION_XSCROLL": "x oxu üzrə sürüşdür", - "MOTION_YSCROLL": "y oxu üzrə sürüşdür", - "MOTION_STAGE_SELECTED": "Səhnə seçilmişdir: Hərəkət blokları yoxdur", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 və %2 arasında təsadüfi seç", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 və %2", - "OPERATORS_OR": "%1 və ya %2", - "OPERATORS_NOT": "%1 deyil ", - "OPERATORS_JOIN": "birləşdir: %1 və %2", - "OPERATORS_JOIN_APPLE": "alma", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "hərf %1 %2-də", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "%1 sözünün uzunluğu", - "OPERATORS_CONTAINS": "%1 sözünün tərkibində %2 hərfi var?", - "OPERATORS_MOD": "%1 ədədinin %2 ədədinə bölünməsindən qalıq", - "OPERATORS_ROUND": "%1 yuvarlaqlaşdır", - "OPERATORS_MATHOP": "%1 %2", - "OPERATORS_MATHOP_ABS": "modul", - "OPERATORS_MATHOP_FLOOR": "aşağı yuvarlaqlaşdır", - "OPERATORS_MATHOP_CEILING": "yuxarı yuvarlaqlaşdır", - "OPERATORS_MATHOP_SQRT": "kvadrat kök", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctg", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "%1 təyin et", - "SENSING_TOUCHINGOBJECT": "%1 toxunur?", - "SENSING_TOUCHINGOBJECT_POINTER": "siçanın göstəricisi", - "SENSING_TOUCHINGOBJECT_EDGE": "kənar", - "SENSING_TOUCHINGCOLOR": "%1 rənginə toxunur?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 rəngi %2 rənginə toxunur?", - "SENSING_DISTANCETO": "%1 qədər məsafə", - "SENSING_DISTANCETO_POINTER": "siçanın göstəricisi", - "SENSING_ASKANDWAIT": "%1 soruş və gözlə", - "SENSING_ASK_TEXT": "Sənin adın nədir?", - "SENSING_ANSWER": "cavab", - "SENSING_KEYPRESSED": "%1 düyməsi basılıb?", - "SENSING_MOUSEDOWN": "siçanın düyməsi basılıb?", - "SENSING_MOUSEX": "siçanın göstəricisinin x koordinatı", - "SENSING_MOUSEY": "siçanın göstəricisinin y koordinatı", - "SENSING_SETDRAGMODE": "%1 daşıma rejimi təyin et", - "SENSING_SETDRAGMODE_DRAGGABLE": "daşınabilən", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "daşınabilməyən", - "SENSING_LOUDNESS": "səs ucalığı", - "SENSING_LOUD": "ucadır?", - "SENSING_TIMER": "taymer", - "SENSING_RESETTIMER": "taymeri yenidən başlat", - "SENSING_OF": "%1 %2-in", - "SENSING_OF_XPOSITION": "x mövqeyi", - "SENSING_OF_YPOSITION": "y mövqeyi", - "SENSING_OF_DIRECTION": "istiqamət", - "SENSING_OF_COSTUMENUMBER": "libas #", - "SENSING_OF_COSTUMENAME": "libasın adı", - "SENSING_OF_SIZE": "ölçü", - "SENSING_OF_VOLUME": "səsin yüksəkliyi", - "SENSING_OF_BACKDROPNUMBER": "fon #", - "SENSING_OF_BACKDROPNAME": "fonun adı", - "SENSING_OF_STAGE": "Səhnə", - "SENSING_CURRENT": "cari %1", - "SENSING_CURRENT_YEAR": "il", - "SENSING_CURRENT_MONTH": "ay", - "SENSING_CURRENT_DATE": "tarix", - "SENSING_CURRENT_DAYOFWEEK": "həftənin günü", - "SENSING_CURRENT_HOUR": "saat", - "SENSING_CURRENT_MINUTE": "dəqiqə", - "SENSING_CURRENT_SECOND": "saniyə", - "SENSING_DAYSSINCE2000": "01.01.2000 tarixindən ötən günlərin sayı", - "SENSING_USERNAME": "istifadəçinin adı", - "SENSING_USERID": "istifadəçi adı", - "SOUND_PLAY": "%1 səsini ifa et", - "SOUND_PLAYUNTILDONE": "%1 səsini sona qədər ifa et", - "SOUND_STOPALLSOUNDS": "bütün səsləri dayandır", - "SOUND_SETEFFECTO": "%1 effektini %2 təyin et", - "SOUND_CHANGEEFFECTBY": "%1 effektini %2 qədər dəyiş", - "SOUND_CLEAREFFECTS": "səs effektlərini təmizlə", - "SOUND_EFFECTS_PITCH": "kökləmək", - "SOUND_EFFECTS_PAN": "tas sol/sağ", - "SOUND_CHANGEVOLUMEBY": "səs ucalığını %1 qədər dəyiş", - "SOUND_SETVOLUMETO": "səs ucalığını %1% təyin et", - "SOUND_VOLUME": "səsin yüksəkliyi", - "SOUND_RECORD": "record...", - "CATEGORY_MOTION": "Hərəkət", - "CATEGORY_LOOKS": "Görünüş", - "CATEGORY_SOUND": "Səs", - "CATEGORY_EVENTS": "Hadisələr", - "CATEGORY_CONTROL": "İdarəetmə", - "CATEGORY_SENSING": "Sensorlar", - "CATEGORY_OPERATORS": "Operatorlar", - "CATEGORY_VARIABLES": "Dəyişənlər", - "CATEGORY_MYBLOCKS": "Mənim Bloklarım", - "DUPLICATE": "Dublikatın yarat", - "DELETE": "Sil", - "ADD_COMMENT": "Şərh əlavə et", - "REMOVE_COMMENT": "Şərhi sil", - "DELETE_BLOCK": "Bloku sil", - "DELETE_X_BLOCKS": "%1 bloklarını sil", - "DELETE_ALL_BLOCKS": "bütün %1 bloklarını sil", - "CLEAN_UP": "Blokları sil", - "HELP": "Yardım", - "UNDO": "Ləğv et", - "REDO": "Yenidən", - "EDIT_PROCEDURE": "Düzəliş et", - "SHOW_PROCEDURE_DEFINITION": "Tərifə get", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Nəsə de ...", - "COLOUR_HUE_LABEL": "Rəng", - "COLOUR_SATURATION_LABEL": "Dolğunluq", - "COLOUR_BRIGHTNESS_LABEL": "Parlaqlıq", - "CHANGE_VALUE_TITLE": "Qiyməti dəyiş", - "RENAME_VARIABLE": "Dəyişənin adını dəyiş", - "RENAME_VARIABLE_TITLE": "Bütün \"%1\" dəyişənlərinin adını dəyiş:", - "RENAME_VARIABLE_MODAL_TITLE": "Dəyişənin adını dəyiş", - "NEW_VARIABLE": "Dəyişən yarat", - "NEW_VARIABLE_TITLE": "Yeni dəyişənin adı:", - "VARIABLE_MODAL_TITLE": "Yeni Dəyişən", - "VARIABLE_ALREADY_EXISTS": "\"%1\" adlı dəyişən artıq mövcuddur.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "\"%1\" adlı dəyişən digər \"%2\" növ dəyişən üçün artıq mövcuddur.", - "DELETE_VARIABLE_CONFIRMATION": "%1 silinsin \"%2\" dəyişənini istifadə edən?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "\"%1\" dəyişəni silinə bilmir, çünki \"%2\" funksiyasındakı tərifin bir hissəsidir", - "DELETE_VARIABLE": "\"%1\" dəyişənini sil", - "NEW_PROCEDURE": "Blok yarat", - "PROCEDURE_ALREADY_EXISTS": "\"%1\" adlı prosedur artıq mövcuddur.", - "PROCEDURE_DEFAULT_NAME": "blokun adı", - "NEW_LIST": "Siyahı yarat", - "NEW_LIST_TITLE": "Yeni siyahının adı:", - "LIST_MODAL_TITLE": "Yeni siyahı", - "LIST_ALREADY_EXISTS": "\"%1\" adlı siyahı artıq mövcuddur.", - "RENAME_LIST_TITLE": "Bütün \"%1\" siyahılarının adını dəyiş:", - "RENAME_LIST_MODAL_TITLE": "Siyahının adını dəyiş", - "DEFAULT_LIST_ITEM": "əşya", - "DELETE_LIST": "Delete the \"%1\" list", - "RENAME_LIST": "Rename list", - "NEW_BROADCAST_MESSAGE": "Yeni ismarıc", - "NEW_BROADCAST_MESSAGE_TITLE": "Yeni ismarıcın adı:", - "BROADCAST_MODAL_TITLE": "Yeni ismarıc", - "DEFAULT_BROADCAST_MESSAGE_NAME": "ismarıc 1" -}; - -Blockly.ScratchMsgs.locales["id"] = -{ - "CONTROL_FOREVER": "selamanya", - "CONTROL_REPEAT": "ulangi %1 kali", - "CONTROL_IF": "jika %1 maka", - "CONTROL_ELSE": "jika tidak", - "CONTROL_STOP": "berhenti", - "CONTROL_STOP_ALL": "semua", - "CONTROL_STOP_THIS": "skrip ini", - "CONTROL_STOP_OTHER": "skrip lain di sprite ini", - "CONTROL_WAIT": "tunggu %1 detik", - "CONTROL_WAITUNTIL": "tunggu sampai %1", - "CONTROL_REPEATUNTIL": "ulangi sampai %1", - "CONTROL_WHILE": "selama %1", - "CONTROL_FOREACH": "untuk setiap %1 dalam %2", - "CONTROL_STARTASCLONE": "ketika aku mulai sebagai clone", - "CONTROL_CREATECLONEOF": "buat clone dari %1", - "CONTROL_CREATECLONEOF_MYSELF": "diriku", - "CONTROL_DELETETHISCLONE": "hapus clone ini", - "CONTROL_COUNTER": "hitungan", - "CONTROL_INCRCOUNTER": "tingkatkan hitungan", - "CONTROL_CLEARCOUNTER": "bersihkan hitungan", - "CONTROL_ALLATONCE": "semuanya sekaligus", - "DATA_SETVARIABLETO": "atur %1 ke %2", - "DATA_CHANGEVARIABLEBY": "ubah %1 sebesar %2", - "DATA_SHOWVARIABLE": "tampilkan variabel %1", - "DATA_HIDEVARIABLE": "sembunyikan variabel %1", - "DATA_ADDTOLIST": "tambahkan %1 ke %2", - "DATA_DELETEOFLIST": "hapus %1 dari %2", - "DATA_DELETEALLOFLIST": "hapus semua dari %1", - "DATA_INSERTATLIST": "sisipkan %1 pada %2 dari %3", - "DATA_REPLACEITEMOFLIST": "ganti benda %1 dari %2 dengan %3", - "DATA_ITEMOFLIST": "benda %1 dari %2", - "DATA_ITEMNUMOFLIST": "benda # dari %1 di %2", - "DATA_LENGTHOFLIST": "panjang dari %1", - "DATA_LISTCONTAINSITEM": "%1 berisi %2?", - "DATA_SHOWLIST": "tampilkan daftar %1", - "DATA_HIDELIST": "sembunyikan daftar %1", - "DATA_INDEX_ALL": "semua", - "DATA_INDEX_LAST": "terakhir", - "DATA_INDEX_RANDOM": "sembarang", - "EVENT_WHENFLAGCLICKED": "ketika %1 diklik", - "EVENT_WHENTHISSPRITECLICKED": "ketika sprite ini diklik", - "EVENT_WHENSTAGECLICKED": "ketika panggung diklik", - "EVENT_WHENTOUCHINGOBJECT": "ketika sprite ini menyentuh %1", - "EVENT_WHENBROADCASTRECEIVED": "ketika aku menerima %1", - "EVENT_WHENBACKDROPSWITCHESTO": "ketika latar menjadi %1", - "EVENT_WHENGREATERTHAN": "ketika %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "pengatur waktu", - "EVENT_WHENGREATERTHAN_LOUDNESS": "kenyaringan", - "EVENT_BROADCAST": "siarkan %1", - "EVENT_BROADCASTANDWAIT": "siarkan %1 dan tunggu", - "EVENT_WHENKEYPRESSED": "ketika tombol %1 ditekan", - "EVENT_WHENKEYPRESSED_SPACE": "spasi", - "EVENT_WHENKEYPRESSED_LEFT": "panah kiri", - "EVENT_WHENKEYPRESSED_RIGHT": "panah kanan", - "EVENT_WHENKEYPRESSED_DOWN": "panah bawah", - "EVENT_WHENKEYPRESSED_UP": "panah atas", - "EVENT_WHENKEYPRESSED_ANY": "manapun", - "LOOKS_SAYFORSECS": "katakan %1 selama %2 detik", - "LOOKS_SAY": "katakan %1", - "LOOKS_HELLO": "Halo!", - "LOOKS_THINKFORSECS": "pikirkan %1 selama %2 detik", - "LOOKS_THINK": "pikirkan %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "tampilkan", - "LOOKS_HIDE": "sembunyikan", - "LOOKS_HIDEALLSPRITES": "sembunyikan semua sprite", - "LOOKS_EFFECT_COLOR": "warna", - "LOOKS_EFFECT_FISHEYE": "mata ikan", - "LOOKS_EFFECT_WHIRL": "pusaran", - "LOOKS_EFFECT_PIXELATE": "pixelasi", - "LOOKS_EFFECT_MOSAIC": "mosaik", - "LOOKS_EFFECT_BRIGHTNESS": "kecerahan", - "LOOKS_EFFECT_GHOST": "bayangan", - "LOOKS_CHANGEEFFECTBY": "ubah efek %1 sebesar %2", - "LOOKS_SETEFFECTTO": "atur efek %1 ke %2", - "LOOKS_CLEARGRAPHICEFFECTS": "hapus semua efek grafis", - "LOOKS_CHANGESIZEBY": "ubah ukuran sebesar %1", - "LOOKS_SETSIZETO": "atur ukuran ke %1 %", - "LOOKS_SIZE": "ukuran", - "LOOKS_CHANGESTRETCHBY": "ubah rentangan sebesar %1", - "LOOKS_SETSTRETCHTO": "atur rentangan ke %1 %", - "LOOKS_SWITCHCOSTUMETO": "ganti kostum ke %1", - "LOOKS_NEXTCOSTUME": "kostum berikutnya", - "LOOKS_SWITCHBACKDROPTO": "ganti latar ke %1", - "LOOKS_GOTOFRONTBACK": "pergi ke lapisan %1", - "LOOKS_GOTOFRONTBACK_FRONT": "depan", - "LOOKS_GOTOFRONTBACK_BACK": "belakang", - "LOOKS_GOFORWARDBACKWARDLAYERS": "pergi %1 %2 lapisan", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "maju", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "mundur", - "LOOKS_BACKDROPNUMBERNAME": "latar %1", - "LOOKS_COSTUMENUMBERNAME": "kostum %1", - "LOOKS_NUMBERNAME_NUMBER": "angka", - "LOOKS_NUMBERNAME_NAME": "nama", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "ganti latar ke %1 dan tunggu", - "LOOKS_NEXTBACKDROP_BLOCK": "latar berikutnya", - "LOOKS_NEXTBACKDROP": "latar berikutnya", - "LOOKS_PREVIOUSBACKDROP": "latar sebelumnya", - "LOOKS_RANDOMBACKDROP": "latar sembarang", - "MOTION_MOVESTEPS": "gerak %1 langkah", - "MOTION_TURNLEFT": "putar %1 %2 derajat", - "MOTION_TURNRIGHT": "putar %1 %2 derajat", - "MOTION_POINTINDIRECTION": "mengarah ke arah %1", - "MOTION_POINTTOWARDS": "mengarah ke %1", - "MOTION_POINTTOWARDS_POINTER": "penunjuk tetikus", - "MOTION_POINTTOWARDS_RANDOM": "arah sembarang", - "MOTION_GOTO": "pergi ke %1", - "MOTION_GOTO_POINTER": "penunjuk tetikus", - "MOTION_GOTO_RANDOM": "posisi sembarang", - "MOTION_GOTOXY": "pergi ke x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "meluncur %1 detik ke x: %2 y: %3", - "MOTION_GLIDETO": "meluncur %1 detik ke %2", - "MOTION_GLIDETO_POINTER": "penunjuk tetikus", - "MOTION_GLIDETO_RANDOM": "posisi sembarang", - "MOTION_CHANGEXBY": "ubah x sebesar %1", - "MOTION_SETX": "atur x ke %1", - "MOTION_CHANGEYBY": "ubah y sebesar %1", - "MOTION_SETY": "atur y ke %1", - "MOTION_IFONEDGEBOUNCE": "jika di pinggir, pantulkan", - "MOTION_SETROTATIONSTYLE": "atur gaya rotasi %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "kiri-kanan", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "jangan berputar", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "seluruh", - "MOTION_XPOSITION": "posisi x", - "MOTION_YPOSITION": "posisi y", - "MOTION_DIRECTION": "arah", - "MOTION_SCROLLRIGHT": "gulir ke kanan %1", - "MOTION_SCROLLUP": "gulir ke atas %1", - "MOTION_ALIGNSCENE": "luruskan pemandangan %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "kiri-bawah", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "kanan-bawah", - "MOTION_ALIGNSCENE_MIDDLE": "tengah", - "MOTION_ALIGNSCENE_TOPLEFT": "kiri-atas", - "MOTION_ALIGNSCENE_TOPRIGHT": "kanan-atas", - "MOTION_XSCROLL": "guliran x", - "MOTION_YSCROLL": "guliran y", - "MOTION_STAGE_SELECTED": "Panggung terpilih: tidak ada balok gerakan", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "pilih acak dari %1 hingga %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 dan %2", - "OPERATORS_OR": "%1 atau %2", - "OPERATORS_NOT": "tidak %1", - "OPERATORS_JOIN": "gabungkan %1 %2", - "OPERATORS_JOIN_APPLE": "apel", - "OPERATORS_JOIN_BANANA": "pisang", - "OPERATORS_LETTEROF": "huruf %1 dari %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "panjang dari %1", - "OPERATORS_CONTAINS": "%1 berisi %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "bulatkan %1", - "OPERATORS_MATHOP": "%1 dari %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "floor", - "OPERATORS_MATHOP_CEILING": "ceil", - "OPERATORS_MATHOP_SQRT": "akar kuadrat", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "artikan %1", - "SENSING_TOUCHINGOBJECT": "menyentuh %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "penunjuk tetikus", - "SENSING_TOUCHINGOBJECT_EDGE": "pinggir", - "SENSING_TOUCHINGCOLOR": "menyentuh warna %1?", - "SENSING_COLORISTOUCHINGCOLOR": "warna %1 menyentuh %2?", - "SENSING_DISTANCETO": "jarak dari %1", - "SENSING_DISTANCETO_POINTER": "penunujuk tetikus", - "SENSING_ASKANDWAIT": "tanya %1 dan tunggu", - "SENSING_ASK_TEXT": "Apa namamu?", - "SENSING_ANSWER": "jawaban", - "SENSING_KEYPRESSED": "tombol %1 ditekan?", - "SENSING_MOUSEDOWN": "tetikus ditekan?", - "SENSING_MOUSEX": "x tetikus", - "SENSING_MOUSEY": "y tetikus", - "SENSING_SETDRAGMODE": "atur mode seret %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "dapat diseret", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "tidak dapat diseret", - "SENSING_LOUDNESS": "kenyaringan", - "SENSING_LOUD": "nyaring?", - "SENSING_TIMER": "pengatur waktu", - "SENSING_RESETTIMER": "atur ulang pengatur waktu", - "SENSING_OF": "%1 dari %2", - "SENSING_OF_XPOSITION": "posisi x", - "SENSING_OF_YPOSITION": "posisi y", - "SENSING_OF_DIRECTION": "arah", - "SENSING_OF_COSTUMENUMBER": "kostum #", - "SENSING_OF_COSTUMENAME": "nama kostum", - "SENSING_OF_SIZE": "ukuran", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "latar #", - "SENSING_OF_BACKDROPNAME": "nama latar", - "SENSING_OF_STAGE": "Panggung", - "SENSING_CURRENT": "%1 saat ini", - "SENSING_CURRENT_YEAR": "tahun", - "SENSING_CURRENT_MONTH": "bulan", - "SENSING_CURRENT_DATE": "tanggal", - "SENSING_CURRENT_DAYOFWEEK": "nama hari", - "SENSING_CURRENT_HOUR": "jam", - "SENSING_CURRENT_MINUTE": "menit", - "SENSING_CURRENT_SECOND": "detik", - "SENSING_DAYSSINCE2000": "hari-hari sejak 2000", - "SENSING_USERNAME": "nama pengguna", - "SENSING_USERID": "id pengguna", - "SOUND_PLAY": "mulai suara %1", - "SOUND_PLAYUNTILDONE": "mainkan suara %1 sampai selesai", - "SOUND_STOPALLSOUNDS": "hentikan semua suara", - "SOUND_SETEFFECTO": "atur efek %1 ke %2", - "SOUND_CHANGEEFFECTBY": "ubah efek %1 sebesar %2", - "SOUND_CLEAREFFECTS": "hapus semua efek suara", - "SOUND_EFFECTS_PITCH": "nada", - "SOUND_EFFECTS_PAN": "pan kiri/kanan", - "SOUND_CHANGEVOLUMEBY": "ubah volume sebesar %1", - "SOUND_SETVOLUMETO": "atur volume ke %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "rekam...", - "CATEGORY_MOTION": "Gerakan", - "CATEGORY_LOOKS": "Tampilan", - "CATEGORY_SOUND": "Suara", - "CATEGORY_EVENTS": "Kejadian", - "CATEGORY_CONTROL": "Kontrol", - "CATEGORY_SENSING": "Sensor", - "CATEGORY_OPERATORS": "Operator", - "CATEGORY_VARIABLES": "Variabel", - "CATEGORY_MYBLOCKS": "Balok Saya", - "DUPLICATE": "Gandakan", - "DELETE": "Hapus", - "ADD_COMMENT": "Tambahkan Komentar", - "REMOVE_COMMENT": "Hapus Komentar", - "DELETE_BLOCK": "Hapus Balok", - "DELETE_X_BLOCKS": "Hapus %1 Balok", - "DELETE_ALL_BLOCKS": "Hapus semua %1 balok?", - "CLEAN_UP": "Bersihkan Balok-Balok", - "HELP": "Bantuan", - "UNDO": "Batalkan", - "REDO": "Ulangi", - "EDIT_PROCEDURE": "Sunting", - "SHOW_PROCEDURE_DEFINITION": "Pergi ke pengartian", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Katakan sesuatu...", - "COLOUR_HUE_LABEL": "Warna", - "COLOUR_SATURATION_LABEL": "Saturasi", - "COLOUR_BRIGHTNESS_LABEL": "Keterangan", - "CHANGE_VALUE_TITLE": "Ubah nilai:", - "RENAME_VARIABLE": "Namakan ulang variabel", - "RENAME_VARIABLE_TITLE": "Namakan ulang semua variabel \"%1\" ke:", - "RENAME_VARIABLE_MODAL_TITLE": "Namakan Ulang Variabel", - "NEW_VARIABLE": "Buat sebuah Variabel", - "NEW_VARIABLE_TITLE": "Nama variabel baru:", - "VARIABLE_MODAL_TITLE": "Variabel Baru", - "VARIABLE_ALREADY_EXISTS": "Sebuah variabel bernama \"%1\" sudah ada.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Sebuah variabel bernama \"%1\" sudah ada untuk variabel lain berjenis \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Hapus penggunaan %1 dari variabel \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Tidak bisa menghapus variabel \"%1\" karena bagian dari pengartian fungsi \"%2\"", - "DELETE_VARIABLE": "Hapus variabel \"%1\"", - "NEW_PROCEDURE": "Buat sebuah Balok", - "PROCEDURE_ALREADY_EXISTS": "Sebuah prosedur bernama \"%1\" sudah ada", - "PROCEDURE_DEFAULT_NAME": "nama balok", - "NEW_LIST": "Buat sebuah Daftar", - "NEW_LIST_TITLE": "Nama daftar baru:", - "LIST_MODAL_TITLE": "Daftar Baru", - "LIST_ALREADY_EXISTS": "Sebuah daftar bernama \"%1\" sudah ada.", - "RENAME_LIST_TITLE": "Namakan ulang semua daftar \"%1\" ke:", - "RENAME_LIST_MODAL_TITLE": "Namakan Ulang Daftar:", - "DEFAULT_LIST_ITEM": "benda", - "DELETE_LIST": "Hapus daftar \"%1\"", - "RENAME_LIST": "Namakan ulang daftar", - "NEW_BROADCAST_MESSAGE": "Pesan baru", - "NEW_BROADCAST_MESSAGE_TITLE": "Nama pesan baru:", - "BROADCAST_MODAL_TITLE": "Pesan Baru", - "DEFAULT_BROADCAST_MESSAGE_NAME": "pesan1" -}; - -Blockly.ScratchMsgs.locales["be"] = -{ - "CONTROL_FOREVER": "заўжды", - "CONTROL_REPEAT": "паўтарыць %1", - "CONTROL_IF": "калі %1 , то", - "CONTROL_ELSE": "інакш", - "CONTROL_STOP": "стоп", - "CONTROL_STOP_ALL": "усе", - "CONTROL_STOP_THIS": "гэты скрыпт", - "CONTROL_STOP_OTHER": "іншыя скрыпты спрайта", - "CONTROL_WAIT": "чакаць %1 секунд", - "CONTROL_WAITUNTIL": "чакаць да %1", - "CONTROL_REPEATUNTIL": "паўтараць, пакуль не %1", - "CONTROL_WHILE": "пакуль %1", - "CONTROL_FOREACH": "для кожнага %1 у %2", - "CONTROL_STARTASCLONE": "калі я пачынаю як клон", - "CONTROL_CREATECLONEOF": "стварыць клона %1", - "CONTROL_CREATECLONEOF_MYSELF": "сябе", - "CONTROL_DELETETHISCLONE": "выдаліць гэтага клона", - "CONTROL_COUNTER": "лічыльнік", - "CONTROL_INCRCOUNTER": "павялічыць лічыльнік", - "CONTROL_CLEARCOUNTER": "ачысціць лічыльнік", - "CONTROL_ALLATONCE": "усё адразу", - "DATA_SETVARIABLETO": "устанавіць %1 у %2", - "DATA_CHANGEVARIABLEBY": "змяніць %1 на %2", - "DATA_SHOWVARIABLE": "паказаць зменную %1", - "DATA_HIDEVARIABLE": "схаваць зменную %1", - "DATA_ADDTOLIST": "дадаць %1 да %2", - "DATA_DELETEOFLIST": "выдаліць %1 з %2", - "DATA_DELETEALLOFLIST": "выдаліць усё з %1", - "DATA_INSERTATLIST": "уставіць %1 у %2 з %3", - "DATA_REPLACEITEMOFLIST": "замяніць элемент %1 у %2 на %3", - "DATA_ITEMOFLIST": "элемент %1 з %2", - "DATA_ITEMNUMOFLIST": "элемент # з %1 у %2", - "DATA_LENGTHOFLIST": "даўжыня %1", - "DATA_LISTCONTAINSITEM": "%1 змяшчае %2?", - "DATA_SHOWLIST": "паказаць спіс %1", - "DATA_HIDELIST": "схаваць спіс %1", - "DATA_INDEX_ALL": "усе", - "DATA_INDEX_LAST": "апошні", - "DATA_INDEX_RANDOM": "выпадковы", - "EVENT_WHENFLAGCLICKED": "калі %1 націснуты", - "EVENT_WHENTHISSPRITECLICKED": "калі спрайт націснуты", - "EVENT_WHENSTAGECLICKED": "калі клікнуць па сцэне", - "EVENT_WHENTOUCHINGOBJECT": "калі спрайт кранаецца %1", - "EVENT_WHENBROADCASTRECEIVED": "калі я атрымаю %1", - "EVENT_WHENBACKDROPSWITCHESTO": "калі фон змяняецца на %1", - "EVENT_WHENGREATERTHAN": "калі %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "таймер", - "EVENT_WHENGREATERTHAN_LOUDNESS": "гучнасць", - "EVENT_BROADCAST": "разаслаць %1", - "EVENT_BROADCASTANDWAIT": "разаслаць %1 і чакаць", - "EVENT_WHENKEYPRESSED": "калі клавіша %1 націснутая", - "EVENT_WHENKEYPRESSED_SPACE": "прабел", - "EVENT_WHENKEYPRESSED_LEFT": "стрэлка налева", - "EVENT_WHENKEYPRESSED_RIGHT": "стрэлка направа", - "EVENT_WHENKEYPRESSED_DOWN": "стрэлка ўніз", - "EVENT_WHENKEYPRESSED_UP": "стрэлка ўверх", - "EVENT_WHENKEYPRESSED_ANY": "любы", - "LOOKS_SAYFORSECS": "казаць %1 на працягу %2 секунд", - "LOOKS_SAY": "сказаць %1", - "LOOKS_HELLO": "Вітаю!", - "LOOKS_THINKFORSECS": "думаць %1 %2 секунд", - "LOOKS_THINK": "думаць %1", - "LOOKS_HMM": "Хм...", - "LOOKS_SHOW": "паказацца", - "LOOKS_HIDE": "схавацца", - "LOOKS_HIDEALLSPRITES": "схаваць усе спрайты", - "LOOKS_EFFECT_COLOR": "колер", - "LOOKS_EFFECT_FISHEYE": "рыбіна вока", - "LOOKS_EFFECT_WHIRL": "вір", - "LOOKS_EFFECT_PIXELATE": "буйныя пікселі", - "LOOKS_EFFECT_MOSAIC": "мазаіка", - "LOOKS_EFFECT_BRIGHTNESS": "яркасць", - "LOOKS_EFFECT_GHOST": "прывід", - "LOOKS_CHANGEEFFECTBY": "змяніць %1 эфект на %2", - "LOOKS_SETEFFECTTO": "устанавіць эфект %1 у значэнне %2", - "LOOKS_CLEARGRAPHICEFFECTS": "прыбраць графічныя эфекты", - "LOOKS_CHANGESIZEBY": "змяніць памер на %1", - "LOOKS_SETSIZETO": "устанавіць памер %1 %", - "LOOKS_SIZE": "памер", - "LOOKS_CHANGESTRETCHBY": "змяніць расцягванне на %1", - "LOOKS_SETSTRETCHTO": "устанавіць расцягванне %1 %", - "LOOKS_SWITCHCOSTUMETO": "змяніць касцюм на %1", - "LOOKS_NEXTCOSTUME": "наступны касцюм", - "LOOKS_SWITCHBACKDROPTO": "змяніць фон на %1", - "LOOKS_GOTOFRONTBACK": "перайсці ў %1 слой", - "LOOKS_GOTOFRONTBACK_FRONT": "пярэдні", - "LOOKS_GOTOFRONTBACK_BACK": "назад", - "LOOKS_GOFORWARDBACKWARDLAYERS": "перайсці %1 на %2 слоя", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "наперад", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "назад", - "LOOKS_BACKDROPNUMBERNAME": "фон %1", - "LOOKS_COSTUMENUMBERNAME": "касцюм %1", - "LOOKS_NUMBERNAME_NUMBER": "нумар", - "LOOKS_NUMBERNAME_NAME": "імя", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "змяніць фон на %1 і чакаць", - "LOOKS_NEXTBACKDROP_BLOCK": "наступны фон", - "LOOKS_NEXTBACKDROP": "наступны фон", - "LOOKS_PREVIOUSBACKDROP": "папярэдні фон", - "LOOKS_RANDOMBACKDROP": "выпадковы фон", - "MOTION_MOVESTEPS": "рухацца %1 крокаў", - "MOTION_TURNLEFT": "павярнуць %1 %2 градусаў", - "MOTION_TURNRIGHT": "павярнуць %1 %2 градусаў", - "MOTION_POINTINDIRECTION": "павярнуць у кірунку %1", - "MOTION_POINTTOWARDS": "павярнуцца да %1", - "MOTION_POINTTOWARDS_POINTER": "указальнік мышы", - "MOTION_POINTTOWARDS_RANDOM": "выпадковы кірунак", - "MOTION_GOTO": "перайсці ў %1", - "MOTION_GOTO_POINTER": "указальнік мышы", - "MOTION_GOTO_RANDOM": "выпадковая пазіцыя", - "MOTION_GOTOXY": "перайсці ў x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "плысці %1 секунд да x: %2 y: %3", - "MOTION_GLIDETO": "плысці %1 секунд да %2", - "MOTION_GLIDETO_POINTER": "указальнік мышы", - "MOTION_GLIDETO_RANDOM": "выпадковая пазіцыя", - "MOTION_CHANGEXBY": "змяніць X на %1", - "MOTION_SETX": "устанавіць X у %1", - "MOTION_CHANGEYBY": "змяніць Y на %1", - "MOTION_SETY": "устанавіць Y у %1", - "MOTION_IFONEDGEBOUNCE": "калі скраю, адштурхнуцца", - "MOTION_SETROTATIONSTYLE": "стыль вярчэння %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "налева-направа", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "не круціць", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "навокал", - "MOTION_XPOSITION": "пазіцыя X", - "MOTION_YPOSITION": "пазіцыя Y", - "MOTION_DIRECTION": "кірунак", - "MOTION_SCROLLRIGHT": "пракруціць направа %1", - "MOTION_SCROLLUP": "пракруціць уверх %1", - "MOTION_ALIGNSCENE": "выраўнаваць сцэну %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ніжні левы", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ніжні правы", - "MOTION_ALIGNSCENE_MIDDLE": "сярэдзіна", - "MOTION_ALIGNSCENE_TOPLEFT": "верхні левы", - "MOTION_ALIGNSCENE_TOPRIGHT": "верхні правы", - "MOTION_XSCROLL": "X пракрутка", - "MOTION_YSCROLL": "Y пракрутка", - "MOTION_STAGE_SELECTED": "Абрана сцэна: няма блокаў руху", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "выдаць выпадковы лік ад %1 да %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 і %2", - "OPERATORS_OR": "%1 ці %2", - "OPERATORS_NOT": "не %1", - "OPERATORS_JOIN": "аб'яднаць %1 %2", - "OPERATORS_JOIN_APPLE": "яблык", - "OPERATORS_JOIN_BANANA": "банан", - "OPERATORS_LETTEROF": "літара %1 у %2", - "OPERATORS_LETTEROF_APPLE": "а", - "OPERATORS_LENGTH": "даўжыня %1", - "OPERATORS_CONTAINS": "%1 змяшчае %2?", - "OPERATORS_MOD": "астача ад дзялення %1 на %2", - "OPERATORS_ROUND": "акругліць %1", - "OPERATORS_MATHOP": "%1 з %2", - "OPERATORS_MATHOP_ABS": "модуль", - "OPERATORS_MATHOP_FLOOR": "меншае цэлае", - "OPERATORS_MATHOP_CEILING": "ліміт", - "OPERATORS_MATHOP_SQRT": "квадратны корань", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "вызначыць %1", - "SENSING_TOUCHINGOBJECT": "кранаецца %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "указальнік мышы", - "SENSING_TOUCHINGOBJECT_EDGE": "мяжа", - "SENSING_TOUCHINGCOLOR": "дакранаецца да колеру %1?", - "SENSING_COLORISTOUCHINGCOLOR": "колер %1 кранаецца %2?", - "SENSING_DISTANCETO": "адлегласць да %1", - "SENSING_DISTANCETO_POINTER": "указальнік мышы", - "SENSING_ASKANDWAIT": "спытаць %1 і чакаць", - "SENSING_ASK_TEXT": "Як цябе клічуць?", - "SENSING_ANSWER": "адказ", - "SENSING_KEYPRESSED": "клавіша %1 націснутая?", - "SENSING_MOUSEDOWN": "мышка націснутая?", - "SENSING_MOUSEX": "мышка па X", - "SENSING_MOUSEY": "мышка па Y", - "SENSING_SETDRAGMODE": "перацягваць %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "можна", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "нельга", - "SENSING_LOUDNESS": "гучнасць", - "SENSING_LOUD": "гучна?", - "SENSING_TIMER": "таймер", - "SENSING_RESETTIMER": "перазапусціць таймер", - "SENSING_OF": "%1 з %2", - "SENSING_OF_XPOSITION": "пазіцыя X", - "SENSING_OF_YPOSITION": "пазіцыя Y", - "SENSING_OF_DIRECTION": "кірунак", - "SENSING_OF_COSTUMENUMBER": "касцюм #", - "SENSING_OF_COSTUMENAME": "імя касцюма", - "SENSING_OF_SIZE": "памер", - "SENSING_OF_VOLUME": "гучнасць", - "SENSING_OF_BACKDROPNUMBER": "фон #", - "SENSING_OF_BACKDROPNAME": "імя фону", - "SENSING_OF_STAGE": "Сцэна", - "SENSING_CURRENT": "бягучы %1", - "SENSING_CURRENT_YEAR": "год", - "SENSING_CURRENT_MONTH": "месяц", - "SENSING_CURRENT_DATE": "дата", - "SENSING_CURRENT_DAYOFWEEK": "дзень тыдня", - "SENSING_CURRENT_HOUR": "гадзіна", - "SENSING_CURRENT_MINUTE": "хвіліна", - "SENSING_CURRENT_SECOND": "секунда", - "SENSING_DAYSSINCE2000": "дзён ад 2000", - "SENSING_USERNAME": "імя карыстальніка", - "SENSING_USERID": "id ўдзельніка", - "SOUND_PLAY": "уключыць гук %1", - "SOUND_PLAYUNTILDONE": "іграць гук %1 да канца", - "SOUND_STOPALLSOUNDS": "спыніць усе гукі", - "SOUND_SETEFFECTO": "устанавіць эфект %1 у значэнне %2", - "SOUND_CHANGEEFFECTBY": "змяніць %1 эфект на %2", - "SOUND_CLEAREFFECTS": "прыбраць гукавыя эфекты", - "SOUND_EFFECTS_PITCH": "вышыня гуку", - "SOUND_EFFECTS_PAN": "рух налева/направа", - "SOUND_CHANGEVOLUMEBY": "змяніць гучнасць на %1", - "SOUND_SETVOLUMETO": "устанавіць гучнасць %1%", - "SOUND_VOLUME": "гучнасць", - "SOUND_RECORD": "запіс...", - "CATEGORY_MOTION": "Рух", - "CATEGORY_LOOKS": "Выгляд", - "CATEGORY_SOUND": "Гук", - "CATEGORY_EVENTS": "Падзеі", - "CATEGORY_CONTROL": "Кіраванне", - "CATEGORY_SENSING": "Сэнсары", - "CATEGORY_OPERATORS": "Аператары", - "CATEGORY_VARIABLES": "Зменныя", - "CATEGORY_MYBLOCKS": "Уласныя блокі", - "DUPLICATE": "Падвоіць", - "DELETE": "Выдаліць", - "ADD_COMMENT": "Дадаць каментарый", - "REMOVE_COMMENT": "Выдаліць каментарый", - "DELETE_BLOCK": "Выдаліць блок", - "DELETE_X_BLOCKS": "Выдаліць %1 блокаў", - "DELETE_ALL_BLOCKS": "Выдаліць усе %1 блокі?", - "CLEAN_UP": "Ачысціць блокі", - "HELP": "Даведка", - "UNDO": "Адмяніць", - "REDO": "Вярнуць", - "EDIT_PROCEDURE": "Змяніць", - "SHOW_PROCEDURE_DEFINITION": "Перайсці да вызначэння", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Скажы што-небудзь..", - "COLOUR_HUE_LABEL": "Колер", - "COLOUR_SATURATION_LABEL": "Насычанасць", - "COLOUR_BRIGHTNESS_LABEL": "Яркасць", - "CHANGE_VALUE_TITLE": "Змяніць значэнне:", - "RENAME_VARIABLE": "Змяніць імя зменнай", - "RENAME_VARIABLE_TITLE": "Змяніць імёны \"%1\" зменных на:", - "RENAME_VARIABLE_MODAL_TITLE": "Змяніць імя зменнай", - "NEW_VARIABLE": "Стварыць зменную", - "NEW_VARIABLE_TITLE": "Новае імя зменнай:", - "VARIABLE_MODAL_TITLE": "Новая зменная", - "VARIABLE_ALREADY_EXISTS": "Зменная з імем \"%1\" ужо існуе.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Зменная з імем \"%1\" ужо існуе для іншай зменнай тыпу \"%2\"", - "DELETE_VARIABLE_CONFIRMATION": "Выдаліць %1 выкарыстанняў \"%2\" зменнай?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Нельга выдаліць зменную \"%1\", бо яна частка функцыі \"%2\"", - "DELETE_VARIABLE": "Выдаліць зменную \"%1\"", - "NEW_PROCEDURE": "Стварыць блок", - "PROCEDURE_ALREADY_EXISTS": "Працэдура з імем \"%1\" ужо існуе.", - "PROCEDURE_DEFAULT_NAME": "назва блока", - "NEW_LIST": "Стварыць спіс", - "NEW_LIST_TITLE": "Новае імя спіса:", - "LIST_MODAL_TITLE": "Новы cпіс", - "LIST_ALREADY_EXISTS": "Спіс з імем \"%1\" ужо існуе.", - "RENAME_LIST_TITLE": "Змяніць імёны \"%1\" спісаў на:", - "RENAME_LIST_MODAL_TITLE": "Змяніць імя cпіса", - "DEFAULT_LIST_ITEM": "рэч", - "DELETE_LIST": "Выдаліць спіс \"%1\"", - "RENAME_LIST": "Змяніць імя спіса", - "NEW_BROADCAST_MESSAGE": "Новае паведамленне", - "NEW_BROADCAST_MESSAGE_TITLE": "Новае імя паведамлення:", - "BROADCAST_MODAL_TITLE": "Новае паведамленне", - "DEFAULT_BROADCAST_MESSAGE_NAME": "паведамленне1" -}; - -Blockly.ScratchMsgs.locales["bg"] = -{ - "CONTROL_FOREVER": "forever", - "CONTROL_REPEAT": "повтори %1", - "CONTROL_IF": "ако %1 тогава", - "CONTROL_ELSE": "иначе", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "всички", - "CONTROL_STOP_THIS": "този скрипт", - "CONTROL_STOP_OTHER": "другите скриптове на спрайта", - "CONTROL_WAIT": "изчакай %1 сек", - "CONTROL_WAITUNTIL": "чакай докато %1", - "CONTROL_REPEATUNTIL": "repeat until %1", - "CONTROL_WHILE": "while %1", - "CONTROL_FOREACH": "for each %1 in %2", - "CONTROL_STARTASCLONE": "when I start as a clone", - "CONTROL_CREATECLONEOF": "create clone of %1", - "CONTROL_CREATECLONEOF_MYSELF": "себе си", - "CONTROL_DELETETHISCLONE": "delete this clone", - "CONTROL_COUNTER": "брояч", - "CONTROL_INCRCOUNTER": "нарастващ брояч", - "CONTROL_CLEARCOUNTER": "clear counter", - "CONTROL_ALLATONCE": "all at once", - "DATA_SETVARIABLETO": "set %1 to %2", - "DATA_CHANGEVARIABLEBY": "change %1 by %2", - "DATA_SHOWVARIABLE": "show variable %1", - "DATA_HIDEVARIABLE": "hide variable %1", - "DATA_ADDTOLIST": "add %1 to %2", - "DATA_DELETEOFLIST": "изтрий %1 от %2", - "DATA_DELETEALLOFLIST": "изтрий всичко от %1", - "DATA_INSERTATLIST": "insert %1 at %2 of %3", - "DATA_REPLACEITEMOFLIST": "replace item %1 of %2 with %3", - "DATA_ITEMOFLIST": "елемент %1 от %2", - "DATA_ITEMNUMOFLIST": "item # of %1 in %2", - "DATA_LENGTHOFLIST": "големина на %1", - "DATA_LISTCONTAINSITEM": "%1 съдържа %2?", - "DATA_SHOWLIST": "покажи списък %1", - "DATA_HIDELIST": "скрий списък %1", - "DATA_INDEX_ALL": "всички", - "DATA_INDEX_LAST": "последен", - "DATA_INDEX_RANDOM": "random", - "EVENT_WHENFLAGCLICKED": "when %1 clicked", - "EVENT_WHENTHISSPRITECLICKED": "when this sprite clicked", - "EVENT_WHENSTAGECLICKED": "when stage clicked", - "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", - "EVENT_WHENBROADCASTRECEIVED": "when I receive %1", - "EVENT_WHENBACKDROPSWITCHESTO": "when backdrop switches to %1", - "EVENT_WHENGREATERTHAN": "когато %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "таймер", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ниво на звука", - "EVENT_BROADCAST": "разпространи %1", - "EVENT_BROADCASTANDWAIT": "разпространи %1 и чакай", - "EVENT_WHENKEYPRESSED": "когато е натиснат клавиш %1", - "EVENT_WHENKEYPRESSED_SPACE": "интервал", - "EVENT_WHENKEYPRESSED_LEFT": "лява стрелка", - "EVENT_WHENKEYPRESSED_RIGHT": "дясна стрелка", - "EVENT_WHENKEYPRESSED_DOWN": "стрелка надолу", - "EVENT_WHENKEYPRESSED_UP": "стрелка нагоре", - "EVENT_WHENKEYPRESSED_ANY": "който и да е", - "LOOKS_SAYFORSECS": "кажи %1 за %2 сек", - "LOOKS_SAY": "кажи %1", - "LOOKS_HELLO": "Здравей!", - "LOOKS_THINKFORSECS": "мисли %1 за %2 сек", - "LOOKS_THINK": "мисли %1", - "LOOKS_HMM": "Хъмм...", - "LOOKS_SHOW": "покажи се", - "LOOKS_HIDE": "скрий се", - "LOOKS_HIDEALLSPRITES": "скрий всички спрайтове", - "LOOKS_EFFECT_COLOR": "цвят", - "LOOKS_EFFECT_FISHEYE": "fisheye", - "LOOKS_EFFECT_WHIRL": "whirl", - "LOOKS_EFFECT_PIXELATE": "pixelate", - "LOOKS_EFFECT_MOSAIC": "мозайка", - "LOOKS_EFFECT_BRIGHTNESS": "яркост", - "LOOKS_EFFECT_GHOST": "ghost", - "LOOKS_CHANGEEFFECTBY": "промени ефект %1 с %2", - "LOOKS_SETEFFECTTO": "направи %1 ефект на %2", - "LOOKS_CLEARGRAPHICEFFECTS": "премахни графичните ефекти", - "LOOKS_CHANGESIZEBY": "промени размера с %1", - "LOOKS_SETSIZETO": "set size to %1 %", - "LOOKS_SIZE": "размер", - "LOOKS_CHANGESTRETCHBY": "change stretch by %1", - "LOOKS_SETSTRETCHTO": "set stretch to %1 %", - "LOOKS_SWITCHCOSTUMETO": "switch costume to %1", - "LOOKS_NEXTCOSTUME": "следващ костюм", - "LOOKS_SWITCHBACKDROPTO": "смени декора с %1", - "LOOKS_GOTOFRONTBACK": "go to %1 layer", - "LOOKS_GOTOFRONTBACK_FRONT": "front", - "LOOKS_GOTOFRONTBACK_BACK": "back", - "LOOKS_GOFORWARDBACKWARDLAYERS": "премини %1 с %2 слой/я", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "forward", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "backward", - "LOOKS_BACKDROPNUMBERNAME": "декор %1", - "LOOKS_COSTUMENUMBERNAME": "костюм %1", - "LOOKS_NUMBERNAME_NUMBER": "number", - "LOOKS_NUMBERNAME_NAME": "name", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "смени декора с %1 и чакай", - "LOOKS_NEXTBACKDROP_BLOCK": "следващ декор", - "LOOKS_NEXTBACKDROP": "следващ декор", - "LOOKS_PREVIOUSBACKDROP": "предишен декор", - "LOOKS_RANDOMBACKDROP": "случаен декор", - "MOTION_MOVESTEPS": "премести се с %1 стъпки", - "MOTION_TURNLEFT": "завърти се с %1 %2 градуса", - "MOTION_TURNRIGHT": "ззавърти се с %1 %2 градуса", - "MOTION_POINTINDIRECTION": "обърни се в посока %1", - "MOTION_POINTTOWARDS": "обърни се към %1", - "MOTION_POINTTOWARDS_POINTER": "показалец на мишката", - "MOTION_POINTTOWARDS_RANDOM": "случайна посока", - "MOTION_GOTO": "отиди до %1", - "MOTION_GOTO_POINTER": "показалец на мишката", - "MOTION_GOTO_RANDOM": "случайна позиция", - "MOTION_GOTOXY": "отиди до x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "пропълзи за %1 сек до x: %2 y: %3", - "MOTION_GLIDETO": "пропълзи за %1 сек до %2", - "MOTION_GLIDETO_POINTER": "показалец на мишката", - "MOTION_GLIDETO_RANDOM": "случайна позиция", - "MOTION_CHANGEXBY": "промени х с %1", - "MOTION_SETX": "направи x равно на %1", - "MOTION_CHANGEYBY": "промени y с %1", - "MOTION_SETY": "направи y равно на %1", - "MOTION_IFONEDGEBOUNCE": "ако докосваш ръба, отблъсни се", - "MOTION_SETROTATIONSTYLE": "избери начин на въртене %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "наляво-надясно", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "без въртене", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "във всички посоки", - "MOTION_XPOSITION": "x позиция", - "MOTION_YPOSITION": "y позиция", - "MOTION_DIRECTION": "посока", - "MOTION_SCROLLRIGHT": "превърти надясно %1", - "MOTION_SCROLLUP": "превърти нагоре %1", - "MOTION_ALIGNSCENE": "подравни %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "долу-ляво", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "долу-дясно", - "MOTION_ALIGNSCENE_MIDDLE": "по средата", - "MOTION_ALIGNSCENE_TOPLEFT": "горе-ляво", - "MOTION_ALIGNSCENE_TOPRIGHT": "горе-дясно", - "MOTION_XSCROLL": "хоризонтално превъртане", - "MOTION_YSCROLL": "вертикално превъртане", - "MOTION_STAGE_SELECTED": "Избрана е сцената: няма блокове за движение", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "избери случайно от %1 до %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 и %2", - "OPERATORS_OR": "%1 или %2", - "OPERATORS_NOT": "не %1", - "OPERATORS_JOIN": "съедини %1 %2", - "OPERATORS_JOIN_APPLE": "ябълка", - "OPERATORS_JOIN_BANANA": "банан", - "OPERATORS_LETTEROF": "буква %1 от %2", - "OPERATORS_LETTEROF_APPLE": "а", - "OPERATORS_LENGTH": "дължина на %1", - "OPERATORS_CONTAINS": "%1 съдържа %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "закръгли %1", - "OPERATORS_MATHOP": "%1 от %2", - "OPERATORS_MATHOP_ABS": "абсолютна стойност", - "OPERATORS_MATHOP_FLOOR": "floor", - "OPERATORS_MATHOP_CEILING": "ceiling", - "OPERATORS_MATHOP_SQRT": "квадратен корен", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "дефинирай %1", - "SENSING_TOUCHINGOBJECT": "допира ли %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "показалец на мишката", - "SENSING_TOUCHINGOBJECT_EDGE": "ръб", - "SENSING_TOUCHINGCOLOR": "допира ли цвят %1?", - "SENSING_COLORISTOUCHINGCOLOR": "цвят %1 допира ли %2?", - "SENSING_DISTANCETO": "разстояние до %1", - "SENSING_DISTANCETO_POINTER": "показалец на мишката", - "SENSING_ASKANDWAIT": "питай %1 и чакай", - "SENSING_ASK_TEXT": "Какво е твоето име?", - "SENSING_ANSWER": "отговор", - "SENSING_KEYPRESSED": "клавиш %1 натиснат?", - "SENSING_MOUSEDOWN": "mouse down?", - "SENSING_MOUSEX": "мишка x", - "SENSING_MOUSEY": "мишка y", - "SENSING_SETDRAGMODE": "режим на теглене %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "теглене разрешено", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "теглене забранено", - "SENSING_LOUDNESS": "сила на звука", - "SENSING_LOUD": "шумно ли е?", - "SENSING_TIMER": "таймер", - "SENSING_RESETTIMER": "нулирай таймера", - "SENSING_OF": "%1 от %2", - "SENSING_OF_XPOSITION": "x позиция", - "SENSING_OF_YPOSITION": "y позиция", - "SENSING_OF_DIRECTION": "посока", - "SENSING_OF_COSTUMENUMBER": "костюм #", - "SENSING_OF_COSTUMENAME": "име на костюм", - "SENSING_OF_SIZE": "размер", - "SENSING_OF_VOLUME": "сила на звука", - "SENSING_OF_BACKDROPNUMBER": "декор #", - "SENSING_OF_BACKDROPNAME": "име на декор", - "SENSING_OF_STAGE": "Сцена", - "SENSING_CURRENT": "текущ/а %1", - "SENSING_CURRENT_YEAR": "година", - "SENSING_CURRENT_MONTH": "месец", - "SENSING_CURRENT_DATE": "дата", - "SENSING_CURRENT_DAYOFWEEK": "ден от седмицата", - "SENSING_CURRENT_HOUR": "час", - "SENSING_CURRENT_MINUTE": "минута", - "SENSING_CURRENT_SECOND": "секунда", - "SENSING_DAYSSINCE2000": "дни след 2000 година", - "SENSING_USERNAME": "потребителско име", - "SENSING_USERID": "user id", - "SOUND_PLAY": "пусни звук %1", - "SOUND_PLAYUNTILDONE": "пусни звук %1 докато свърши", - "SOUND_STOPALLSOUNDS": "stop all sounds", - "SOUND_SETEFFECTO": "set %1 effect to %2", - "SOUND_CHANGEEFFECTBY": "change %1 effect by %2", - "SOUND_CLEAREFFECTS": "clear sound effects", - "SOUND_EFFECTS_PITCH": "промяна на тона", - "SOUND_EFFECTS_PAN": "ляво/дясно", - "SOUND_CHANGEVOLUMEBY": "промени силата на звука с %1", - "SOUND_SETVOLUMETO": "set volume to %1%", - "SOUND_VOLUME": "сила на звука", - "SOUND_RECORD": "запис...", - "CATEGORY_MOTION": "Движение", - "CATEGORY_LOOKS": "Външност", - "CATEGORY_SOUND": "Звук", - "CATEGORY_EVENTS": "Събития", - "CATEGORY_CONTROL": "Контрол", - "CATEGORY_SENSING": "Сетива", - "CATEGORY_OPERATORS": "Оператори", - "CATEGORY_VARIABLES": "Променливи", - "CATEGORY_MYBLOCKS": "Моите Блокове", - "DUPLICATE": "Дублиране", - "DELETE": "Изтриване", - "ADD_COMMENT": "Добави Коментар", - "REMOVE_COMMENT": "Премахни Коментар", - "DELETE_BLOCK": "Изтрий Блок", - "DELETE_X_BLOCKS": "Изтрий %1 блока", - "DELETE_ALL_BLOCKS": "Изтрий всички %1 блокове", - "CLEAN_UP": "Изтрий блоковете", - "HELP": "Помощ", - "UNDO": "Отмяна", - "REDO": "Повтаряне", - "EDIT_PROCEDURE": "Редактиране", - "SHOW_PROCEDURE_DEFINITION": "Покажи дефиницията", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Кажи нещо...", - "COLOUR_HUE_LABEL": "Цвят", - "COLOUR_SATURATION_LABEL": "Наситеност", - "COLOUR_BRIGHTNESS_LABEL": "Яркост", - "CHANGE_VALUE_TITLE": "Промени стойността:", - "RENAME_VARIABLE": "Преименувай променлива", - "RENAME_VARIABLE_TITLE": "Преименувай всички \"%1\" променливи на:", - "RENAME_VARIABLE_MODAL_TITLE": "Преименувай Променлива", - "NEW_VARIABLE": "Създаване на Променлива", - "NEW_VARIABLE_TITLE": "Име на новата променлива:", - "VARIABLE_MODAL_TITLE": "Нова променлива", - "VARIABLE_ALREADY_EXISTS": "Променлива \"%1\" вече съществува.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Променлива \"%1\" вече съществува за друга променлива от тип \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Не може да се изтрие променливата \"%1\", защото участва в дефиницията на функцията \"%2\".", - "DELETE_VARIABLE": "Изтрий променливата \"%1\"", - "NEW_PROCEDURE": "Създаване на блок", - "PROCEDURE_ALREADY_EXISTS": "Процедура \"%1\" вече съществува.", - "PROCEDURE_DEFAULT_NAME": "име на блок", - "NEW_LIST": "Създаване на списък", - "NEW_LIST_TITLE": "Име на новия списък:", - "LIST_MODAL_TITLE": "Нов списък", - "LIST_ALREADY_EXISTS": "Списък \"%1\" вече съществува.", - "RENAME_LIST_TITLE": "Преименувай всички \"%1\" списъци на:", - "RENAME_LIST_MODAL_TITLE": "Преименувай списък", - "DEFAULT_LIST_ITEM": "thing", - "DELETE_LIST": "Изтрий списъкът \"%1\"", - "RENAME_LIST": "Преименувай списък", - "NEW_BROADCAST_MESSAGE": "Ново съобщение", - "NEW_BROADCAST_MESSAGE_TITLE": "Име на новото съобщение:", - "BROADCAST_MODAL_TITLE": "Ново съобщение", - "DEFAULT_BROADCAST_MESSAGE_NAME": "съобщение1" -}; - -Blockly.ScratchMsgs.locales["ca"] = -{ - "CONTROL_FOREVER": "per sempre", - "CONTROL_REPEAT": "repeteix %1", - "CONTROL_IF": "si %1 llavors", - "CONTROL_ELSE": "si no", - "CONTROL_STOP": "atura", - "CONTROL_STOP_ALL": "tot", - "CONTROL_STOP_THIS": "aquest programa", - "CONTROL_STOP_OTHER": "altres programes del personatge", - "CONTROL_WAIT": "espera %1 segons", - "CONTROL_WAITUNTIL": "espera fins %1", - "CONTROL_REPEATUNTIL": "repeteix fins %1", - "CONTROL_WHILE": "mentre %1", - "CONTROL_FOREACH": "per cada %1 a %2", - "CONTROL_STARTASCLONE": "quan una còpia meva comenci", - "CONTROL_CREATECLONEOF": "crea una còpia de %1", - "CONTROL_CREATECLONEOF_MYSELF": "jo mateix", - "CONTROL_DELETETHISCLONE": "esborra aquesta còpia", - "CONTROL_COUNTER": "comptador", - "CONTROL_INCRCOUNTER": "augmenta comptador", - "CONTROL_CLEARCOUNTER": "posa a zero el comptador", - "CONTROL_ALLATONCE": "tot d'una vegada", - "DATA_SETVARIABLETO": "assigna a %1 el valor %2", - "DATA_CHANGEVARIABLEBY": "augmenta %1 en %2", - "DATA_SHOWVARIABLE": "mostra la variable %1", - "DATA_HIDEVARIABLE": "amaga la variable %1", - "DATA_ADDTOLIST": "afegeix %1 a %2", - "DATA_DELETEOFLIST": "esborra l'element %1 de %2", - "DATA_DELETEALLOFLIST": "esborra-ho tot de %1", - "DATA_INSERTATLIST": "afegeix %1 a la posició %2 de %3", - "DATA_REPLACEITEMOFLIST": "canvia l'element %1 de %2 per %3", - "DATA_ITEMOFLIST": "element %1 de %2", - "DATA_ITEMNUMOFLIST": "element # de %1 en %2", - "DATA_LENGTHOFLIST": "llargada de %1", - "DATA_LISTCONTAINSITEM": "%1 conté %2?", - "DATA_SHOWLIST": "mostra la llista %1", - "DATA_HIDELIST": "amaga la llista %1", - "DATA_INDEX_ALL": "tot", - "DATA_INDEX_LAST": "darrer", - "DATA_INDEX_RANDOM": "aleatori", - "EVENT_WHENFLAGCLICKED": "quan la %1 es cliqui", - "EVENT_WHENTHISSPRITECLICKED": "quan es cliqui aquest personatge", - "EVENT_WHENSTAGECLICKED": "quan es cliqui l'escenari", - "EVENT_WHENTOUCHINGOBJECT": "quan aquest objecte toqui %1", - "EVENT_WHENBROADCASTRECEIVED": "quan rebi %1", - "EVENT_WHENBACKDROPSWITCHESTO": "quan l'escenari canviï al fons %1", - "EVENT_WHENGREATERTHAN": "quan %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronòmetre", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volum del so", - "EVENT_BROADCAST": "envia a tots %1", - "EVENT_BROADCASTANDWAIT": "envia a tots %1 i espera", - "EVENT_WHENKEYPRESSED": "quan la tecla %1 es premi", - "EVENT_WHENKEYPRESSED_SPACE": "espai", - "EVENT_WHENKEYPRESSED_LEFT": "fletxa esquerra", - "EVENT_WHENKEYPRESSED_RIGHT": "fletxa dreta", - "EVENT_WHENKEYPRESSED_DOWN": "fletxa avall", - "EVENT_WHENKEYPRESSED_UP": "fletxa amunt", - "EVENT_WHENKEYPRESSED_ANY": "qualsevol", - "LOOKS_SAYFORSECS": "digues %1 durant %2 segons", - "LOOKS_SAY": "digues %1", - "LOOKS_HELLO": "Hola!", - "LOOKS_THINKFORSECS": "pensa %1 durant %2 segons", - "LOOKS_THINK": "pensa %1", - "LOOKS_HMM": "Mmm...", - "LOOKS_SHOW": "mostra't", - "LOOKS_HIDE": "amaga't", - "LOOKS_HIDEALLSPRITES": "amaga tots els personatges", - "LOOKS_EFFECT_COLOR": "color", - "LOOKS_EFFECT_FISHEYE": "ull de peix", - "LOOKS_EFFECT_WHIRL": "remolí", - "LOOKS_EFFECT_PIXELATE": "pixelar", - "LOOKS_EFFECT_MOSAIC": "mosaic", - "LOOKS_EFFECT_BRIGHTNESS": "brillantor", - "LOOKS_EFFECT_GHOST": "transparència", - "LOOKS_CHANGEEFFECTBY": "augmenta l'efecte %1 en %2", - "LOOKS_SETEFFECTTO": "fixa l'efecte %1 a %2", - "LOOKS_CLEARGRAPHICEFFECTS": "treu els efectes gràfics", - "LOOKS_CHANGESIZEBY": "augmenta %1 la mida", - "LOOKS_SETSIZETO": "fixa la mida a %1 %", - "LOOKS_SIZE": "mida", - "LOOKS_CHANGESTRETCHBY": "augmenta %1 l'estirament", - "LOOKS_SETSTRETCHTO": "fixa l'estirament a %1 %", - "LOOKS_SWITCHCOSTUMETO": "canvia el vestit a %1", - "LOOKS_NEXTCOSTUME": "següent vestit", - "LOOKS_SWITCHBACKDROPTO": "canvia el fons a %1", - "LOOKS_GOTOFRONTBACK": "vés a la capa %1", - "LOOKS_GOTOFRONTBACK_FRONT": "front", - "LOOKS_GOTOFRONTBACK_BACK": "darrere", - "LOOKS_GOFORWARDBACKWARDLAYERS": "vés %1 %2 capes", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "endavant", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "enrere", - "LOOKS_BACKDROPNUMBERNAME": "fons %1", - "LOOKS_COSTUMENUMBERNAME": "vestit %1", - "LOOKS_NUMBERNAME_NUMBER": "número", - "LOOKS_NUMBERNAME_NAME": "nom", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "canvia el fons a %1 i espera", - "LOOKS_NEXTBACKDROP_BLOCK": "següent fons de pantalla", - "LOOKS_NEXTBACKDROP": "següent fons de pantalla", - "LOOKS_PREVIOUSBACKDROP": "fons anterior", - "LOOKS_RANDOMBACKDROP": "fons a l'atzar", - "MOTION_MOVESTEPS": "mou-te %1 passos", - "MOTION_TURNLEFT": "gira %1 %2 graus", - "MOTION_TURNRIGHT": "gira %1 %2 graus", - "MOTION_POINTINDIRECTION": "apunta en direcció %1", - "MOTION_POINTTOWARDS": "apunta cap a %1", - "MOTION_POINTTOWARDS_POINTER": "punter del ratolí", - "MOTION_POINTTOWARDS_RANDOM": "direcció aleatòria", - "MOTION_GOTO": "vés a %1", - "MOTION_GOTO_POINTER": "punter del ratolí", - "MOTION_GOTO_RANDOM": "posició aleatòria", - "MOTION_GOTOXY": "vés a x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "llisca en %1 segons fins a x: %2 y: %3", - "MOTION_GLIDETO": "llisca en %1 segons fins a %2", - "MOTION_GLIDETO_POINTER": "punter del ratolí", - "MOTION_GLIDETO_RANDOM": "posició aleatòria", - "MOTION_CHANGEXBY": "suma %1 a x", - "MOTION_SETX": "assigna el valor %1 a x", - "MOTION_CHANGEYBY": "suma %1 a y", - "MOTION_SETY": "assigna el valor %1 a y", - "MOTION_IFONEDGEBOUNCE": "rebota en tocar una vora", - "MOTION_SETROTATIONSTYLE": "fixa el tipus de rotació %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "esquerra-dreta", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "no giris", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "al voltant", - "MOTION_XPOSITION": "posició x", - "MOTION_YPOSITION": "posició y", - "MOTION_DIRECTION": "direcció", - "MOTION_SCROLLRIGHT": "desplaça a la dreta %1", - "MOTION_SCROLLUP": "desplaça amunt %1", - "MOTION_ALIGNSCENE": "alinea escena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "Baix a l'esquerra", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "Baix a la dreta", - "MOTION_ALIGNSCENE_MIDDLE": "mig", - "MOTION_ALIGNSCENE_TOPLEFT": "a dalt a l'esquerra", - "MOTION_ALIGNSCENE_TOPRIGHT": "a dalt a la dreta", - "MOTION_XSCROLL": "desplaçament x", - "MOTION_YSCROLL": "desplaçament y", - "MOTION_STAGE_SELECTED": "Escenari seleccionat: sense blocs de moviment", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "nombre a l'atzar entre %1 i %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 i %2", - "OPERATORS_OR": "%1 o %2", - "OPERATORS_NOT": "no %1", - "OPERATORS_JOIN": "uneix %1 i %2", - "OPERATORS_JOIN_APPLE": "poma", - "OPERATORS_JOIN_BANANA": "plàtan", - "OPERATORS_LETTEROF": "lletra %1 de %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "llargada de %1", - "OPERATORS_CONTAINS": "%1 conté %2?", - "OPERATORS_MOD": "residu de dividir %1 entre %2", - "OPERATORS_ROUND": "arrodoneix %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "part sencera", - "OPERATORS_MATHOP_CEILING": "sostre", - "OPERATORS_MATHOP_SQRT": "arrel quadrada", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "defineix %1", - "SENSING_TOUCHINGOBJECT": "tocant %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "punter del ratolí", - "SENSING_TOUCHINGOBJECT_EDGE": "vora", - "SENSING_TOUCHINGCOLOR": "tocant el color %1?", - "SENSING_COLORISTOUCHINGCOLOR": "color %1 sobre %2?", - "SENSING_DISTANCETO": "distància a %1", - "SENSING_DISTANCETO_POINTER": "punter del ratolí", - "SENSING_ASKANDWAIT": "pregunta %1 i espera", - "SENSING_ASK_TEXT": "Com et dius?", - "SENSING_ANSWER": "resposta", - "SENSING_KEYPRESSED": "tecla %1 premuda?", - "SENSING_MOUSEDOWN": "ratolí clicat?", - "SENSING_MOUSEX": "ratolí x", - "SENSING_MOUSEY": "ratolí y", - "SENSING_SETDRAGMODE": "fixa el mode d'arrossegament %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrossegable", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "no arrossegable", - "SENSING_LOUDNESS": "volum del so", - "SENSING_LOUD": "so fort?", - "SENSING_TIMER": "cronòmetre", - "SENSING_RESETTIMER": "reinicia el cronòmetre", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "posició x", - "SENSING_OF_YPOSITION": "posició y", - "SENSING_OF_DIRECTION": "direcció", - "SENSING_OF_COSTUMENUMBER": "vestit nr", - "SENSING_OF_COSTUMENAME": "nom del vestit", - "SENSING_OF_SIZE": "mida", - "SENSING_OF_VOLUME": "volum", - "SENSING_OF_BACKDROPNUMBER": "fons nr", - "SENSING_OF_BACKDROPNAME": "nom del fons", - "SENSING_OF_STAGE": "Escenari", - "SENSING_CURRENT": "actual %1", - "SENSING_CURRENT_YEAR": "any", - "SENSING_CURRENT_MONTH": "mes", - "SENSING_CURRENT_DATE": "data", - "SENSING_CURRENT_DAYOFWEEK": "dia de la setmana", - "SENSING_CURRENT_HOUR": "hora", - "SENSING_CURRENT_MINUTE": "minut", - "SENSING_CURRENT_SECOND": "segon", - "SENSING_DAYSSINCE2000": "dies des del 2000", - "SENSING_USERNAME": "nom d'usuari", - "SENSING_USERID": "ID d'usuari", - "SOUND_PLAY": "inicia el so %1", - "SOUND_PLAYUNTILDONE": "toca el so %1 fins que acabi", - "SOUND_STOPALLSOUNDS": "atura tots els sons", - "SOUND_SETEFFECTO": "fixa l'efecte %1 a %2", - "SOUND_CHANGEEFFECTBY": "augmenta l'efecte %1 en %2", - "SOUND_CLEAREFFECTS": "treu els efectes sonors", - "SOUND_EFFECTS_PITCH": "pitch", - "SOUND_EFFECTS_PAN": "pan esquerra/dreta", - "SOUND_CHANGEVOLUMEBY": "puja %1 el volum", - "SOUND_SETVOLUMETO": "fixa el volum a %1%", - "SOUND_VOLUME": "volum", - "SOUND_RECORD": "enregistra...", - "CATEGORY_MOTION": "Moviment", - "CATEGORY_LOOKS": "Aspecte", - "CATEGORY_SOUND": "So", - "CATEGORY_EVENTS": "Esdeveniments", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Sensors", - "CATEGORY_OPERATORS": "Operadors", - "CATEGORY_VARIABLES": "Variables", - "CATEGORY_MYBLOCKS": "Els meus blocs", - "DUPLICATE": "Duplica", - "DELETE": "Elimina", - "ADD_COMMENT": "Afegeix un comentari", - "REMOVE_COMMENT": "Elimina el comentari", - "DELETE_BLOCK": "Esborra el bloc", - "DELETE_X_BLOCKS": "Esborra %1 blocs", - "DELETE_ALL_BLOCKS": "Eliminar tots els blocs %1 ?", - "CLEAN_UP": "Neteja els blocs", - "HELP": "Ajuda", - "UNDO": "Desfés", - "REDO": "Torna-hi", - "EDIT_PROCEDURE": "Edita", - "SHOW_PROCEDURE_DEFINITION": "Vés a la definició", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Digues alguna cosa...", - "COLOUR_HUE_LABEL": "Color", - "COLOUR_SATURATION_LABEL": "Saturació", - "COLOUR_BRIGHTNESS_LABEL": "brillantor", - "CHANGE_VALUE_TITLE": "Canvia el valor:", - "RENAME_VARIABLE": "Canvia el nom de la variable", - "RENAME_VARIABLE_TITLE": "Canvia totes les variables \"%1\" a:", - "RENAME_VARIABLE_MODAL_TITLE": "Canvia el nom de la variable", - "NEW_VARIABLE": "Crea una variable", - "NEW_VARIABLE_TITLE": "Nou nom per a la variable:", - "VARIABLE_MODAL_TITLE": "Nova Variable", - "VARIABLE_ALREADY_EXISTS": "Ja existeix una variable amb el nom \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Ja existeix una variable anomenada \"%1\" per una altra variable de tipus \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Eliminar els %1 usos de la variable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "No es pot eliminar la variable \"%1\" perquè forma part de la definició de la funció \"%2\"", - "DELETE_VARIABLE": "Elimina la variable \"%1\"", - "NEW_PROCEDURE": "Crea un bloc", - "PROCEDURE_ALREADY_EXISTS": "Ja existeix un procediment anomenat \"%1\".", - "PROCEDURE_DEFAULT_NAME": "nom del bloc", - "NEW_LIST": "Crea una llista", - "NEW_LIST_TITLE": "Nou nom per a la llista:", - "LIST_MODAL_TITLE": "Nova Llista", - "LIST_ALREADY_EXISTS": "Ja existeix una llista anomenada \"%1\".", - "RENAME_LIST_TITLE": "Canvia totes les llistes a \"%1\":", - "RENAME_LIST_MODAL_TITLE": "Canvia el nom de la llista", - "DEFAULT_LIST_ITEM": "cosa", - "DELETE_LIST": "Elimina la llista \"%1\"", - "RENAME_LIST": "Canvia el nom de la llista", - "NEW_BROADCAST_MESSAGE": "Nou missatge", - "NEW_BROADCAST_MESSAGE_TITLE": "Nou nom per al missatge:", - "BROADCAST_MODAL_TITLE": "Missatge nou", - "DEFAULT_BROADCAST_MESSAGE_NAME": "missatge1" -}; - -Blockly.ScratchMsgs.locales["cs"] = -{ - "CONTROL_FOREVER": "opakuj stále", - "CONTROL_REPEAT": "opakuj %1 krát", - "CONTROL_IF": "když %1 tak", - "CONTROL_ELSE": "jinak", - "CONTROL_STOP": "zastav", - "CONTROL_STOP_ALL": "všechno", - "CONTROL_STOP_THIS": "tento scénář", - "CONTROL_STOP_OTHER": "jiné scénáře postavy", - "CONTROL_WAIT": "čekej %1 sekund", - "CONTROL_WAITUNTIL": "čekej dokud nenastane %1", - "CONTROL_REPEATUNTIL": "opakuj dokud nenastane %1", - "CONTROL_WHILE": "opakuj dokud platí %1", - "CONTROL_FOREACH": "pro každé %1 z %2", - "CONTROL_STARTASCLONE": "když startuje můj klon", - "CONTROL_CREATECLONEOF": "klonuj %1", - "CONTROL_CREATECLONEOF_MYSELF": "sebe", - "CONTROL_DELETETHISCLONE": "zruš tento klon", - "CONTROL_COUNTER": "čítač", - "CONTROL_INCRCOUNTER": "zvyš čítač", - "CONTROL_CLEARCOUNTER": "vynuluj čítač", - "CONTROL_ALLATONCE": "vše najednou", - "DATA_SETVARIABLETO": "nastav %1 na %2", - "DATA_CHANGEVARIABLEBY": "změň %1 o %2", - "DATA_SHOWVARIABLE": "ukaž proměnnou %1", - "DATA_HIDEVARIABLE": "skryj proměnnou %1", - "DATA_ADDTOLIST": "přidej %1 k %2", - "DATA_DELETEOFLIST": "smaž %1 z %2", - "DATA_DELETEALLOFLIST": "smaž všechno z %1", - "DATA_INSERTATLIST": "vlož %1 na %2 v %3", - "DATA_REPLACEITEMOFLIST": "nahraď %1 v %2 hodnotou %3", - "DATA_ITEMOFLIST": "prvek %1 z %2", - "DATA_ITEMNUMOFLIST": "pořadí %1 ve %2", - "DATA_LENGTHOFLIST": "délka %1", - "DATA_LISTCONTAINSITEM": "%1 obsahuje %2", - "DATA_SHOWLIST": "ukaž seznam %1", - "DATA_HIDELIST": "skryj seznam %1", - "DATA_INDEX_ALL": "všechno", - "DATA_INDEX_LAST": "poslední", - "DATA_INDEX_RANDOM": "náhodně", - "EVENT_WHENFLAGCLICKED": "po kliknutí na %1", - "EVENT_WHENTHISSPRITECLICKED": "po kliknutí na mě", - "EVENT_WHENSTAGECLICKED": "po kliknutí na scénu", - "EVENT_WHENTOUCHINGOBJECT": "po doteku %1", - "EVENT_WHENBROADCASTRECEIVED": "po obdržení zprávy %1", - "EVENT_WHENBACKDROPSWITCHESTO": "po změně pozadí na %1", - "EVENT_WHENGREATERTHAN": "když %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "stopky", - "EVENT_WHENGREATERTHAN_LOUDNESS": "hlasitost", - "EVENT_BROADCAST": "vyšli zprávu %1", - "EVENT_BROADCASTANDWAIT": "vyšli zprávu %1 a čekej", - "EVENT_WHENKEYPRESSED": "po stisku klávesy %1", - "EVENT_WHENKEYPRESSED_SPACE": "mezerník", - "EVENT_WHENKEYPRESSED_LEFT": "šipka vlevo", - "EVENT_WHENKEYPRESSED_RIGHT": "šipka vpravo", - "EVENT_WHENKEYPRESSED_DOWN": "šipka dolů", - "EVENT_WHENKEYPRESSED_UP": "šipka nahoru", - "EVENT_WHENKEYPRESSED_ANY": "libovolná", - "LOOKS_SAYFORSECS": "bublina %1 %2 sekund", - "LOOKS_SAY": "bublina %1", - "LOOKS_HELLO": "Ahoj!", - "LOOKS_THINKFORSECS": "myšlenka %1 %2 sekund", - "LOOKS_THINK": "myšlenka %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "ukaž se", - "LOOKS_HIDE": "skryj se", - "LOOKS_HIDEALLSPRITES": "skryj všechny postavy", - "LOOKS_EFFECT_COLOR": "barva", - "LOOKS_EFFECT_FISHEYE": "rybí oko", - "LOOKS_EFFECT_WHIRL": "víření", - "LOOKS_EFFECT_PIXELATE": "kostičkování", - "LOOKS_EFFECT_MOSAIC": "mozaika", - "LOOKS_EFFECT_BRIGHTNESS": "jas", - "LOOKS_EFFECT_GHOST": "průhlednost", - "LOOKS_CHANGEEFFECTBY": "změň efekt %1 o %2", - "LOOKS_SETEFFECTTO": "nastav efekt %1 na %2", - "LOOKS_CLEARGRAPHICEFFECTS": "zruš grafické efekty", - "LOOKS_CHANGESIZEBY": "změň velikost o %1", - "LOOKS_SETSIZETO": "nastav velikost na %1 %", - "LOOKS_SIZE": "velikost", - "LOOKS_CHANGESTRETCHBY": "změň roztažení o %1", - "LOOKS_SETSTRETCHTO": "nastav roztažení na %1 %", - "LOOKS_SWITCHCOSTUMETO": "změň kostým na %1", - "LOOKS_NEXTCOSTUME": "další kostým", - "LOOKS_SWITCHBACKDROPTO": "přepni pozadí na %1", - "LOOKS_GOTOFRONTBACK": "přejdi na vrstvu %1", - "LOOKS_GOTOFRONTBACK_FRONT": "popředí", - "LOOKS_GOTOFRONTBACK_BACK": "pozadí", - "LOOKS_GOFORWARDBACKWARDLAYERS": "jdi %1 o %2", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "dopředu", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "dozadu", - "LOOKS_BACKDROPNUMBERNAME": "pozadí %1", - "LOOKS_COSTUMENUMBERNAME": "kostým %1", - "LOOKS_NUMBERNAME_NUMBER": "číslo", - "LOOKS_NUMBERNAME_NAME": "název", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "změň pozadí na %1", - "LOOKS_NEXTBACKDROP_BLOCK": "další pozadí", - "LOOKS_NEXTBACKDROP": "další pozadí", - "LOOKS_PREVIOUSBACKDROP": "předchozí pozadí", - "LOOKS_RANDOMBACKDROP": "náhodné pozadí", - "MOTION_MOVESTEPS": "dopředu o %1 kroků", - "MOTION_TURNLEFT": "otoč se %1 o %2 stupňů", - "MOTION_TURNRIGHT": "otoč se %1 o %2 stupňů", - "MOTION_POINTINDIRECTION": "nastav směr %1", - "MOTION_POINTTOWARDS": "nastav směr k %1", - "MOTION_POINTTOWARDS_POINTER": "ukazateli myši", - "MOTION_POINTTOWARDS_RANDOM": "náhodný směr", - "MOTION_GOTO": "skoč na %1", - "MOTION_GOTO_POINTER": "ukazatel myši", - "MOTION_GOTO_RANDOM": "náhodná pozice", - "MOTION_GOTOXY": "skoč na x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "klouzej %1 sekund na x: %2 y: %3", - "MOTION_GLIDETO": "klouzej %1 sekund na %2", - "MOTION_GLIDETO_POINTER": "ukazatel myši", - "MOTION_GLIDETO_RANDOM": "náhodná pozice", - "MOTION_CHANGEXBY": "změň x o %1", - "MOTION_SETX": "nastav x na %1", - "MOTION_CHANGEYBY": "změň y o %1", - "MOTION_SETY": "nastav y na %1", - "MOTION_IFONEDGEBOUNCE": "když narazíš na okraj, odraz se", - "MOTION_SETROTATIONSTYLE": "nastav otáčení %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vlevo-vpravo", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "neotáčet", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "dokola", - "MOTION_XPOSITION": "x", - "MOTION_YPOSITION": "y", - "MOTION_DIRECTION": "směr", - "MOTION_SCROLLRIGHT": "posuň se doprava %1", - "MOTION_SCROLLUP": "posuň se nahoru %1", - "MOTION_ALIGNSCENE": "zarovnej scénu %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "vlevo dole", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "vpravo dole", - "MOTION_ALIGNSCENE_MIDDLE": "prostřední", - "MOTION_ALIGNSCENE_TOPLEFT": "vlevo nahoře", - "MOTION_ALIGNSCENE_TOPRIGHT": "vpravo nahoře", - "MOTION_XSCROLL": "x přesouvání", - "MOTION_YSCROLL": "y přesouvání", - "MOTION_STAGE_SELECTED": "Scéna je zvolena: nemá bloky pohybu", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "náhodné číslo od %1 do %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 a %2", - "OPERATORS_OR": "%1 nebo %2", - "OPERATORS_NOT": "ne %1", - "OPERATORS_JOIN": "spoj %1 %2", - "OPERATORS_JOIN_APPLE": "jablko", - "OPERATORS_JOIN_BANANA": "banán", - "OPERATORS_LETTEROF": "písmeno %1 z %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "délka %1", - "OPERATORS_CONTAINS": "%1 obsahuje %2?", - "OPERATORS_MOD": "zbytek %1 děleno %2", - "OPERATORS_ROUND": "zaokrouhli %1", - "OPERATORS_MATHOP": "%1 %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "zaokr. dolů", - "OPERATORS_MATHOP_CEILING": "zaokr. nahoru", - "OPERATORS_MATHOP_SQRT": "odmocnina", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctg", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "scénář pro %1", - "SENSING_TOUCHINGOBJECT": "dotýkáš se %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "ukazatele myši", - "SENSING_TOUCHINGOBJECT_EDGE": "okraje", - "SENSING_TOUCHINGCOLOR": "dotýkáš se barvy %1?", - "SENSING_COLORISTOUCHINGCOLOR": "barvou %1 se dotýkáš %2?", - "SENSING_DISTANCETO": "vzdálenost k %1", - "SENSING_DISTANCETO_POINTER": "ukazateli myši", - "SENSING_ASKANDWAIT": "otázka %1", - "SENSING_ASK_TEXT": "Jak se jmenuješ?", - "SENSING_ANSWER": "odpověď", - "SENSING_KEYPRESSED": "klávesa %1 stisknuta?", - "SENSING_MOUSEDOWN": "myš stisknuta?", - "SENSING_MOUSEX": "x myši", - "SENSING_MOUSEY": "y myši", - "SENSING_SETDRAGMODE": "povoleno přesouvat %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ano", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ne", - "SENSING_LOUDNESS": "hlasitost", - "SENSING_LOUD": "hlasité?", - "SENSING_TIMER": "stopky", - "SENSING_RESETTIMER": "vynuluj stopky", - "SENSING_OF": "%1 z %2", - "SENSING_OF_XPOSITION": "x", - "SENSING_OF_YPOSITION": "y", - "SENSING_OF_DIRECTION": "směr", - "SENSING_OF_COSTUMENUMBER": "číslo kostýmu", - "SENSING_OF_COSTUMENAME": "název kostýmu", - "SENSING_OF_SIZE": "velikost", - "SENSING_OF_VOLUME": "hlasitost", - "SENSING_OF_BACKDROPNUMBER": "číslo pozadí", - "SENSING_OF_BACKDROPNAME": "název pozadí", - "SENSING_OF_STAGE": "Scéna", - "SENSING_CURRENT": "aktuální %1", - "SENSING_CURRENT_YEAR": "rok", - "SENSING_CURRENT_MONTH": "měsíc", - "SENSING_CURRENT_DATE": "den v měsíci", - "SENSING_CURRENT_DAYOFWEEK": "den týdne", - "SENSING_CURRENT_HOUR": "hodina", - "SENSING_CURRENT_MINUTE": "minuta", - "SENSING_CURRENT_SECOND": "sekunda", - "SENSING_DAYSSINCE2000": "dnů od r. 2000", - "SENSING_USERNAME": "jméno uživatele", - "SENSING_USERID": "ID uživatele", - "SOUND_PLAY": "začni hrát zvuk %1", - "SOUND_PLAYUNTILDONE": "přehraj zvuk %1 až do konce", - "SOUND_STOPALLSOUNDS": "zastav všechny zvuky", - "SOUND_SETEFFECTO": "nastav efekt %1 na %2", - "SOUND_CHANGEEFFECTBY": "změň efekt %1 o %2", - "SOUND_CLEAREFFECTS": "zruš zvukové efekty", - "SOUND_EFFECTS_PITCH": "poloha", - "SOUND_EFFECTS_PAN": "stereo vlevo/vpravo", - "SOUND_CHANGEVOLUMEBY": "změň hlasitost o %1", - "SOUND_SETVOLUMETO": "nastav hlasitost na %1%", - "SOUND_VOLUME": "hlasitost", - "SOUND_RECORD": "záznam ...", - "CATEGORY_MOTION": "Pohyb", - "CATEGORY_LOOKS": "Vzhled", - "CATEGORY_SOUND": "Zvuk", - "CATEGORY_EVENTS": "Události", - "CATEGORY_CONTROL": "Ovládání", - "CATEGORY_SENSING": "Vnímání", - "CATEGORY_OPERATORS": "Operátory", - "CATEGORY_VARIABLES": "Proměnné", - "CATEGORY_MYBLOCKS": "Moje bloky", - "DUPLICATE": "Kopírovat", - "DELETE": "Odstranit", - "ADD_COMMENT": "Přidat poznámku", - "REMOVE_COMMENT": "Odstranit poznámku", - "DELETE_BLOCK": "Smaž blok", - "DELETE_X_BLOCKS": "Smazat %1 bloků", - "DELETE_ALL_BLOCKS": "Smazat všech %1 bloků?", - "CLEAN_UP": "Ukliď bloky", - "HELP": "Pomoc", - "UNDO": "Vrátit", - "REDO": "Znovu provést", - "EDIT_PROCEDURE": "Upravit", - "SHOW_PROCEDURE_DEFINITION": "Jdi ke scénáři", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Řekni něco ...", - "COLOUR_HUE_LABEL": "Barva", - "COLOUR_SATURATION_LABEL": "Sytost", - "COLOUR_BRIGHTNESS_LABEL": "Jas", - "CHANGE_VALUE_TITLE": "Změň hodnotu:", - "RENAME_VARIABLE": "Přejmenovat proměnnou", - "RENAME_VARIABLE_TITLE": "Přejmenuj všech \"%1\" proměnných na:", - "RENAME_VARIABLE_MODAL_TITLE": "Přejmenovat proměnnou", - "NEW_VARIABLE": "Vytvoř proměnnou", - "NEW_VARIABLE_TITLE": "Nové jméno proměnné:", - "VARIABLE_MODAL_TITLE": "Nová proměnná", - "VARIABLE_ALREADY_EXISTS": "Proměnná pojmenovaná \"%1\" již existuje.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Proměnná téhož jména \"%1\" již existuje jako jiná proměnná typu \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Smazat %1 výskytů proměnné \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nelze smazat proměnnou \"%1\", protože je součástí scénáře funkce \"%2\"", - "DELETE_VARIABLE": "Smaž proměnnou \"%1\"", - "NEW_PROCEDURE": "Vytvořit blok", - "PROCEDURE_ALREADY_EXISTS": "Scénář se jménem \"%1\" již existuje.", - "PROCEDURE_DEFAULT_NAME": "název bloku", - "NEW_LIST": "Vytvoř seznam", - "NEW_LIST_TITLE": "Nový název seznamu:", - "LIST_MODAL_TITLE": "Nový seznam", - "LIST_ALREADY_EXISTS": "Seznam \"%1\" již existuje.", - "RENAME_LIST_TITLE": "Přejmenuj všech \"%1\" seznamů na:", - "RENAME_LIST_MODAL_TITLE": "Přejmenuj seznam", - "DEFAULT_LIST_ITEM": "věc", - "DELETE_LIST": "Smaž seznam \"%1\"", - "RENAME_LIST": "Přejmenuj seznam", - "NEW_BROADCAST_MESSAGE": "Nová zpráva", - "NEW_BROADCAST_MESSAGE_TITLE": "Nový název zprávy:", - "BROADCAST_MODAL_TITLE": "Nová zpráva", - "DEFAULT_BROADCAST_MESSAGE_NAME": "zpráva1" -}; - -Blockly.ScratchMsgs.locales["cy"] = -{ - "CONTROL_FOREVER": "am byth", - "CONTROL_REPEAT": "ailadrodd %1", - "CONTROL_IF": "os %1 yna", - "CONTROL_ELSE": "fel arall", - "CONTROL_STOP": "aros", - "CONTROL_STOP_ALL": "y cyfan", - "CONTROL_STOP_THIS": "y sgript hon", - "CONTROL_STOP_OTHER": "sgriptiau eraill yn y ciplun", - "CONTROL_WAIT": "aros %1 eiliad", - "CONTROL_WAITUNTIL": "aros hyd at %1", - "CONTROL_REPEATUNTIL": "ailadrodd hyd at %1", - "CONTROL_WHILE": "tra bo %1", - "CONTROL_FOREACH": "am bob %1 yn %2", - "CONTROL_STARTASCLONE": "pan rwy'n dechrau fel clôn", - "CONTROL_CREATECLONEOF": "creu clôn o %1", - "CONTROL_CREATECLONEOF_MYSELF": "fi fy hun", - "CONTROL_DELETETHISCLONE": "dileu y clôn hwn", - "CONTROL_COUNTER": "rhifydd", - "CONTROL_INCRCOUNTER": "rhifydd cynyddiad", - "CONTROL_CLEARCOUNTER": "clirio'r rhifydd", - "CONTROL_ALLATONCE": "pob un ar unwaith", - "DATA_SETVARIABLETO": "gosod %1 i %2", - "DATA_CHANGEVARIABLEBY": "newid %1 gan %2", - "DATA_SHOWVARIABLE": "dangos newidyn %1", - "DATA_HIDEVARIABLE": "cuddio newidyn %1", - "DATA_ADDTOLIST": "ychwanegu %1 i %2", - "DATA_DELETEOFLIST": "dileu %1 o %2", - "DATA_DELETEALLOFLIST": "Dileu pob un o'r %1", - "DATA_INSERTATLIST": "mewnosod %1 yn %2 o %3", - "DATA_REPLACEITEMOFLIST": "amnewid eitem %1 o %2 gyda %3", - "DATA_ITEMOFLIST": "eitem %1 o %2", - "DATA_ITEMNUMOFLIST": "eitem # %1 yn %2", - "DATA_LENGTHOFLIST": "hyd %1", - "DATA_LISTCONTAINSITEM": "%1 yn cynnwys %2?", - "DATA_SHOWLIST": "dangos rhestr %1", - "DATA_HIDELIST": "cuddio rhestr %1", - "DATA_INDEX_ALL": "y cyfan", - "DATA_INDEX_LAST": "olaf", - "DATA_INDEX_RANDOM": "ar hap", - "EVENT_WHENFLAGCLICKED": "pan fydd %1 wedi ei glicio", - "EVENT_WHENTHISSPRITECLICKED": "pan gaiff y ciplun yma ei glicio", - "EVENT_WHENSTAGECLICKED": "pan fydd llwyfan wedi ei glicio", - "EVENT_WHENTOUCHINGOBJECT": "pan fydd y corlun yn cyffwrdd %1", - "EVENT_WHENBROADCASTRECEIVED": "pan rwy'n derbyn %1", - "EVENT_WHENBACKDROPSWITCHESTO": "pan fydd cefndir yn newid i %1", - "EVENT_WHENGREATERTHAN": "pan %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "amserydd", - "EVENT_WHENGREATERTHAN_LOUDNESS": "cryfder sain", - "EVENT_BROADCAST": "darlledu %1", - "EVENT_BROADCASTANDWAIT": "darlledu %1 ac aros", - "EVENT_WHENKEYPRESSED": "pan fo bysell %1 wedi ei wasgu", - "EVENT_WHENKEYPRESSED_SPACE": "bwlch", - "EVENT_WHENKEYPRESSED_LEFT": "saeth chwith", - "EVENT_WHENKEYPRESSED_RIGHT": "saeth de", - "EVENT_WHENKEYPRESSED_DOWN": "saeth i lawr", - "EVENT_WHENKEYPRESSED_UP": "saeth i fyny", - "EVENT_WHENKEYPRESSED_ANY": "unrhyw", - "LOOKS_SAYFORSECS": "dweud %1 am %2 eiliad", - "LOOKS_SAY": "dweud %1", - "LOOKS_HELLO": "Helo!", - "LOOKS_THINKFORSECS": "meddwl %1 am %2 eiliad", - "LOOKS_THINK": "meddwl %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "dangos", - "LOOKS_HIDE": "cuddio", - "LOOKS_HIDEALLSPRITES": "cuddio pob ciplun", - "LOOKS_EFFECT_COLOR": "lliw", - "LOOKS_EFFECT_FISHEYE": "llygad pysgodyn", - "LOOKS_EFFECT_WHIRL": "chwyrliad", - "LOOKS_EFFECT_PIXELATE": "picseleiddio", - "LOOKS_EFFECT_MOSAIC": "mosaig", - "LOOKS_EFFECT_BRIGHTNESS": "disgleirdeb", - "LOOKS_EFFECT_GHOST": "ysbryd", - "LOOKS_CHANGEEFFECTBY": "newid effaith %1 gan %2", - "LOOKS_SETEFFECTTO": "gosod effaith %1 effaith i %2", - "LOOKS_CLEARGRAPHICEFFECTS": "clirio effeithiau graffeg", - "LOOKS_CHANGESIZEBY": "newid maint gan %1", - "LOOKS_SETSIZETO": "gosod maint i %1 %", - "LOOKS_SIZE": "maint", - "LOOKS_CHANGESTRETCHBY": "newid yr ymestyn gan %1", - "LOOKS_SETSTRETCHTO": "gosod ymestyniad gan %1 %", - "LOOKS_SWITCHCOSTUMETO": "newid gwisg i %1", - "LOOKS_NEXTCOSTUME": "gwisg nesaf", - "LOOKS_SWITCHBACKDROPTO": "newid cefndir i %1", - "LOOKS_GOTOFRONTBACK": "mynd i haen %1", - "LOOKS_GOTOFRONTBACK_FRONT": "blaen", - "LOOKS_GOTOFRONTBACK_BACK": "cefn", - "LOOKS_GOFORWARDBACKWARDLAYERS": "mynd i haenau %1 %2", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ymlaen", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "nôl", - "LOOKS_BACKDROPNUMBERNAME": "cefnlen %1", - "LOOKS_COSTUMENUMBERNAME": "gwisg %1", - "LOOKS_NUMBERNAME_NUMBER": "rhif", - "LOOKS_NUMBERNAME_NAME": "enw", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "newid cefnlen i %1 ac aros", - "LOOKS_NEXTBACKDROP_BLOCK": "cefnlen nesaf", - "LOOKS_NEXTBACKDROP": "cefnlen nesaf", - "LOOKS_PREVIOUSBACKDROP": "cefnlen flaenorol", - "LOOKS_RANDOMBACKDROP": "cefnlen ar hap", - "MOTION_MOVESTEPS": "symud %1 cam", - "MOTION_TURNLEFT": "troi %1 %2 gradd", - "MOTION_TURNRIGHT": "troi %1 %2 gradd", - "MOTION_POINTINDIRECTION": "pwyntio i gyfeiriad %1", - "MOTION_POINTTOWARDS": "pwyntio tuag at %1", - "MOTION_POINTTOWARDS_POINTER": "pwyntydd llygoden", - "MOTION_POINTTOWARDS_RANDOM": "cyfeiriad ar hap", - "MOTION_GOTO": "mynd i %1", - "MOTION_GOTO_POINTER": "pwyntydd llygoden", - "MOTION_GOTO_RANDOM": "safle ar hap", - "MOTION_GOTOXY": "mynd i x:%1 y: %2", - "MOTION_GLIDESECSTOXY": "llithro %1 eiliad i x: %2 y: %3", - "MOTION_GLIDETO": "llithro %1 eiliad i %2", - "MOTION_GLIDETO_POINTER": "pwyntydd llygoden", - "MOTION_GLIDETO_RANDOM": "safle ar hap", - "MOTION_CHANGEXBY": "newid x gan %1", - "MOTION_SETX": "gosod x i %1", - "MOTION_CHANGEYBY": "newid y gan %1", - "MOTION_SETY": "gosod y i %1", - "MOTION_IFONEDGEBOUNCE": "os ar ymyl, bowndio", - "MOTION_SETROTATIONSTYLE": "gosod steil cylchdroi %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "chwith-dde", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "peidio troi", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "o amgylch", - "MOTION_XPOSITION": "safle x", - "MOTION_YPOSITION": "safle y", - "MOTION_DIRECTION": "cyfeiriad", - "MOTION_SCROLLRIGHT": "sgrolio i'r dde %1", - "MOTION_SCROLLUP": "sgrolio i fyny %1", - "MOTION_ALIGNSCENE": "alinio golygfa %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "gwaelod chwith", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "gwaelod de", - "MOTION_ALIGNSCENE_MIDDLE": "canol", - "MOTION_ALIGNSCENE_TOPLEFT": "brig chwith", - "MOTION_ALIGNSCENE_TOPRIGHT": "brig de", - "MOTION_XSCROLL": "sgrolio x", - "MOTION_YSCROLL": "sgrolio y", - "MOTION_STAGE_SELECTED": "Llwyfan wedi ei ddewis: dim blociau symud", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "dewis ar hap %1 i %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 a %2", - "OPERATORS_OR": "%1 neu %2", - "OPERATORS_NOT": "nid %1", - "OPERATORS_JOIN": "uno %1 %2", - "OPERATORS_JOIN_APPLE": "afal", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "llythyren %1 o %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "hyd %1", - "OPERATORS_CONTAINS": "%1 yn cynnwys %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "talgrynnu %1", - "OPERATORS_MATHOP": "%1 o %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "llawr", - "OPERATORS_MATHOP_CEILING": "nenfwd", - "OPERATORS_MATHOP_SQRT": "ail isradd", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "Yn", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "diffinio %1", - "SENSING_TOUCHINGOBJECT": "cyffwrdd %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "pwyntydd llygoden", - "SENSING_TOUCHINGOBJECT_EDGE": "ymyl", - "SENSING_TOUCHINGCOLOR": "cyffwrdd lliw %1?", - "SENSING_COLORISTOUCHINGCOLOR": "lliw %1 yn cyffwrdd %2?", - "SENSING_DISTANCETO": "pellter i %1", - "SENSING_DISTANCETO_POINTER": "pwyntydd llygoden", - "SENSING_ASKANDWAIT": "gofyn %1 ac aros", - "SENSING_ASK_TEXT": "Beth yw eich enw?", - "SENSING_ANSWER": "ateb", - "SENSING_KEYPRESSED": "bysell %1 wedi ei phwyso?", - "SENSING_MOUSEDOWN": "llygoden i lawr?", - "SENSING_MOUSEX": "llygoden x", - "SENSING_MOUSEY": "llygoden y", - "SENSING_SETDRAGMODE": "gosod y modd llusgo %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "llusgadwy", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "anllusgadwy", - "SENSING_LOUDNESS": "cryfder sain", - "SENSING_LOUD": "sain gref?", - "SENSING_TIMER": "amserydd", - "SENSING_RESETTIMER": "ailosod amserydd", - "SENSING_OF": "%1 o %2", - "SENSING_OF_XPOSITION": "safle x", - "SENSING_OF_YPOSITION": "safle y", - "SENSING_OF_DIRECTION": "cyfeiriad", - "SENSING_OF_COSTUMENUMBER": "gwisg #", - "SENSING_OF_COSTUMENAME": "enw'r wisg", - "SENSING_OF_SIZE": "maint", - "SENSING_OF_VOLUME": "lefel sain", - "SENSING_OF_BACKDROPNUMBER": "cefnlen #", - "SENSING_OF_BACKDROPNAME": "enw cefnlen", - "SENSING_OF_STAGE": "Llwyfan", - "SENSING_CURRENT": "cyfredol %1", - "SENSING_CURRENT_YEAR": "blwyddyn", - "SENSING_CURRENT_MONTH": "mis", - "SENSING_CURRENT_DATE": "dyddiad", - "SENSING_CURRENT_DAYOFWEEK": "diwrnod o'r wythnos", - "SENSING_CURRENT_HOUR": "awr", - "SENSING_CURRENT_MINUTE": "munud", - "SENSING_CURRENT_SECOND": "eiliad", - "SENSING_DAYSSINCE2000": "dyddiau ers 2000", - "SENSING_USERNAME": "enw defnyddiwr", - "SENSING_USERID": "id defnyddiwr", - "SOUND_PLAY": "cychwyn sain %1", - "SOUND_PLAYUNTILDONE": "chwarae sain %1 tan y diwedd", - "SOUND_STOPALLSOUNDS": "atal pob sain", - "SOUND_SETEFFECTO": "gosod effaith %1 effaith i %2", - "SOUND_CHANGEEFFECTBY": "newid effaith %1 gan %2", - "SOUND_CLEAREFFECTS": "clirio effeithiau sain", - "SOUND_EFFECTS_PITCH": "traw", - "SOUND_EFFECTS_PAN": "troi chwith/de", - "SOUND_CHANGEVOLUMEBY": "newid uchder sain gan %1", - "SOUND_SETVOLUMETO": "gosod lefel sain i %1%", - "SOUND_VOLUME": "lefel sain", - "SOUND_RECORD": "recordio...", - "CATEGORY_MOTION": "Symudiad", - "CATEGORY_LOOKS": "Edrychiad", - "CATEGORY_SOUND": "Sain", - "CATEGORY_EVENTS": "Digwyddiadau", - "CATEGORY_CONTROL": "Rheoli", - "CATEGORY_SENSING": "Synhwyro", - "CATEGORY_OPERATORS": "Gweithredwyr", - "CATEGORY_VARIABLES": "Newidynnau", - "CATEGORY_MYBLOCKS": "Fy Mlociau", - "DUPLICATE": "Dyblygu", - "DELETE": "Dileu", - "ADD_COMMENT": "Ychwanegu Sylw", - "REMOVE_COMMENT": "Tynnu Sylw", - "DELETE_BLOCK": "Dileu Bloc", - "DELETE_X_BLOCKS": "Dileu %1 Bloc", - "DELETE_ALL_BLOCKS": "Dileu pob un o'r %1 bloc?", - "CLEAN_UP": "Glanhau'r Blociau", - "HELP": "Cymorth", - "UNDO": "Dadwneud", - "REDO": "Ailwneud", - "EDIT_PROCEDURE": "Golygu", - "SHOW_PROCEDURE_DEFINITION": "Mynd i'r diffiniad", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dwedwch rywbeth...", - "COLOUR_HUE_LABEL": "Lliw", - "COLOUR_SATURATION_LABEL": "Dirlawnder", - "COLOUR_BRIGHTNESS_LABEL": "Disgleirdeb", - "CHANGE_VALUE_TITLE": "Newid gwerth:", - "RENAME_VARIABLE": "Ailenwi newidyn", - "RENAME_VARIABLE_TITLE": "Ailenwi pob newidyn \"%1\" i:", - "RENAME_VARIABLE_MODAL_TITLE": "Ailenwi Newidyn", - "NEW_VARIABLE": "Creu Newidyn", - "NEW_VARIABLE_TITLE": "Enw newidyn newydd:", - "VARIABLE_MODAL_TITLE": "Newidyn Newydd", - "VARIABLE_ALREADY_EXISTS": "Mae newidyn o'r enw \"%1\" yn bodoli eisoes.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Mae newidyn o'r enw \"%1\" yn bodoli eisoes ar gyfer math arall o newidyn \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Dileu'r defnydd %1 o'r newidyn \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Methu dileu newidyn \"%1\" gan ei fod yn rhan o ddiffiniad swyddogaeth \"%2\"", - "DELETE_VARIABLE": "Dileu newidyn \"%1\"", - "NEW_PROCEDURE": "Creu Bloc", - "PROCEDURE_ALREADY_EXISTS": "Mae trefn o'r enw \"%1\" yn bodoli eisoes.", - "PROCEDURE_DEFAULT_NAME": "enw bloc", - "NEW_LIST": "Gwneud Rhestr", - "NEW_LIST_TITLE": "Enw rhestr newydd:", - "LIST_MODAL_TITLE": "Rhestr Newydd", - "LIST_ALREADY_EXISTS": "Mae rhestr o'r enw \"%1\" yn bodoli eisoes.", - "RENAME_LIST_TITLE": "Ailenwi pob rhestr \"%1\" i:", - "RENAME_LIST_MODAL_TITLE": "Ailenwi Rhestr", - "DEFAULT_LIST_ITEM": "peth", - "DELETE_LIST": "Dileu'r rhestr \"%1\" ", - "RENAME_LIST": "Ailenwi rhestr", - "NEW_BROADCAST_MESSAGE": "Neges newydd", - "NEW_BROADCAST_MESSAGE_TITLE": "Enw neges newydd:", - "BROADCAST_MODAL_TITLE": "Neges Newydd", - "DEFAULT_BROADCAST_MESSAGE_NAME": "neges1" -}; - -Blockly.ScratchMsgs.locales["da"] = -{ - "CONTROL_FOREVER": "for evigt", - "CONTROL_REPEAT": "gentag %1 gange", - "CONTROL_IF": "hvis %1 så", - "CONTROL_ELSE": "ellers", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "alle", - "CONTROL_STOP_THIS": "dette script", - "CONTROL_STOP_OTHER": "andre scripts i sprite", - "CONTROL_WAIT": "vent %1 sekunder", - "CONTROL_WAITUNTIL": "vent indtil %1", - "CONTROL_REPEATUNTIL": "gentag indtil %1", - "CONTROL_WHILE": "mens %1", - "CONTROL_FOREACH": "for hver %1 i %2", - "CONTROL_STARTASCLONE": "når jeg starter som klon", - "CONTROL_CREATECLONEOF": "opret en klon af %1", - "CONTROL_CREATECLONEOF_MYSELF": "mig selv", - "CONTROL_DELETETHISCLONE": "slet denne klon", - "CONTROL_COUNTER": "tæller", - "CONTROL_INCRCOUNTER": "tæl tæller op", - "CONTROL_CLEARCOUNTER": "nulstil tæller", - "CONTROL_ALLATONCE": "alle på en gang", - "DATA_SETVARIABLETO": "sæt %1 til %2", - "DATA_CHANGEVARIABLEBY": "ændre %1 med %2", - "DATA_SHOWVARIABLE": "vis variabel %1", - "DATA_HIDEVARIABLE": "skjul variabel %1", - "DATA_ADDTOLIST": "tilføj %1 til %2", - "DATA_DELETEOFLIST": "slet %1 af %2", - "DATA_DELETEALLOFLIST": "slet alle %1", - "DATA_INSERTATLIST": "indsæt %1 ved %2 af %3", - "DATA_REPLACEITEMOFLIST": "erstat nummer %1 af %2 med %3", - "DATA_ITEMOFLIST": "nummer %1 af %2", - "DATA_ITEMNUMOFLIST": "nummer # af %1 i %2", - "DATA_LENGTHOFLIST": "længden af %1", - "DATA_LISTCONTAINSITEM": "%1 indeholder %2?", - "DATA_SHOWLIST": "vis liste %1", - "DATA_HIDELIST": "skjul liste %1", - "DATA_INDEX_ALL": "alle", - "DATA_INDEX_LAST": "sidste", - "DATA_INDEX_RANDOM": "tilfældig", - "EVENT_WHENFLAGCLICKED": "når der klikkes på %1 ", - "EVENT_WHENTHISSPRITECLICKED": "når denne sprite klikkes", - "EVENT_WHENSTAGECLICKED": "når scene er valgt", - "EVENT_WHENTOUCHINGOBJECT": "når denne sprite berører %1", - "EVENT_WHENBROADCASTRECEIVED": "når jeg modtager %1", - "EVENT_WHENBACKDROPSWITCHESTO": "når baggrund skifter til %1", - "EVENT_WHENGREATERTHAN": "når %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "stopur", - "EVENT_WHENGREATERTHAN_LOUDNESS": "lydstyrke", - "EVENT_BROADCAST": "send %1", - "EVENT_BROADCASTANDWAIT": "send %1 og vent", - "EVENT_WHENKEYPRESSED": "når du trykker på %1", - "EVENT_WHENKEYPRESSED_SPACE": "mellemrum", - "EVENT_WHENKEYPRESSED_LEFT": "venstre pil", - "EVENT_WHENKEYPRESSED_RIGHT": "højre pil", - "EVENT_WHENKEYPRESSED_DOWN": "pil nedad", - "EVENT_WHENKEYPRESSED_UP": "pil opad", - "EVENT_WHENKEYPRESSED_ANY": "vilkårlig", - "LOOKS_SAYFORSECS": "sig %1 i %2 sekunder", - "LOOKS_SAY": "sig %1", - "LOOKS_HELLO": "Hej!", - "LOOKS_THINKFORSECS": "tænk %1 i %2 sekunder", - "LOOKS_THINK": "tænk %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "vis", - "LOOKS_HIDE": "skjul", - "LOOKS_HIDEALLSPRITES": "skjul alle sprites", - "LOOKS_EFFECT_COLOR": "farve", - "LOOKS_EFFECT_FISHEYE": "fiskeøje", - "LOOKS_EFFECT_WHIRL": "vrid", - "LOOKS_EFFECT_PIXELATE": "pixeler", - "LOOKS_EFFECT_MOSAIC": "mosaik", - "LOOKS_EFFECT_BRIGHTNESS": "lysstyrke", - "LOOKS_EFFECT_GHOST": "spøgelse", - "LOOKS_CHANGEEFFECTBY": "ændre effekt %1 med %2", - "LOOKS_SETEFFECTTO": "sæt effekt %1 til %2", - "LOOKS_CLEARGRAPHICEFFECTS": "fjern grafiske effekter", - "LOOKS_CHANGESIZEBY": "ændre størrelse med %1", - "LOOKS_SETSIZETO": "sæt størrelse til %1 %", - "LOOKS_SIZE": "størrelse", - "LOOKS_CHANGESTRETCHBY": "ændre stræk med %1", - "LOOKS_SETSTRETCHTO": "sæt stræk til %1 %", - "LOOKS_SWITCHCOSTUMETO": "skift kostume til %1", - "LOOKS_NEXTCOSTUME": "næste kostume", - "LOOKS_SWITCHBACKDROPTO": "skift baggrund til %1", - "LOOKS_GOTOFRONTBACK": "gå til %1 lag", - "LOOKS_GOTOFRONTBACK_FRONT": "forreste", - "LOOKS_GOTOFRONTBACK_BACK": "bagerste", - "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %2 lag %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "frem", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "tilbage", - "LOOKS_BACKDROPNUMBERNAME": "baggrund %1", - "LOOKS_COSTUMENUMBERNAME": "kostume %1", - "LOOKS_NUMBERNAME_NUMBER": "nummer", - "LOOKS_NUMBERNAME_NAME": "navn", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "skift baggrund til %1 og vent", - "LOOKS_NEXTBACKDROP_BLOCK": "næste baggrund", - "LOOKS_NEXTBACKDROP": "næste baggrund", - "LOOKS_PREVIOUSBACKDROP": "forrige baggrund", - "LOOKS_RANDOMBACKDROP": "tilfældig baggrund", - "MOTION_MOVESTEPS": "gå %1 trin", - "MOTION_TURNLEFT": "drej %1 %2 grader", - "MOTION_TURNRIGHT": "drej %1 %2 grader", - "MOTION_POINTINDIRECTION": "peg i retning %1", - "MOTION_POINTTOWARDS": "peg mod %1", - "MOTION_POINTTOWARDS_POINTER": "musepil", - "MOTION_POINTTOWARDS_RANDOM": "tilfældig retning", - "MOTION_GOTO": "gå til %1", - "MOTION_GOTO_POINTER": "musepil", - "MOTION_GOTO_RANDOM": "tilfældig position", - "MOTION_GOTOXY": "gå til x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "glid %1 sekunder til x: %2 y: %3", - "MOTION_GLIDETO": "glid %1 sekunder til %2", - "MOTION_GLIDETO_POINTER": "musepil", - "MOTION_GLIDETO_RANDOM": "tilfældig position", - "MOTION_CHANGEXBY": "ændre x med %1", - "MOTION_SETX": "sæt x til %1", - "MOTION_CHANGEYBY": "ændre y med %1", - "MOTION_SETY": "sæt y til %1", - "MOTION_IFONEDGEBOUNCE": "hop tilbage ved kanten", - "MOTION_SETROTATIONSTYLE": "sæt rotationsstil til %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "venstre-højre", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "drej ikke", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "alle retninger", - "MOTION_XPOSITION": "x position", - "MOTION_YPOSITION": "y position", - "MOTION_DIRECTION": "retning", - "MOTION_SCROLLRIGHT": "rul mod højre %1", - "MOTION_SCROLLUP": "rul op %1", - "MOTION_ALIGNSCENE": "tilpas scene %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "nederst-til-venstre", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nederst-til-højre", - "MOTION_ALIGNSCENE_MIDDLE": "midten", - "MOTION_ALIGNSCENE_TOPLEFT": "øverst-til-venstre", - "MOTION_ALIGNSCENE_TOPRIGHT": "øverst-til-højre", - "MOTION_XSCROLL": "x rul", - "MOTION_YSCROLL": "y rul", - "MOTION_STAGE_SELECTED": "scene valgt: ingen bevægelses brikker", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "vælg tilfældigt mellem %1 og %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 og %2", - "OPERATORS_OR": "%1 eller %2", - "OPERATORS_NOT": "ikke %1", - "OPERATORS_JOIN": "%1 tilkobles %2", - "OPERATORS_JOIN_APPLE": "æble", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "bogstav %1 af %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "længden af %1", - "OPERATORS_CONTAINS": "%1 indeholder %2?", - "OPERATORS_MOD": "%1 modulo %2", - "OPERATORS_ROUND": "afrund %1", - "OPERATORS_MATHOP": "%1 af %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "rund ned", - "OPERATORS_MATHOP_CEILING": "rund op", - "OPERATORS_MATHOP_SQRT": "kvrod", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definer %1", - "SENSING_TOUCHINGOBJECT": "berører %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "musepil", - "SENSING_TOUCHINGOBJECT_EDGE": "kant", - "SENSING_TOUCHINGCOLOR": "berører farven %1?", - "SENSING_COLORISTOUCHINGCOLOR": "berører %1 farven %2?", - "SENSING_DISTANCETO": "afstand til %1", - "SENSING_DISTANCETO_POINTER": "musepil", - "SENSING_ASKANDWAIT": "bed om %1 og vent", - "SENSING_ASK_TEXT": "Hvad er dit navn?", - "SENSING_ANSWER": "svar", - "SENSING_KEYPRESSED": "trykket på tasten %1?", - "SENSING_MOUSEDOWN": "trykket på musen?", - "SENSING_MOUSEX": "musens x-position", - "SENSING_MOUSEY": "musens y-position", - "SENSING_SETDRAGMODE": "sæt flytbarhed til %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "kan flyttes", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "kan ikke flyttes", - "SENSING_LOUDNESS": "lydstyrke", - "SENSING_LOUD": "højt?", - "SENSING_TIMER": "stopur", - "SENSING_RESETTIMER": "nulstil stopur", - "SENSING_OF": "%1 af %2", - "SENSING_OF_XPOSITION": "x position", - "SENSING_OF_YPOSITION": "y position", - "SENSING_OF_DIRECTION": "retning", - "SENSING_OF_COSTUMENUMBER": "kostume #", - "SENSING_OF_COSTUMENAME": "navn på kostume", - "SENSING_OF_SIZE": "størrelse", - "SENSING_OF_VOLUME": "lydstyrke", - "SENSING_OF_BACKDROPNUMBER": "baggrund #", - "SENSING_OF_BACKDROPNAME": "navn på baggrund", - "SENSING_OF_STAGE": "Scene", - "SENSING_CURRENT": "nuværende %1", - "SENSING_CURRENT_YEAR": "år", - "SENSING_CURRENT_MONTH": "måned", - "SENSING_CURRENT_DATE": "dato", - "SENSING_CURRENT_DAYOFWEEK": "ugedag", - "SENSING_CURRENT_HOUR": "time", - "SENSING_CURRENT_MINUTE": "minut", - "SENSING_CURRENT_SECOND": "sekund", - "SENSING_DAYSSINCE2000": "dage siden 2000", - "SENSING_USERNAME": "brugernavn", - "SENSING_USERID": "bruger id", - "SOUND_PLAY": "spil lyden %1", - "SOUND_PLAYUNTILDONE": "spil lyden %1 indtil færdig", - "SOUND_STOPALLSOUNDS": "stop al lyd", - "SOUND_SETEFFECTO": "sæt effekt %1 til %2", - "SOUND_CHANGEEFFECTBY": "ændre effekt %1 med %2", - "SOUND_CLEAREFFECTS": "fjern lydeffekter", - "SOUND_EFFECTS_PITCH": "tonehøjde", - "SOUND_EFFECTS_PAN": "balance venstre/højre", - "SOUND_CHANGEVOLUMEBY": "ændre lydstyrke med %1", - "SOUND_SETVOLUMETO": "sæt lydstyrke til %1%", - "SOUND_VOLUME": "lydstyrke", - "SOUND_RECORD": "optag...", - "CATEGORY_MOTION": "Bevægelse", - "CATEGORY_LOOKS": "Udseende", - "CATEGORY_SOUND": "Lyd", - "CATEGORY_EVENTS": "Hændelser", - "CATEGORY_CONTROL": "Kontrol", - "CATEGORY_SENSING": "Registrering", - "CATEGORY_OPERATORS": "Operatorer", - "CATEGORY_VARIABLES": "Variabler", - "CATEGORY_MYBLOCKS": "Mine brikker", - "DUPLICATE": "Kopiér", - "DELETE": "Slet", - "ADD_COMMENT": "Tilføj kommentar", - "REMOVE_COMMENT": "Slet kommentar", - "DELETE_BLOCK": "Slet brik", - "DELETE_X_BLOCKS": "Slet %1 brikker", - "DELETE_ALL_BLOCKS": "Slet alle %1 brikker?", - "CLEAN_UP": "Ryd brikkerne op", - "HELP": "Hjælp", - "UNDO": "Fortryd", - "REDO": "Gør om", - "EDIT_PROCEDURE": "Redigér", - "SHOW_PROCEDURE_DEFINITION": "Gå til forklaring", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sig noget...", - "COLOUR_HUE_LABEL": "Farve", - "COLOUR_SATURATION_LABEL": "Farvemætning", - "COLOUR_BRIGHTNESS_LABEL": "Lysstyrke", - "CHANGE_VALUE_TITLE": "Ændre værdien:", - "RENAME_VARIABLE": "Omdøb variabel", - "RENAME_VARIABLE_TITLE": "Omdøb alle \"%1\" variabler til:", - "RENAME_VARIABLE_MODAL_TITLE": "Omdøb variabel", - "NEW_VARIABLE": "Lav en variabel", - "NEW_VARIABLE_TITLE": "Navn på ny variabel:", - "VARIABLE_MODAL_TITLE": "Ny variabel", - "VARIABLE_ALREADY_EXISTS": "Der eksisterer allerede en variabel med navnet '%1'.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Der eksisterer allerede en variabel med navnet \"%1\" for en anden variabel af typen \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Slet %1 brugen af denne \"%2\" variabel?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan ikke slette variablen \"%1\" fordi at den er en del af forklaringen til funktionen \"%2\"", - "DELETE_VARIABLE": "Slet \"%1\" variablen", - "NEW_PROCEDURE": "Lav en brik", - "PROCEDURE_ALREADY_EXISTS": "Der eksisterer allerede en procedure med navnet \"%1\".", - "PROCEDURE_DEFAULT_NAME": "brikkens navn", - "NEW_LIST": "Lav en liste", - "NEW_LIST_TITLE": "Navn på ny liste:", - "LIST_MODAL_TITLE": "Ny liste", - "LIST_ALREADY_EXISTS": "Der eksisterer allerede en liste med navnet \"%1\".", - "RENAME_LIST_TITLE": "Omdøb alle \"%1\" lister til:", - "RENAME_LIST_MODAL_TITLE": "Omdøb liste", - "DEFAULT_LIST_ITEM": "ting", - "DELETE_LIST": "Slet \"%1\" listen", - "RENAME_LIST": "Omdøb liste", - "NEW_BROADCAST_MESSAGE": "Ny besked", - "NEW_BROADCAST_MESSAGE_TITLE": "Navn på ny besked:", - "BROADCAST_MODAL_TITLE": "Ny besked", - "DEFAULT_BROADCAST_MESSAGE_NAME": "besked1" -}; - -Blockly.ScratchMsgs.locales["de"] = -{ - "CONTROL_FOREVER": "wiederhole fortlaufend", - "CONTROL_REPEAT": "wiederhole %1 mal", - "CONTROL_IF": "falls %1, dann", - "CONTROL_ELSE": "sonst", - "CONTROL_STOP": "stoppe", - "CONTROL_STOP_ALL": "alles", - "CONTROL_STOP_THIS": "dieses Skript", - "CONTROL_STOP_OTHER": "andere Skripte der Figur", - "CONTROL_WAIT": "warte %1 Sekunden", - "CONTROL_WAITUNTIL": "warte bis %1", - "CONTROL_REPEATUNTIL": "wiederhole bis %1", - "CONTROL_WHILE": "wiederhole solange %1", - "CONTROL_FOREACH": "wiederhole für jedes %1 in %2", - "CONTROL_STARTASCLONE": "Wenn ich als Klon entstehe", - "CONTROL_CREATECLONEOF": "erzeuge Klon von %1", - "CONTROL_CREATECLONEOF_MYSELF": "mir selbst", - "CONTROL_DELETETHISCLONE": "lösche diesen Klon", - "CONTROL_COUNTER": "Zähler", - "CONTROL_INCRCOUNTER": "erhöhe Zähler", - "CONTROL_CLEARCOUNTER": "lösche Zähler", - "CONTROL_ALLATONCE": "Alle gleichzeitig", - "DATA_SETVARIABLETO": "setze %1 auf %2", - "DATA_CHANGEVARIABLEBY": "ändere %1 um %2", - "DATA_SHOWVARIABLE": "zeige Variable %1", - "DATA_HIDEVARIABLE": "verstecke Variable %1", - "DATA_ADDTOLIST": "füge %1 zu %2 hinzu", - "DATA_DELETEOFLIST": "lösche %1 aus %2", - "DATA_DELETEALLOFLIST": "lösche alles aus %1", - "DATA_INSERTATLIST": "füge %1 bei %2 in %3 ein", - "DATA_REPLACEITEMOFLIST": "ersetze Element %1 von %2 durch %3", - "DATA_ITEMOFLIST": "Element %1 von %2", - "DATA_ITEMNUMOFLIST": "Nummer von %1 in %2", - "DATA_LENGTHOFLIST": "Länge von %1", - "DATA_LISTCONTAINSITEM": "%1 enthält %2?", - "DATA_SHOWLIST": "zeige Liste %1", - "DATA_HIDELIST": "verstecke Liste %1", - "DATA_INDEX_ALL": "alles", - "DATA_INDEX_LAST": "letztes", - "DATA_INDEX_RANDOM": "zufälliges", - "EVENT_WHENFLAGCLICKED": "Wenn %1 angeklickt wird", - "EVENT_WHENTHISSPRITECLICKED": "Wenn diese Figur angeklickt wird", - "EVENT_WHENSTAGECLICKED": "Wenn die Bühne angeklickt wird", - "EVENT_WHENTOUCHINGOBJECT": "Wenn diese Figur %1 berührt", - "EVENT_WHENBROADCASTRECEIVED": "Wenn ich %1 empfange", - "EVENT_WHENBACKDROPSWITCHESTO": "Wenn das Bühnenbild zu %1 wechselt", - "EVENT_WHENGREATERTHAN": "Wenn %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "Stoppuhr", - "EVENT_WHENGREATERTHAN_LOUDNESS": "Lautstärke", - "EVENT_BROADCAST": "sende %1 an alle", - "EVENT_BROADCASTANDWAIT": "sende %1 an alle und warte", - "EVENT_WHENKEYPRESSED": "Wenn Taste %1 gedrückt wird", - "EVENT_WHENKEYPRESSED_SPACE": "Leertaste", - "EVENT_WHENKEYPRESSED_LEFT": "Pfeil nach links", - "EVENT_WHENKEYPRESSED_RIGHT": "Pfeil nach rechts", - "EVENT_WHENKEYPRESSED_DOWN": "Pfeil nach unten", - "EVENT_WHENKEYPRESSED_UP": "Pfeil nach oben", - "EVENT_WHENKEYPRESSED_ANY": "beliebiges", - "LOOKS_SAYFORSECS": "sage %1 für %2 Sekunden", - "LOOKS_SAY": "sage %1", - "LOOKS_HELLO": "Hallo!", - "LOOKS_THINKFORSECS": "denke %1 für %2 Sekunden", - "LOOKS_THINK": "denke %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "zeige dich", - "LOOKS_HIDE": "verstecke dich", - "LOOKS_HIDEALLSPRITES": "Alle Figuren verbergen", - "LOOKS_EFFECT_COLOR": "Farbe", - "LOOKS_EFFECT_FISHEYE": "Fischauge", - "LOOKS_EFFECT_WHIRL": "Wirbel", - "LOOKS_EFFECT_PIXELATE": "Pixel", - "LOOKS_EFFECT_MOSAIC": "Mosaik", - "LOOKS_EFFECT_BRIGHTNESS": "Helligkeit", - "LOOKS_EFFECT_GHOST": "Durchsichtigkeit", - "LOOKS_CHANGEEFFECTBY": "ändere Effekt %1 um %2", - "LOOKS_SETEFFECTTO": "setze Effekt %1 auf %2", - "LOOKS_CLEARGRAPHICEFFECTS": "schalte Grafikeffekte aus", - "LOOKS_CHANGESIZEBY": "ändere Größe um %1", - "LOOKS_SETSIZETO": "setze Größe auf %1", - "LOOKS_SIZE": "Größe", - "LOOKS_CHANGESTRETCHBY": "ändere Dehnung um %1", - "LOOKS_SETSTRETCHTO": "setze Dehnung auf %1 %", - "LOOKS_SWITCHCOSTUMETO": "wechsle zu Kostüm %1", - "LOOKS_NEXTCOSTUME": "wechsle zum nächsten Kostüm", - "LOOKS_SWITCHBACKDROPTO": "wechsle zu Bühnenbild %1", - "LOOKS_GOTOFRONTBACK": "gehe zu %1 Ebene", - "LOOKS_GOTOFRONTBACK_FRONT": "vorderster", - "LOOKS_GOTOFRONTBACK_BACK": "hinterster", - "LOOKS_GOFORWARDBACKWARDLAYERS": "gehe %2 Ebenen %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "nach vorne", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "nach hinten", - "LOOKS_BACKDROPNUMBERNAME": "Bühnenbild %1", - "LOOKS_COSTUMENUMBERNAME": "Kostüm %1", - "LOOKS_NUMBERNAME_NUMBER": "Nummer", - "LOOKS_NUMBERNAME_NAME": "Name", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "wechsle zu Bühnenbild %1 und warte", - "LOOKS_NEXTBACKDROP_BLOCK": "wechsle zum nächsten Bühnenbild", - "LOOKS_NEXTBACKDROP": "nächstes Bühnenbild", - "LOOKS_PREVIOUSBACKDROP": "vorheriges Bühnenbild", - "LOOKS_RANDOMBACKDROP": "zufälliges Bühnenbild", - "MOTION_MOVESTEPS": "gehe %1 er Schritt", - "MOTION_TURNLEFT": "drehe dich %1 um %2 Grad", - "MOTION_TURNRIGHT": "drehe dich %1 um %2 Grad", - "MOTION_POINTINDIRECTION": "setze Richtung auf %1 Grad", - "MOTION_POINTTOWARDS": "drehe dich zu %1", - "MOTION_POINTTOWARDS_POINTER": "Mauszeiger", - "MOTION_POINTTOWARDS_RANDOM": "Zufallsrichtung", - "MOTION_GOTO": "gehe zu %1", - "MOTION_GOTO_POINTER": "Mauszeiger", - "MOTION_GOTO_RANDOM": "Zufallsposition", - "MOTION_GOTOXY": "gehe zu x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "gleite in %1 Sek. zu x:%2 y:%3", - "MOTION_GLIDETO": "gleite in %1 Sek. zu %2", - "MOTION_GLIDETO_POINTER": "Mauszeiger", - "MOTION_GLIDETO_RANDOM": "Zufallsposition", - "MOTION_CHANGEXBY": "ändere x um %1", - "MOTION_SETX": "setze x auf %1", - "MOTION_CHANGEYBY": "ändere y um %1", - "MOTION_SETY": "setze y auf %1", - "MOTION_IFONEDGEBOUNCE": "pralle vom Rand ab", - "MOTION_SETROTATIONSTYLE": "setze Drehtyp auf %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "links-rechts", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "nicht drehen", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "rundherum", - "MOTION_XPOSITION": "x-Position", - "MOTION_YPOSITION": "y-Position", - "MOTION_DIRECTION": "Richtung", - "MOTION_SCROLLRIGHT": "%1 nach rechts bewegen", - "MOTION_SCROLLUP": "%1 nach oben bewegen", - "MOTION_ALIGNSCENE": "Szene ausrichten %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "unten links", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "unten rechts", - "MOTION_ALIGNSCENE_MIDDLE": "Mitte", - "MOTION_ALIGNSCENE_TOPLEFT": "oben links", - "MOTION_ALIGNSCENE_TOPRIGHT": "oben rechts", - "MOTION_XSCROLL": "x-Bewegung", - "MOTION_YSCROLL": "y-Bewegung", - "MOTION_STAGE_SELECTED": "Bühne ausgewählt: keine Bewegungsblöcke", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "Zufallszahl von %1 bis %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 und %2", - "OPERATORS_OR": "%1 oder %2", - "OPERATORS_NOT": "nicht %1", - "OPERATORS_JOIN": "verbinde %1 und %2", - "OPERATORS_JOIN_APPLE": "Apfel", - "OPERATORS_JOIN_BANANA": "Banane", - "OPERATORS_LETTEROF": "Zeichen %1 von %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "Länge von %1", - "OPERATORS_CONTAINS": "%1 enthält %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "%1 gerundet", - "OPERATORS_MATHOP": "%1 von %2", - "OPERATORS_MATHOP_ABS": "Betrag", - "OPERATORS_MATHOP_FLOOR": "abrunden", - "OPERATORS_MATHOP_CEILING": "aufrunden", - "OPERATORS_MATHOP_SQRT": "Wurzel", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e^", - "OPERATORS_MATHOP_10EXP": "10^", - "PROCEDURES_DEFINITION": "Definiere %1", - "SENSING_TOUCHINGOBJECT": "wird %1 berührt?", - "SENSING_TOUCHINGOBJECT_POINTER": "Mauszeiger", - "SENSING_TOUCHINGOBJECT_EDGE": "Rand", - "SENSING_TOUCHINGCOLOR": "wird Farbe %1 berührt?", - "SENSING_COLORISTOUCHINGCOLOR": "Farbe %1 berührt %2?", - "SENSING_DISTANCETO": "Entfernung von %1", - "SENSING_DISTANCETO_POINTER": "Mauszeiger", - "SENSING_ASKANDWAIT": "frage %1 und warte", - "SENSING_ASK_TEXT": "Wie heißt du?", - "SENSING_ANSWER": "Antwort", - "SENSING_KEYPRESSED": "Taste %1 gedrückt?", - "SENSING_MOUSEDOWN": "Maustaste gedrückt?", - "SENSING_MOUSEX": "Maus x-Position", - "SENSING_MOUSEY": "Maus y-Position", - "SENSING_SETDRAGMODE": "setze Ziehbarkeit auf %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ziehbar", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nicht ziehbar", - "SENSING_LOUDNESS": "Lautstärke", - "SENSING_LOUD": "laut?", - "SENSING_TIMER": "Stoppuhr", - "SENSING_RESETTIMER": "setze Stoppuhr zurück", - "SENSING_OF": "%1 von %2", - "SENSING_OF_XPOSITION": "x-Position", - "SENSING_OF_YPOSITION": "y-Position", - "SENSING_OF_DIRECTION": "Richtung", - "SENSING_OF_COSTUMENUMBER": "Kostümnummer", - "SENSING_OF_COSTUMENAME": "Kostümname", - "SENSING_OF_SIZE": "Größe", - "SENSING_OF_VOLUME": "Lautstärke", - "SENSING_OF_BACKDROPNUMBER": "Bühnenbildnummer", - "SENSING_OF_BACKDROPNAME": "Bühnenbildname", - "SENSING_OF_STAGE": "Bühne", - "SENSING_CURRENT": "%1 im Moment", - "SENSING_CURRENT_YEAR": "Jahr", - "SENSING_CURRENT_MONTH": "Monat", - "SENSING_CURRENT_DATE": "Datum", - "SENSING_CURRENT_DAYOFWEEK": "Wochentag", - "SENSING_CURRENT_HOUR": "Stunde", - "SENSING_CURRENT_MINUTE": "Minute", - "SENSING_CURRENT_SECOND": "Sekunde", - "SENSING_DAYSSINCE2000": "Tage seit 2000", - "SENSING_USERNAME": "Benutzername", - "SENSING_USERID": "Benutzer-ID", - "SOUND_PLAY": "spiele Klang %1", - "SOUND_PLAYUNTILDONE": "spiele Klang %1 ganz", - "SOUND_STOPALLSOUNDS": "stoppe alle Klänge", - "SOUND_SETEFFECTO": "setze Effekt %1 auf %2", - "SOUND_CHANGEEFFECTBY": "ändere Effekt %1 um %2", - "SOUND_CLEAREFFECTS": "schalte Klangeffekte aus", - "SOUND_EFFECTS_PITCH": "Höhe", - "SOUND_EFFECTS_PAN": "Aussteuern links/rechts", - "SOUND_CHANGEVOLUMEBY": "ändere Lautstärke um %1", - "SOUND_SETVOLUMETO": "setze Lautstärke auf %1%", - "SOUND_VOLUME": "Lautstärke", - "SOUND_RECORD": "zeichne auf...", - "CATEGORY_MOTION": "Bewegung", - "CATEGORY_LOOKS": "Aussehen", - "CATEGORY_SOUND": "Klang", - "CATEGORY_EVENTS": "Ereignisse", - "CATEGORY_CONTROL": "Steuerung", - "CATEGORY_SENSING": "Fühlen", - "CATEGORY_OPERATORS": "Operatoren", - "CATEGORY_VARIABLES": "Variablen", - "CATEGORY_MYBLOCKS": "Meine Blöcke", - "DUPLICATE": "Duplizieren", - "DELETE": "Löschen", - "ADD_COMMENT": "Kommentar hinzufügen", - "REMOVE_COMMENT": "Kommentar entfernen", - "DELETE_BLOCK": "Lösche Block", - "DELETE_X_BLOCKS": "Lösche %1 Blöcke", - "DELETE_ALL_BLOCKS": "Alle %1 Blöcke löschen?", - "CLEAN_UP": "Blöcke aufräumen", - "HELP": "Hilfe", - "UNDO": "Rückgängig", - "REDO": "Wiederherstellen", - "EDIT_PROCEDURE": "Bearbeiten", - "SHOW_PROCEDURE_DEFINITION": "Gehe zur Definition", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sag etwas...", - "COLOUR_HUE_LABEL": "Farbe", - "COLOUR_SATURATION_LABEL": "Sättigung", - "COLOUR_BRIGHTNESS_LABEL": "Helligkeit", - "CHANGE_VALUE_TITLE": "Ändere Wert", - "RENAME_VARIABLE": "Benenne die Variable um", - "RENAME_VARIABLE_TITLE": "Benenne alle Variablen mit Namen \"%1\" um in:", - "RENAME_VARIABLE_MODAL_TITLE": "Variable umbenennen", - "NEW_VARIABLE": "Neue Variable", - "NEW_VARIABLE_TITLE": "Neuer Variablenname:", - "VARIABLE_MODAL_TITLE": "Neue Variable", - "VARIABLE_ALREADY_EXISTS": "Eine Variable mit dem Namen \"%1\" existiert bereits.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Eine Variable mit dem Namen \"%1\" existiert bereits als Variable des Typs \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Entferne alle %1 Nutzungen der Variable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Die Variable \"%1\" kann nicht gelöscht werden, weil sie Teil der Definition der Funktion \"%2\" ist.", - "DELETE_VARIABLE": "Lösche die Variable \"%1\"", - "NEW_PROCEDURE": "Neuer Block", - "PROCEDURE_ALREADY_EXISTS": "Eine Prozedur mit dem Namen \"%1\" existiert bereits.", - "PROCEDURE_DEFAULT_NAME": "Blockname", - "NEW_LIST": "Neue Liste", - "NEW_LIST_TITLE": "Neuer Listenname:", - "LIST_MODAL_TITLE": "Neue Liste", - "LIST_ALREADY_EXISTS": "Eine Liste mit dem Namen \"%1\" existiert bereits", - "RENAME_LIST_TITLE": "Benenne alle Listen mit Namen \"%1\" um in:", - "RENAME_LIST_MODAL_TITLE": "Liste umbenennen", - "DEFAULT_LIST_ITEM": "Ding", - "DELETE_LIST": "Lösche die Liste \"%1\"", - "RENAME_LIST": "Benenne die Liste um", - "NEW_BROADCAST_MESSAGE": "Neue Nachricht", - "NEW_BROADCAST_MESSAGE_TITLE": "Neuer Nachrichtentext:", - "BROADCAST_MODAL_TITLE": "Neue Nachricht", - "DEFAULT_BROADCAST_MESSAGE_NAME": "Nachricht1" -}; - -Blockly.ScratchMsgs.locales["et"] = -{ - "CONTROL_FOREVER": "korda lõputult", - "CONTROL_REPEAT": "korda %1 korda", - "CONTROL_IF": "kui %1 siis", - "CONTROL_ELSE": "muidu", - "CONTROL_STOP": "stopp", - "CONTROL_STOP_ALL": "kõik", - "CONTROL_STOP_THIS": "see skript", - "CONTROL_STOP_OTHER": "teised spraidi skriptid", - "CONTROL_WAIT": "oota %1 sek", - "CONTROL_WAITUNTIL": "oota kuni %1", - "CONTROL_REPEATUNTIL": "korda kuni %1", - "CONTROL_WHILE": "kui %1", - "CONTROL_FOREACH": "iga %1 jaoks %2-s", - "CONTROL_STARTASCLONE": "kui alustan kloonina", - "CONTROL_CREATECLONEOF": "klooni %1", - "CONTROL_CREATECLONEOF_MYSELF": "ennast", - "CONTROL_DELETETHISCLONE": "eemalda see kloon", - "CONTROL_COUNTER": "loendur", - "CONTROL_INCRCOUNTER": "suurenda loendurit", - "CONTROL_CLEARCOUNTER": "nulli loendur", - "CONTROL_ALLATONCE": "kõik korraga", - "DATA_SETVARIABLETO": "võta %1 = %2", - "DATA_CHANGEVARIABLEBY": "muuda %1 %2 võrra", - "DATA_SHOWVARIABLE": "näita muutujat %1", - "DATA_HIDEVARIABLE": "peida muutuja %1", - "DATA_ADDTOLIST": "lisa %1 loendisse %2", - "DATA_DELETEOFLIST": "eemalda %1 loendist %2", - "DATA_DELETEALLOFLIST": "eemalda kõik loendist %1", - "DATA_INSERTATLIST": "sisesta %1 kohale %2 loendis %3", - "DATA_REPLACEITEMOFLIST": "asenda väärtus %1 loendis %2 %3 -ga", - "DATA_ITEMOFLIST": "%1 loendis %2", - "DATA_ITEMNUMOFLIST": "%1 jrk nr loendis %2", - "DATA_LENGTHOFLIST": "%1 pikkus", - "DATA_LISTCONTAINSITEM": "%1 sisaldab %2?", - "DATA_SHOWLIST": "näita loendit %1", - "DATA_HIDELIST": "peida loend %1", - "DATA_INDEX_ALL": "kõik", - "DATA_INDEX_LAST": "viimane", - "DATA_INDEX_RANDOM": "juhuslik", - "EVENT_WHENFLAGCLICKED": "kui klõpsata %1", - "EVENT_WHENTHISSPRITECLICKED": "kui spraiti klõpsata", - "EVENT_WHENSTAGECLICKED": "kui lava klõpsata", - "EVENT_WHENTOUCHINGOBJECT": "kui sprait puudutab %1", - "EVENT_WHENBROADCASTRECEIVED": "kui saan teate %1", - "EVENT_WHENBACKDROPSWITCHESTO": "kui taustaks saab %1", - "EVENT_WHENGREATERTHAN": "kui %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "taimer", - "EVENT_WHENGREATERTHAN_LOUDNESS": "valjus", - "EVENT_BROADCAST": "teata %1", - "EVENT_BROADCASTANDWAIT": "teata %1 ja oota", - "EVENT_WHENKEYPRESSED": "kui klõpsata klahvi %1", - "EVENT_WHENKEYPRESSED_SPACE": "tühik", - "EVENT_WHENKEYPRESSED_LEFT": "nool vasakule", - "EVENT_WHENKEYPRESSED_RIGHT": "nool paremale", - "EVENT_WHENKEYPRESSED_DOWN": "nool alla", - "EVENT_WHENKEYPRESSED_UP": "nool üles", - "EVENT_WHENKEYPRESSED_ANY": "mõni", - "LOOKS_SAYFORSECS": "ütle %1 %2 sek", - "LOOKS_SAY": "ütle %1", - "LOOKS_HELLO": "Tere!", - "LOOKS_THINKFORSECS": "mõtle %1 %2 sek", - "LOOKS_THINK": "mõtle %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "näita", - "LOOKS_HIDE": "peida", - "LOOKS_HIDEALLSPRITES": "peida kõik spraidid", - "LOOKS_EFFECT_COLOR": "värv", - "LOOKS_EFFECT_FISHEYE": "kalasilm", - "LOOKS_EFFECT_WHIRL": "pööris", - "LOOKS_EFFECT_PIXELATE": "pikseldus", - "LOOKS_EFFECT_MOSAIC": "mosaiik", - "LOOKS_EFFECT_BRIGHTNESS": "heledus", - "LOOKS_EFFECT_GHOST": "kummitus", - "LOOKS_CHANGEEFFECTBY": "muuda efekti %1 %2 võrra", - "LOOKS_SETEFFECTTO": "pane %1 efekt %2", - "LOOKS_CLEARGRAPHICEFFECTS": "tühista graafikaefektid", - "LOOKS_CHANGESIZEBY": "muuda suurust %1 võrra", - "LOOKS_SETSIZETO": "võta suuruseks %1 %", - "LOOKS_SIZE": "suurus", - "LOOKS_CHANGESTRETCHBY": "muuda ulatust %1 võrra", - "LOOKS_SETSTRETCHTO": "võta ulatuseks %1 %", - "LOOKS_SWITCHCOSTUMETO": "võta kostüüm %1", - "LOOKS_NEXTCOSTUME": "järgmine kostüüm", - "LOOKS_SWITCHBACKDROPTO": "võta taust %1", - "LOOKS_GOTOFRONTBACK": "mine kihile %1", - "LOOKS_GOTOFRONTBACK_FRONT": "esiplaan", - "LOOKS_GOTOFRONTBACK_BACK": "tagaplaan", - "LOOKS_GOFORWARDBACKWARDLAYERS": "mine %1 %2 kihti", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ettepoole", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "tahapoole", - "LOOKS_BACKDROPNUMBERNAME": "tausta %1", - "LOOKS_COSTUMENUMBERNAME": "kostüümi %1", - "LOOKS_NUMBERNAME_NUMBER": "number", - "LOOKS_NUMBERNAME_NAME": "nimi", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "võta taust %1 ja oota", - "LOOKS_NEXTBACKDROP_BLOCK": "järgmine taust", - "LOOKS_NEXTBACKDROP": "järgmine taust", - "LOOKS_PREVIOUSBACKDROP": "eelmine taust", - "LOOKS_RANDOMBACKDROP": "juhuslik taust", - "MOTION_MOVESTEPS": "liigu %1 punkti", - "MOTION_TURNLEFT": "pööra %1 %2 kraadi", - "MOTION_TURNRIGHT": "pööra %1 %2 kraadi", - "MOTION_POINTINDIRECTION": "osuta suunas %1", - "MOTION_POINTTOWARDS": "osuta %1-le", - "MOTION_POINTTOWARDS_POINTER": "hiirekursor", - "MOTION_POINTTOWARDS_RANDOM": "juhusuund", - "MOTION_GOTO": "mine %1", - "MOTION_GOTO_POINTER": "hiirekursor", - "MOTION_GOTO_RANDOM": "juhuslik asukoht", - "MOTION_GOTOXY": "mine x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "liugle %1 sekundiga x: %2 y: %3", - "MOTION_GLIDETO": "liugle %1 sekundiga %2", - "MOTION_GLIDETO_POINTER": "hiirekursor", - "MOTION_GLIDETO_RANDOM": "juhuslik asukoht", - "MOTION_CHANGEXBY": "muuda x %1 võrra", - "MOTION_SETX": "võta x %1", - "MOTION_CHANGEYBY": "muuda y %1 võrra", - "MOTION_SETY": "võta y %1", - "MOTION_IFONEDGEBOUNCE": "kui äärel, põrka", - "MOTION_SETROTATIONSTYLE": "määra pööramisstiil %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vasak-parem", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ei pöördu", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "suvaline", - "MOTION_XPOSITION": "x", - "MOTION_YPOSITION": "y", - "MOTION_DIRECTION": "suund", - "MOTION_SCROLLRIGHT": "keri paremale %1", - "MOTION_SCROLLUP": "keri üles %1", - "MOTION_ALIGNSCENE": "joonda stseen %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "alla vasakule", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "alla paremale", - "MOTION_ALIGNSCENE_MIDDLE": "keskele", - "MOTION_ALIGNSCENE_TOPLEFT": "üles vasakule", - "MOTION_ALIGNSCENE_TOPRIGHT": "üles paremale", - "MOTION_XSCROLL": "x kerimine", - "MOTION_YSCROLL": "y kerimine", - "MOTION_STAGE_SELECTED": "Valitud on Lava: liikumiskäsud puuduvad", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "juhuarv %1 kuni %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 ja %2", - "OPERATORS_OR": "%1 või %2", - "OPERATORS_NOT": "mitte %1", - "OPERATORS_JOIN": "%1 & %2", - "OPERATORS_JOIN_APPLE": "õun", - "OPERATORS_JOIN_BANANA": "banaan", - "OPERATORS_LETTEROF": "märk %1 sõnas %2", - "OPERATORS_LETTEROF_APPLE": "õ", - "OPERATORS_LENGTH": "%1 pikkus", - "OPERATORS_CONTAINS": "%1 sisaldab %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "ümarda %1", - "OPERATORS_MATHOP": "%2 %1", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "floor", - "OPERATORS_MATHOP_CEILING": "ceiling", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "defineeri %1", - "SENSING_TOUCHINGOBJECT": "puudutab %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "hiirekursor", - "SENSING_TOUCHINGOBJECT_EDGE": "serv", - "SENSING_TOUCHINGCOLOR": "puudutab värvi %1?", - "SENSING_COLORISTOUCHINGCOLOR": "värv %1 puudutab värvi %2?", - "SENSING_DISTANCETO": "kaugus %1-st", - "SENSING_DISTANCETO_POINTER": "hiirekursor", - "SENSING_ASKANDWAIT": "küsi %1 ja oota", - "SENSING_ASK_TEXT": "Mis Su nimi on?", - "SENSING_ANSWER": "vastus", - "SENSING_KEYPRESSED": "klahv %1 all?", - "SENSING_MOUSEDOWN": "hiir all?", - "SENSING_MOUSEX": "hiire x", - "SENSING_MOUSEY": "hiire y", - "SENSING_SETDRAGMODE": "võta lohistatavus = %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "lohistatav", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "pole lohistatav", - "SENSING_LOUDNESS": "valjus", - "SENSING_LOUD": "väga vali?", - "SENSING_TIMER": "taimer", - "SENSING_RESETTIMER": "nulli taimer", - "SENSING_OF": "%2 %1", - "SENSING_OF_XPOSITION": "x", - "SENSING_OF_YPOSITION": "y", - "SENSING_OF_DIRECTION": "suund", - "SENSING_OF_COSTUMENUMBER": "kostüümi nr", - "SENSING_OF_COSTUMENAME": "kostüümi nimi", - "SENSING_OF_SIZE": "suurus", - "SENSING_OF_VOLUME": "helitugevus", - "SENSING_OF_BACKDROPNUMBER": "tausta nr", - "SENSING_OF_BACKDROPNAME": "tausta nimi", - "SENSING_OF_STAGE": "Lava", - "SENSING_CURRENT": "hetke %1", - "SENSING_CURRENT_YEAR": "aasta", - "SENSING_CURRENT_MONTH": "kuu", - "SENSING_CURRENT_DATE": "kuupäev", - "SENSING_CURRENT_DAYOFWEEK": "nädalapäev", - "SENSING_CURRENT_HOUR": "tunnid", - "SENSING_CURRENT_MINUTE": "minutid", - "SENSING_CURRENT_SECOND": "sekundid", - "SENSING_DAYSSINCE2000": "päevi alates 2000", - "SENSING_USERNAME": "kasutajanimi", - "SENSING_USERID": "kasutaja ID", - "SOUND_PLAY": "alusta heli %1", - "SOUND_PLAYUNTILDONE": "mängi heli %1 kuni lõpuni", - "SOUND_STOPALLSOUNDS": "peata kõik helid", - "SOUND_SETEFFECTO": "pane %1 efekt %2", - "SOUND_CHANGEEFFECTBY": "muuda efekti %1 %2 võrra", - "SOUND_CLEAREFFECTS": "vaigista heliefektid", - "SOUND_EFFECTS_PITCH": "helikõrgus", - "SOUND_EFFECTS_PAN": "heli vasakul/paremal", - "SOUND_CHANGEVOLUMEBY": "muuda helitugevust %1 võrra", - "SOUND_SETVOLUMETO": "võta helitugevuseks %1%", - "SOUND_VOLUME": "helitugevus", - "SOUND_RECORD": "salvesta...", - "CATEGORY_MOTION": "Liikumine", - "CATEGORY_LOOKS": "Välimus", - "CATEGORY_SOUND": "Helid", - "CATEGORY_EVENTS": "Sündmused", - "CATEGORY_CONTROL": "Juhtimine", - "CATEGORY_SENSING": "Andurid", - "CATEGORY_OPERATORS": "Tehted", - "CATEGORY_VARIABLES": "Muutujad", - "CATEGORY_MYBLOCKS": "Minu Plokid", - "DUPLICATE": "Paljunda", - "DELETE": "Kustuta", - "ADD_COMMENT": "Lisa kommentaar", - "REMOVE_COMMENT": "Eemalda kommentaar", - "DELETE_BLOCK": "Eemalda plokk", - "DELETE_X_BLOCKS": "Eemalda %1 plokki", - "DELETE_ALL_BLOCKS": "Eemalda kõik %1 plokki?", - "CLEAN_UP": "Korrasta plokid", - "HELP": "Abi", - "UNDO": "Võta tagasi", - "REDO": "Tee uuesti", - "EDIT_PROCEDURE": "Redigeeri", - "SHOW_PROCEDURE_DEFINITION": "Mine definitsiooni juurde", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Ütle midagi", - "COLOUR_HUE_LABEL": "Värv", - "COLOUR_SATURATION_LABEL": "Küllastus", - "COLOUR_BRIGHTNESS_LABEL": "Heledus", - "CHANGE_VALUE_TITLE": "Muuda väärtust:", - "RENAME_VARIABLE": "Muuda muutuja nime", - "RENAME_VARIABLE_TITLE": "Nimeta kõik \"%1\" muutujad nimega:", - "RENAME_VARIABLE_MODAL_TITLE": "Muuda muutuja nime", - "NEW_VARIABLE": "Loo muutuja", - "NEW_VARIABLE_TITLE": "Uue muutuja nimi:", - "VARIABLE_MODAL_TITLE": "Uus muutuja", - "VARIABLE_ALREADY_EXISTS": "Muutuja nimega \"%1\" on juba olemas.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Muutuja nimi \"%1\" on juba kasutusel \"%2\" tüüpi muutujal.", - "DELETE_VARIABLE_CONFIRMATION": "Eemaldada %1 muutuja \"%2\" kasutamist?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Muutujat \"%1\" ei saa eemaldada, sest see on osa funktsiooni \"%2\" definitsioonist.", - "DELETE_VARIABLE": "Eemalda muutuja \"%1\"", - "NEW_PROCEDURE": "Loo Plokk", - "PROCEDURE_ALREADY_EXISTS": "Protseduur nimega \"%1\" on juba olemas.", - "PROCEDURE_DEFAULT_NAME": "ploki nimi", - "NEW_LIST": "Loo Loend", - "NEW_LIST_TITLE": "Uue loendi nimi:", - "LIST_MODAL_TITLE": "Uus loend", - "LIST_ALREADY_EXISTS": "Loend nimega \"%1\" on juba olemas.", - "RENAME_LIST_TITLE": "Nimeta kõik \"%1\" loendid nimega:", - "RENAME_LIST_MODAL_TITLE": "Muuda loendi nime", - "DEFAULT_LIST_ITEM": "asi", - "DELETE_LIST": "Eemalda loend \"%1\"", - "RENAME_LIST": "Muuda loendi nime", - "NEW_BROADCAST_MESSAGE": "Uus teade", - "NEW_BROADCAST_MESSAGE_TITLE": "Uue teate nimi:", - "BROADCAST_MODAL_TITLE": "Uus teade", - "DEFAULT_BROADCAST_MESSAGE_NAME": "teade1" -}; - -Blockly.ScratchMsgs.locales["el"] = -{ - "CONTROL_FOREVER": "για πάντα", - "CONTROL_REPEAT": "επανάλαβε %1", - "CONTROL_IF": "εάν %1 τότε", - "CONTROL_ELSE": "αλλιώς", - "CONTROL_STOP": "σταμάτησε", - "CONTROL_STOP_ALL": "όλα", - "CONTROL_STOP_THIS": "αυτό το σενάριο", - "CONTROL_STOP_OTHER": "άλλα σενάρια σε αυτό το αντικείμενο", - "CONTROL_WAIT": "περίμενε %1 δευτερόλεπτα", - "CONTROL_WAITUNTIL": "περίμενε ώσπου %1", - "CONTROL_REPEATUNTIL": "επανάλαβε ώσπου %1", - "CONTROL_WHILE": "όσο %1", - "CONTROL_FOREACH": "για κάθε %1 στο %2", - "CONTROL_STARTASCLONE": "όταν ξεκινήσω ως κλώνος", - "CONTROL_CREATECLONEOF": "δημιούργησε κλώνο του %1", - "CONTROL_CREATECLONEOF_MYSELF": "εαυτού μου", - "CONTROL_DELETETHISCLONE": "διάγραψε αυτόν τον κλώνο", - "CONTROL_COUNTER": "μετρητής", - "CONTROL_INCRCOUNTER": "αύξηση μετρητή", - "CONTROL_CLEARCOUNTER": "καθαρισμός μετρητή", - "CONTROL_ALLATONCE": "μονομιάς", - "DATA_SETVARIABLETO": "όρισε %1 σε %2", - "DATA_CHANGEVARIABLEBY": "άλλαξε %1 κατά %2", - "DATA_SHOWVARIABLE": "εμφάνισε μεταβλητή %1", - "DATA_HIDEVARIABLE": "απόκρυψε μεταβλητή %1", - "DATA_ADDTOLIST": "πρόσθεσε %1 στη λίστα %2", - "DATA_DELETEOFLIST": "διάγραψε %1 από λίστα %2", - "DATA_DELETEALLOFLIST": "διαγραφή όλων από λίστα %1", - "DATA_INSERTATLIST": "βάλε %1 στη θέση %2 λίστας %3", - "DATA_REPLACEITEMOFLIST": "αντικατάστησε στοιχείο %1 λίστας %2 με %3", - "DATA_ITEMOFLIST": "στοιχείο %1 λίστας %2", - "DATA_ITEMNUMOFLIST": "# στοιχείου %1 σε %2", - "DATA_LENGTHOFLIST": "μήκος λίστας %1", - "DATA_LISTCONTAINSITEM": "%1 περιέχει %2;", - "DATA_SHOWLIST": "εμφάνισε λίστα %1", - "DATA_HIDELIST": "απόκρυψε λίστα %1", - "DATA_INDEX_ALL": "όλα", - "DATA_INDEX_LAST": "τελευταίο", - "DATA_INDEX_RANDOM": "τυχαίο", - "EVENT_WHENFLAGCLICKED": "όταν γίνει κλικ σε %1", - "EVENT_WHENTHISSPRITECLICKED": "όταν γίνει κλικ σε αυτό το αντικείμενο", - "EVENT_WHENSTAGECLICKED": "όταν γίνει κλικ στη σκηνή", - "EVENT_WHENTOUCHINGOBJECT": "όταν αυτό το αντικείμενο αγγίξει το %1", - "EVENT_WHENBROADCASTRECEIVED": "όταν λάβω %1", - "EVENT_WHENBACKDROPSWITCHESTO": "όταν το υπόβαθρο αλλάξει σε %1", - "EVENT_WHENGREATERTHAN": "όταν %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "χρονομέτρο", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ένταση", - "EVENT_BROADCAST": "μετάδωσε %1", - "EVENT_BROADCASTANDWAIT": "μετάδωσε %1 και περίμενε", - "EVENT_WHENKEYPRESSED": "όταν πατηθεί πλήκτρο %1", - "EVENT_WHENKEYPRESSED_SPACE": "διάστημα", - "EVENT_WHENKEYPRESSED_LEFT": "αριστερό βέλος", - "EVENT_WHENKEYPRESSED_RIGHT": "δεξί βέλος", - "EVENT_WHENKEYPRESSED_DOWN": "κάτω βέλος", - "EVENT_WHENKEYPRESSED_UP": "πάνω βέλος", - "EVENT_WHENKEYPRESSED_ANY": "οποιοδήποτε", - "LOOKS_SAYFORSECS": "πες %1 για %2 δευτερόλεπτα", - "LOOKS_SAY": "πες %1", - "LOOKS_HELLO": "Γεια!", - "LOOKS_THINKFORSECS": "σκέψου %1 για %2 δευτερόλεπτα", - "LOOKS_THINK": "σκέψου %1", - "LOOKS_HMM": "Χμμ...", - "LOOKS_SHOW": "εμφανίσου", - "LOOKS_HIDE": "εξαφανίσου", - "LOOKS_HIDEALLSPRITES": "απόκρυψη όλων των αντικειμένων", - "LOOKS_EFFECT_COLOR": "χρώματος", - "LOOKS_EFFECT_FISHEYE": "κυρτότητας", - "LOOKS_EFFECT_WHIRL": "δίνης", - "LOOKS_EFFECT_PIXELATE": "εικονοστοιχειοποίησης", - "LOOKS_EFFECT_MOSAIC": "ψηφιδωτού", - "LOOKS_EFFECT_BRIGHTNESS": "φωτεινότητας", - "LOOKS_EFFECT_GHOST": "φαντάσματος", - "LOOKS_CHANGEEFFECTBY": "άλλαξε εφέ %1 κατά %2", - "LOOKS_SETEFFECTTO": "όρισε εφέ %1 σε %2", - "LOOKS_CLEARGRAPHICEFFECTS": "επανάφερε εφέ γραφικών", - "LOOKS_CHANGESIZEBY": "άλλαξε μέγεθος κατά %1", - "LOOKS_SETSIZETO": "όρισε μέγεθος σε %1 %", - "LOOKS_SIZE": "μέγεθος", - "LOOKS_CHANGESTRETCHBY": "άλλαξε τέντωμα κατά %1", - "LOOKS_SETSTRETCHTO": "όρισε τέντωμα σε %1 %", - "LOOKS_SWITCHCOSTUMETO": "άλλαξε ενδυμασία σε %1", - "LOOKS_NEXTCOSTUME": "επόμενη ενδυμασία", - "LOOKS_SWITCHBACKDROPTO": "άλλαξε υπόβαθρο σε %1", - "LOOKS_GOTOFRONTBACK": "πήγαινε σε επίπεδο %1", - "LOOKS_GOTOFRONTBACK_FRONT": "προσκήνιο", - "LOOKS_GOTOFRONTBACK_BACK": "υπόβαθρο", - "LOOKS_GOFORWARDBACKWARDLAYERS": "πήγαινε %1 %2 επίπεδα", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "μπροστά", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "πίσω", - "LOOKS_BACKDROPNUMBERNAME": "υπόβαθρο %1", - "LOOKS_COSTUMENUMBERNAME": "ενδυμασία %1", - "LOOKS_NUMBERNAME_NUMBER": "νούμερο", - "LOOKS_NUMBERNAME_NAME": "όνομα", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "άλλαξε υπόβαθρο σε %1 και περίμενε", - "LOOKS_NEXTBACKDROP_BLOCK": "επόμενο υπόβαθρο", - "LOOKS_NEXTBACKDROP": "επόμενο υπόβαθρο", - "LOOKS_PREVIOUSBACKDROP": "προηγούμενο υπόβαθρο", - "LOOKS_RANDOMBACKDROP": "τυχαίο υπόβαθρο", - "MOTION_MOVESTEPS": "κινήσου %1 βήματα", - "MOTION_TURNLEFT": "στρίψε %1 %2 μοίρες", - "MOTION_TURNRIGHT": "στρίψε %1 %2 μοίρες", - "MOTION_POINTINDIRECTION": "δείξε προς κατεύθυνση %1", - "MOTION_POINTTOWARDS": "δείξε προς %1", - "MOTION_POINTTOWARDS_POINTER": "δείκτη ποντικιού", - "MOTION_POINTTOWARDS_RANDOM": "τυχαία κατεύθυνση", - "MOTION_GOTO": "πήγαινε σε %1", - "MOTION_GOTO_POINTER": "δείκτη ποντικιού", - "MOTION_GOTO_RANDOM": "τυχαία θέση", - "MOTION_GOTOXY": "πήγαινε σε θέση x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "ολίσθησε για %1 δευτ. στη θέση x: %2 y: %3", - "MOTION_GLIDETO": "ολίσθησε για %1 δευτ. στη θέση %2", - "MOTION_GLIDETO_POINTER": "δείκτη ποντικιού", - "MOTION_GLIDETO_RANDOM": "τυχαία θέση", - "MOTION_CHANGEXBY": "άλλαξε x κατά %1", - "MOTION_SETX": "όρισε x σε %1", - "MOTION_CHANGEYBY": "άλλαξε y κατά %1", - "MOTION_SETY": "όρισε y σε %1", - "MOTION_IFONEDGEBOUNCE": "εάν σε όριο, αναπήδησε", - "MOTION_SETROTATIONSTYLE": "όρισε τρόπο περιστροφής %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "αριστερά-δεξιά", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "μην περιστρέψεις", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "τριγύρω", - "MOTION_XPOSITION": "θέση x", - "MOTION_YPOSITION": "θέση y", - "MOTION_DIRECTION": "κατεύθυνση", - "MOTION_SCROLLRIGHT": "κύλιση δεξιά %1", - "MOTION_SCROLLUP": "κύλιση πάνω %1", - "MOTION_ALIGNSCENE": "ευθυγράμμιση σκηνής %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "κάτω-αριστερά", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "κάτω-δεξιά", - "MOTION_ALIGNSCENE_MIDDLE": "μέση", - "MOTION_ALIGNSCENE_TOPLEFT": "πάνω-αριστερά", - "MOTION_ALIGNSCENE_TOPRIGHT": "πάνω-δεξιά", - "MOTION_XSCROLL": "κύλιση x", - "MOTION_YSCROLL": "κύλιση y", - "MOTION_STAGE_SELECTED": "Σκηνή επιλεγμένη: χωρίς εντολές κίνησης", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "επίλεξε τυχαίο %1 εώς %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 και %2", - "OPERATORS_OR": "%1 ή %2", - "OPERATORS_NOT": "όχι %1", - "OPERATORS_JOIN": "ένωσε %1 %2", - "OPERATORS_JOIN_APPLE": "μήλο", - "OPERATORS_JOIN_BANANA": "μπανάνα", - "OPERATORS_LETTEROF": "γράμμα %1 του %2", - "OPERATORS_LETTEROF_APPLE": "ο", - "OPERATORS_LENGTH": "μήκος του %1", - "OPERATORS_CONTAINS": "%1 περιλαμβάνει %2;", - "OPERATORS_MOD": "ακέρ. υπόλ. %1 δια %2", - "OPERATORS_ROUND": "στρογγυλ. %1", - "OPERATORS_MATHOP": "%1 %2", - "OPERATORS_MATHOP_ABS": "απόλυτο", - "OPERATORS_MATHOP_FLOOR": "στρογγυλ. κάτω", - "OPERATORS_MATHOP_CEILING": "στρογγυλ. άνω", - "OPERATORS_MATHOP_SQRT": "τετρ. ρίζα", - "OPERATORS_MATHOP_SIN": "ημ", - "OPERATORS_MATHOP_COS": "συν", - "OPERATORS_MATHOP_TAN": "εφ", - "OPERATORS_MATHOP_ASIN": "τοξημ", - "OPERATORS_MATHOP_ACOS": "τοξσυν", - "OPERATORS_MATHOP_ATAN": "τοξεφ", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "ορισμός %1", - "SENSING_TOUCHINGOBJECT": "αγγίζει %1;", - "SENSING_TOUCHINGOBJECT_POINTER": "δείκτη ποντικιού", - "SENSING_TOUCHINGOBJECT_EDGE": "όριο", - "SENSING_TOUCHINGCOLOR": "αγγίζει χρώμα %1;", - "SENSING_COLORISTOUCHINGCOLOR": "χρώμα %1 αγγίζει χρώμα %2;", - "SENSING_DISTANCETO": "απόσταση έως %1", - "SENSING_DISTANCETO_POINTER": "δείκτη ποντικιού", - "SENSING_ASKANDWAIT": "ρώτησε %1 και περίμενε", - "SENSING_ASK_TEXT": "Πώς σε λένε;", - "SENSING_ANSWER": "απάντηση", - "SENSING_KEYPRESSED": "πατήθηκε πλήκτρο %1;", - "SENSING_MOUSEDOWN": "πατήθηκε πλήκτρο ποντικιού;", - "SENSING_MOUSEX": "x ποντικιού", - "SENSING_MOUSEY": "y ποντικιού", - "SENSING_SETDRAGMODE": "όρισε τρόπο συρσίματος %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "συρόμενο", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "μη συρόμενο", - "SENSING_LOUDNESS": "ένταση", - "SENSING_LOUD": "δυνατά;", - "SENSING_TIMER": "χρονόμετρο", - "SENSING_RESETTIMER": "μηδένισε χρονόμετρο", - "SENSING_OF": "%1 από %2", - "SENSING_OF_XPOSITION": "θέση x", - "SENSING_OF_YPOSITION": "θέση y", - "SENSING_OF_DIRECTION": "κατεύθυνση", - "SENSING_OF_COSTUMENUMBER": "# ενδυμασίας", - "SENSING_OF_COSTUMENAME": "όνομα ενδυμασίας", - "SENSING_OF_SIZE": "μέγεθος", - "SENSING_OF_VOLUME": "ένταση", - "SENSING_OF_BACKDROPNUMBER": "# υποβάθρου", - "SENSING_OF_BACKDROPNAME": "όνομα υποβάθρου", - "SENSING_OF_STAGE": "Σκηνή", - "SENSING_CURRENT": "τρέχων %1", - "SENSING_CURRENT_YEAR": "έτος", - "SENSING_CURRENT_MONTH": "μήνας", - "SENSING_CURRENT_DATE": "ημερομηνία", - "SENSING_CURRENT_DAYOFWEEK": "μέρα της εβδομάδας", - "SENSING_CURRENT_HOUR": "ώρα", - "SENSING_CURRENT_MINUTE": "λεπτό", - "SENSING_CURRENT_SECOND": "δευτερόλεπτο", - "SENSING_DAYSSINCE2000": "ημέρες από το 2000", - "SENSING_USERNAME": "όνομα χρήστη", - "SENSING_USERID": "αναγνωριστικό χρήστη", - "SOUND_PLAY": "παίξε τον ήχο %1", - "SOUND_PLAYUNTILDONE": "παίξε ήχο %1 μέχρι τέλους", - "SOUND_STOPALLSOUNDS": "σταμάτησε όλους τους ήχους", - "SOUND_SETEFFECTO": "όρισε εφέ %1 σε %2", - "SOUND_CHANGEEFFECTBY": "άλλαξε εφέ %1 κατά %2", - "SOUND_CLEAREFFECTS": "καθάρισε ηχητικά εφέ", - "SOUND_EFFECTS_PITCH": "τόνος", - "SOUND_EFFECTS_PAN": "μετατόπιση αριστερά/δεξιά", - "SOUND_CHANGEVOLUMEBY": "άλλαξε ένταση κατά %1", - "SOUND_SETVOLUMETO": "όρισε ένταση σε %1%", - "SOUND_VOLUME": "ένταση", - "SOUND_RECORD": "εγγραφή...", - "CATEGORY_MOTION": "Κίνηση", - "CATEGORY_LOOKS": "Όψεις", - "CATEGORY_SOUND": "Ήχος", - "CATEGORY_EVENTS": "Συμβάντα", - "CATEGORY_CONTROL": "Έλεγχος", - "CATEGORY_SENSING": "Αισθητήρες", - "CATEGORY_OPERATORS": "Τελεστές", - "CATEGORY_VARIABLES": "Μεταβλητές", - "CATEGORY_MYBLOCKS": "Οι Εντολές μου", - "DUPLICATE": "Διπλασιασμός", - "DELETE": "Διαγραφή", - "ADD_COMMENT": "Προσθήκη σχολίου", - "REMOVE_COMMENT": "Αφαίρεση σχολίου", - "DELETE_BLOCK": "Διαγραφή Εντολής", - "DELETE_X_BLOCKS": "Διαγραφή %1 Εντολών", - "DELETE_ALL_BLOCKS": "Διαγραφή όλων των %1 εντολών;", - "CLEAN_UP": "Τακτοποίησε Εντολές", - "HELP": "Βοήθεια", - "UNDO": "Αναίρεση", - "REDO": "Επανάληψη", - "EDIT_PROCEDURE": "Επεξεργασία", - "SHOW_PROCEDURE_DEFINITION": "Μετάβαση σε ορισμό", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Πες κάτι...", - "COLOUR_HUE_LABEL": "Χρώμα", - "COLOUR_SATURATION_LABEL": "Κορεσμός", - "COLOUR_BRIGHTNESS_LABEL": "Φωτεινότητα", - "CHANGE_VALUE_TITLE": "Αλλαγή τιμής:", - "RENAME_VARIABLE": "Μετονομασία μεταβλητής", - "RENAME_VARIABLE_TITLE": "Μετονομασία όλων των \"%1\" μεταβλητών σε:", - "RENAME_VARIABLE_MODAL_TITLE": "Μετονομασία Μεταβλητής", - "NEW_VARIABLE": "Δημιουργία Μεταβλητής", - "NEW_VARIABLE_TITLE": "Όνομα νέας μεταβλητής:", - "VARIABLE_MODAL_TITLE": "Νέα Μεταβλητή", - "VARIABLE_ALREADY_EXISTS": "Υπάρχει ήδη μια μεταβλητή με όνομα \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Υπάρχει ήδη μια μεταβλητή με όνομα \"%1\" για μια άλλη μεταβλητή τύπου \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Διαγραφή %1 χρήσεων της μεταβλητής \"%2\";", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Η μεταβλητή \"%1\" δεν μπορεί να διαγραφεί γιατί είναι μέρος του ορισμού της λειτουργίας \"%2\"", - "DELETE_VARIABLE": "Διαγραφή της μεταβλητής \"%1\"", - "NEW_PROCEDURE": "Δημιουργία Εντολής", - "PROCEDURE_ALREADY_EXISTS": "Υπάρχει ήδη μια διαδικασία με όνομα \"%1\".", - "PROCEDURE_DEFAULT_NAME": "όνομα εντολής", - "NEW_LIST": "Δημιουργία Λίστας", - "NEW_LIST_TITLE": "Όνομα νέας λίστας:", - "LIST_MODAL_TITLE": "Νέα Λίστα", - "LIST_ALREADY_EXISTS": "Υπάρχει ήδη μια λίστα με όνομα \"%1\".", - "RENAME_LIST_TITLE": "Μετονόμασε όλες τις λίστες \"%1\" σε:", - "RENAME_LIST_MODAL_TITLE": "Μετονομασία Λίστας", - "DEFAULT_LIST_ITEM": "πράγμα", - "DELETE_LIST": "Διάγραψε τη λίστα \"%1\"", - "RENAME_LIST": "Μετονομασία λίστας", - "NEW_BROADCAST_MESSAGE": "Νέο μήνυμα", - "NEW_BROADCAST_MESSAGE_TITLE": "Όνομα νέου μηνύματος:", - "BROADCAST_MODAL_TITLE": "Νέο μήνυμα", - "DEFAULT_BROADCAST_MESSAGE_NAME": "μήνυμα1" -}; - -Blockly.ScratchMsgs.locales["en"] = -{ - "CONTROL_FOREVER": "forever", - "CONTROL_REPEAT": "repeat %1", - "CONTROL_IF": "if %1 then", - "CONTROL_ELSE": "else", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "all", - "CONTROL_STOP_THIS": "this script", - "CONTROL_STOP_OTHER": "other scripts in sprite", - "CONTROL_WAIT": "wait %1 seconds", - "CONTROL_WAITUNTIL": "wait until %1", - "CONTROL_REPEATUNTIL": "repeat until %1", - "CONTROL_WHILE": "while %1", - "CONTROL_FOREACH": "for each %1 in %2", - "CONTROL_STARTASCLONE": "when I start as a clone", - "CONTROL_CREATECLONEOF": "create clone of %1", - "CONTROL_CREATECLONEOF_MYSELF": "myself", - "CONTROL_DELETETHISCLONE": "delete this clone", - "CONTROL_COUNTER": "counter", - "CONTROL_INCRCOUNTER": "increment counter", - "CONTROL_CLEARCOUNTER": "clear counter", - "CONTROL_ALLATONCE": "all at once", - "DATA_SETVARIABLETO": "set %1 to %2", - "DATA_CHANGEVARIABLEBY": "change %1 by %2", - "DATA_SHOWVARIABLE": "show variable %1", - "DATA_HIDEVARIABLE": "hide variable %1", - "DATA_ADDTOLIST": "add %1 to %2", - "DATA_DELETEOFLIST": "delete %1 of %2", - "DATA_DELETEALLOFLIST": "delete all of %1", - "DATA_INSERTATLIST": "insert %1 at %2 of %3", - "DATA_REPLACEITEMOFLIST": "replace item %1 of %2 with %3", - "DATA_ITEMOFLIST": "item %1 of %2", - "DATA_ITEMNUMOFLIST": "item # of %1 in %2", - "DATA_LENGTHOFLIST": "length of %1", - "DATA_LISTCONTAINSITEM": "%1 contains %2?", - "DATA_SHOWLIST": "show list %1", - "DATA_HIDELIST": "hide list %1", - "DATA_INDEX_ALL": "all", - "DATA_INDEX_LAST": "last", - "DATA_INDEX_RANDOM": "random", - "EVENT_WHENFLAGCLICKED": "when %1 clicked", - "EVENT_WHENTHISSPRITECLICKED": "when this sprite clicked", - "EVENT_WHENSTAGECLICKED": "when stage clicked", - "EVENT_WHENTOUCHINGOBJECT": "when this sprite touches %1", - "EVENT_WHENBROADCASTRECEIVED": "when I receive %1", - "EVENT_WHENBACKDROPSWITCHESTO": "when backdrop switches to %1", - "EVENT_WHENGREATERTHAN": "when %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "timer", - "EVENT_WHENGREATERTHAN_LOUDNESS": "loudness", - "EVENT_BROADCAST": "broadcast %1", - "EVENT_BROADCASTANDWAIT": "broadcast %1 and wait", - "EVENT_WHENKEYPRESSED": "when %1 key pressed", - "EVENT_WHENKEYPRESSED_SPACE": "space", - "EVENT_WHENKEYPRESSED_LEFT": "left arrow", - "EVENT_WHENKEYPRESSED_RIGHT": "right arrow", - "EVENT_WHENKEYPRESSED_DOWN": "down arrow", - "EVENT_WHENKEYPRESSED_UP": "up arrow", - "EVENT_WHENKEYPRESSED_ANY": "any", - "LOOKS_SAYFORSECS": "say %1 for %2 seconds", - "LOOKS_SAY": "say %1", - "LOOKS_HELLO": "Hello!", - "LOOKS_THINKFORSECS": "think %1 for %2 seconds", - "LOOKS_THINK": "think %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "show", - "LOOKS_HIDE": "hide", - "LOOKS_HIDEALLSPRITES": "hide all sprites", - "LOOKS_EFFECT_COLOR": "color", - "LOOKS_EFFECT_FISHEYE": "fisheye", - "LOOKS_EFFECT_WHIRL": "whirl", - "LOOKS_EFFECT_PIXELATE": "pixelate", - "LOOKS_EFFECT_MOSAIC": "mosaic", - "LOOKS_EFFECT_BRIGHTNESS": "brightness", - "LOOKS_EFFECT_GHOST": "ghost", - "LOOKS_CHANGEEFFECTBY": "change %1 effect by %2", - "LOOKS_SETEFFECTTO": "set %1 effect to %2", - "LOOKS_CLEARGRAPHICEFFECTS": "clear graphic effects", - "LOOKS_CHANGESIZEBY": "change size by %1", - "LOOKS_SETSIZETO": "set size to %1 %", - "LOOKS_SIZE": "size", - "LOOKS_CHANGESTRETCHBY": "change stretch by %1", - "LOOKS_SETSTRETCHTO": "set stretch to %1 %", - "LOOKS_SWITCHCOSTUMETO": "switch costume to %1", - "LOOKS_NEXTCOSTUME": "next costume", - "LOOKS_SWITCHBACKDROPTO": "switch backdrop to %1", - "LOOKS_GOTOFRONTBACK": "go to %1 layer", - "LOOKS_GOTOFRONTBACK_FRONT": "front", - "LOOKS_GOTOFRONTBACK_BACK": "back", - "LOOKS_GOFORWARDBACKWARDLAYERS": "go %1 %2 layers", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "forward", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "backward", - "LOOKS_BACKDROPNUMBERNAME": "backdrop %1", - "LOOKS_COSTUMENUMBERNAME": "costume %1", - "LOOKS_NUMBERNAME_NUMBER": "number", - "LOOKS_NUMBERNAME_NAME": "name", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "switch backdrop to %1 and wait", - "LOOKS_NEXTBACKDROP_BLOCK": "next backdrop", - "LOOKS_NEXTBACKDROP": "next backdrop", - "LOOKS_PREVIOUSBACKDROP": "previous backdrop", - "LOOKS_RANDOMBACKDROP": "random backdrop", - "MOTION_MOVESTEPS": "move %1 steps", - "MOTION_TURNLEFT": "turn %1 %2 degrees", - "MOTION_TURNRIGHT": "turn %1 %2 degrees", - "MOTION_POINTINDIRECTION": "point in direction %1", - "MOTION_POINTTOWARDS": "point towards %1", - "MOTION_POINTTOWARDS_POINTER": "mouse-pointer", - "MOTION_POINTTOWARDS_RANDOM": "random direction", - "MOTION_GOTO": "go to %1", - "MOTION_GOTO_POINTER": "mouse-pointer", - "MOTION_GOTO_RANDOM": "random position", - "MOTION_GOTOXY": "go to x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "glide %1 secs to x: %2 y: %3", - "MOTION_GLIDETO": "glide %1 secs to %2", - "MOTION_GLIDETO_POINTER": "mouse-pointer", - "MOTION_GLIDETO_RANDOM": "random position", - "MOTION_CHANGEXBY": "change x by %1", - "MOTION_SETX": "set x to %1", - "MOTION_CHANGEYBY": "change y by %1", - "MOTION_SETY": "set y to %1", - "MOTION_IFONEDGEBOUNCE": "if on edge, bounce", - "MOTION_SETROTATIONSTYLE": "set rotation style %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "left-right", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "don't rotate", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "all around", - "MOTION_XPOSITION": "x position", - "MOTION_YPOSITION": "y position", - "MOTION_DIRECTION": "direction", - "MOTION_SCROLLRIGHT": "scroll right %1", - "MOTION_SCROLLUP": "scroll up %1", - "MOTION_ALIGNSCENE": "align scene %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "bottom-left", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bottom-right", - "MOTION_ALIGNSCENE_MIDDLE": "middle", - "MOTION_ALIGNSCENE_TOPLEFT": "top-left", - "MOTION_ALIGNSCENE_TOPRIGHT": "top-right", - "MOTION_XSCROLL": "x scroll", - "MOTION_YSCROLL": "y scroll", - "MOTION_STAGE_SELECTED": "Stage selected: no motion blocks", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "pick random %1 to %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 and %2", - "OPERATORS_OR": "%1 or %2", - "OPERATORS_NOT": "not %1", - "OPERATORS_JOIN": "join %1 %2", - "OPERATORS_JOIN_APPLE": "apple", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "letter %1 of %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "length of %1", - "OPERATORS_CONTAINS": "%1 contains %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "round %1", - "OPERATORS_MATHOP": "%1 of %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "floor", - "OPERATORS_MATHOP_CEILING": "ceiling", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "define %1", - "SENSING_TOUCHINGOBJECT": "touching %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "mouse-pointer", - "SENSING_TOUCHINGOBJECT_EDGE": "edge", - "SENSING_TOUCHINGCOLOR": "touching color %1?", - "SENSING_COLORISTOUCHINGCOLOR": "color %1 is touching %2?", - "SENSING_DISTANCETO": "distance to %1", - "SENSING_DISTANCETO_POINTER": "mouse-pointer", - "SENSING_ASKANDWAIT": "ask %1 and wait", - "SENSING_ASK_TEXT": "What's your name?", - "SENSING_ANSWER": "answer", - "SENSING_KEYPRESSED": "key %1 pressed?", - "SENSING_MOUSEDOWN": "mouse down?", - "SENSING_MOUSEX": "mouse x", - "SENSING_MOUSEY": "mouse y", - "SENSING_SETDRAGMODE": "set drag mode %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "draggable", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "not draggable", - "SENSING_LOUDNESS": "loudness", - "SENSING_LOUD": "loud?", - "SENSING_TIMER": "timer", - "SENSING_RESETTIMER": "reset timer", - "SENSING_OF": "%1 of %2", - "SENSING_OF_XPOSITION": "x position", - "SENSING_OF_YPOSITION": "y position", - "SENSING_OF_DIRECTION": "direction", - "SENSING_OF_COSTUMENUMBER": "costume #", - "SENSING_OF_COSTUMENAME": "costume name", - "SENSING_OF_SIZE": "size", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "backdrop #", - "SENSING_OF_BACKDROPNAME": "backdrop name", - "SENSING_OF_STAGE": "Stage", - "SENSING_CURRENT": "current %1", - "SENSING_CURRENT_YEAR": "year", - "SENSING_CURRENT_MONTH": "month", - "SENSING_CURRENT_DATE": "date", - "SENSING_CURRENT_DAYOFWEEK": "day of week", - "SENSING_CURRENT_HOUR": "hour", - "SENSING_CURRENT_MINUTE": "minute", - "SENSING_CURRENT_SECOND": "second", - "SENSING_DAYSSINCE2000": "days since 2000", - "SENSING_USERNAME": "username", - "SENSING_USERID": "user id", - "SOUND_PLAY": "start sound %1", - "SOUND_PLAYUNTILDONE": "play sound %1 until done", - "SOUND_STOPALLSOUNDS": "stop all sounds", - "SOUND_SETEFFECTO": "set %1 effect to %2", - "SOUND_CHANGEEFFECTBY": "change %1 effect by %2", - "SOUND_CLEAREFFECTS": "clear sound effects", - "SOUND_EFFECTS_PITCH": "pitch", - "SOUND_EFFECTS_PAN": "pan left/right", - "SOUND_CHANGEVOLUMEBY": "change volume by %1", - "SOUND_SETVOLUMETO": "set volume to %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "record...", - "CATEGORY_MOTION": "Motion", - "CATEGORY_LOOKS": "Looks", - "CATEGORY_SOUND": "Sound", - "CATEGORY_EVENTS": "Events", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Sensing", - "CATEGORY_OPERATORS": "Operators", - "CATEGORY_VARIABLES": "Variables", - "CATEGORY_MYBLOCKS": "My Blocks", - "DUPLICATE": "Duplicate", - "DELETE": "Delete", - "ADD_COMMENT": "Add Comment", - "REMOVE_COMMENT": "Remove Comment", - "DELETE_BLOCK": "Delete Block", - "DELETE_X_BLOCKS": "Delete %1 Blocks", - "DELETE_ALL_BLOCKS": "Delete all %1 blocks?", - "CLEAN_UP": "Clean up Blocks", - "HELP": "Help", - "UNDO": "Undo", - "REDO": "Redo", - "EDIT_PROCEDURE": "Edit", - "SHOW_PROCEDURE_DEFINITION": "Go to definition", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", - "COLOUR_HUE_LABEL": "Color", - "COLOUR_SATURATION_LABEL": "Saturation", - "COLOUR_BRIGHTNESS_LABEL": "Brightness", - "CHANGE_VALUE_TITLE": "Change value:", - "RENAME_VARIABLE": "Rename variable", - "RENAME_VARIABLE_TITLE": "Rename all \"%1\" variables to:", - "RENAME_VARIABLE_MODAL_TITLE": "Rename Variable", - "NEW_VARIABLE": "Make a Variable", - "NEW_VARIABLE_TITLE": "New variable name:", - "VARIABLE_MODAL_TITLE": "New Variable", - "VARIABLE_ALREADY_EXISTS": "A variable named \"%1\" already exists.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named \"%1\" already exists for another variable of type \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the \"%2\" variable?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable \"%1\" because it's part of the definition of the function \"%2\"", - "DELETE_VARIABLE": "Delete the \"%1\" variable", - "NEW_PROCEDURE": "Make a Block", - "PROCEDURE_ALREADY_EXISTS": "A procedure named \"%1\" already exists.", - "PROCEDURE_DEFAULT_NAME": "block name", - "NEW_LIST": "Make a List", - "NEW_LIST_TITLE": "New list name:", - "LIST_MODAL_TITLE": "New List", - "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", - "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", - "RENAME_LIST_MODAL_TITLE": "Rename List", - "DEFAULT_LIST_ITEM": "thing", - "DELETE_LIST": "Delete the \"%1\" list", - "RENAME_LIST": "Rename list", - "NEW_BROADCAST_MESSAGE": "New message", - "NEW_BROADCAST_MESSAGE_TITLE": "New message name:", - "BROADCAST_MODAL_TITLE": "New Message", - "DEFAULT_BROADCAST_MESSAGE_NAME": "message1" -}; - -Blockly.ScratchMsgs.locales["es"] = -{ - "CONTROL_FOREVER": "por siempre", - "CONTROL_REPEAT": "repetir %1", - "CONTROL_IF": "si %1 entonces", - "CONTROL_ELSE": "si no", - "CONTROL_STOP": "detener", - "CONTROL_STOP_ALL": "todos", - "CONTROL_STOP_THIS": "este programa", - "CONTROL_STOP_OTHER": "otros programas en el objeto", - "CONTROL_WAIT": "esperar %1 segundos", - "CONTROL_WAITUNTIL": "esperar hasta que %1", - "CONTROL_REPEATUNTIL": "repetir hasta que %1", - "CONTROL_WHILE": "mientras %1", - "CONTROL_FOREACH": "para cada %1 de %2", - "CONTROL_STARTASCLONE": "al comenzar como clon", - "CONTROL_CREATECLONEOF": "crear clon de %1", - "CONTROL_CREATECLONEOF_MYSELF": "mí mismo", - "CONTROL_DELETETHISCLONE": "eliminar este clon", - "CONTROL_COUNTER": "contador", - "CONTROL_INCRCOUNTER": "incrementar contador", - "CONTROL_CLEARCOUNTER": "borrar contador", - "CONTROL_ALLATONCE": "todo de una vez", - "DATA_SETVARIABLETO": "dar a %1 el valor %2", - "DATA_CHANGEVARIABLEBY": "sumar a %1 %2", - "DATA_SHOWVARIABLE": "mostrar variable %1", - "DATA_HIDEVARIABLE": "esconder variable %1", - "DATA_ADDTOLIST": "añadir %1 a %2", - "DATA_DELETEOFLIST": "eliminar %1 de %2", - "DATA_DELETEALLOFLIST": "eliminar todos de %1", - "DATA_INSERTATLIST": "insertar %1 en %2 de %3", - "DATA_REPLACEITEMOFLIST": "reemplazar elemento %1 de %2 con %3", - "DATA_ITEMOFLIST": "elemento %1 de %2", - "DATA_ITEMNUMOFLIST": "# de elemento de %1 en %2", - "DATA_LENGTHOFLIST": "longitud de %1", - "DATA_LISTCONTAINSITEM": "¿%2 está en %1?", - "DATA_SHOWLIST": "mostrar lista %1", - "DATA_HIDELIST": "esconder lista %1", - "DATA_INDEX_ALL": "todos", - "DATA_INDEX_LAST": "último", - "DATA_INDEX_RANDOM": "aleatorio", - "EVENT_WHENFLAGCLICKED": "al hacer clic en %1", - "EVENT_WHENTHISSPRITECLICKED": "al hacer clic en este objeto", - "EVENT_WHENSTAGECLICKED": "al hacer clic en el escenario", - "EVENT_WHENTOUCHINGOBJECT": "cuando el objeto toque %1", - "EVENT_WHENBROADCASTRECEIVED": "al recibir %1", - "EVENT_WHENBACKDROPSWITCHESTO": "cuando el fondo cambie a %1", - "EVENT_WHENGREATERTHAN": "cuando %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volumen del sonido", - "EVENT_BROADCAST": "enviar %1", - "EVENT_BROADCASTANDWAIT": "enviar %1 y esperar", - "EVENT_WHENKEYPRESSED": "al presionar tecla %1", - "EVENT_WHENKEYPRESSED_SPACE": "espacio", - "EVENT_WHENKEYPRESSED_LEFT": "flecha izquierda", - "EVENT_WHENKEYPRESSED_RIGHT": "flecha derecha", - "EVENT_WHENKEYPRESSED_DOWN": "flecha abajo", - "EVENT_WHENKEYPRESSED_UP": "flecha arriba", - "EVENT_WHENKEYPRESSED_ANY": "cualquiera", - "LOOKS_SAYFORSECS": "decir %1 durante %2 segundos", - "LOOKS_SAY": "decir %1", - "LOOKS_HELLO": "¡Hola!", - "LOOKS_THINKFORSECS": "pensar %1 durante %2 segundos", - "LOOKS_THINK": "pensar %1", - "LOOKS_HMM": "Umm...", - "LOOKS_SHOW": "mostrar", - "LOOKS_HIDE": "esconder", - "LOOKS_HIDEALLSPRITES": "esconder todos los objetos", - "LOOKS_EFFECT_COLOR": "color", - "LOOKS_EFFECT_FISHEYE": "ojo de pez", - "LOOKS_EFFECT_WHIRL": "remolino", - "LOOKS_EFFECT_PIXELATE": "pixelar", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "brillo", - "LOOKS_EFFECT_GHOST": "desvanecer", - "LOOKS_CHANGEEFFECTBY": "sumar al efecto %1 %2", - "LOOKS_SETEFFECTTO": "dar al efecto %1 el valor %2", - "LOOKS_CLEARGRAPHICEFFECTS": "quitar efectos gráficos", - "LOOKS_CHANGESIZEBY": "cambiar tamaño por %1", - "LOOKS_SETSIZETO": "fijar tamaño al %1 %", - "LOOKS_SIZE": "tamaño", - "LOOKS_CHANGESTRETCHBY": "sumar al estiramiento %1", - "LOOKS_SETSTRETCHTO": "fijar estiramiento al %1 %", - "LOOKS_SWITCHCOSTUMETO": "cambiar disfraz a %1", - "LOOKS_NEXTCOSTUME": "siguiente disfraz", - "LOOKS_SWITCHBACKDROPTO": "cambiar fondo a %1", - "LOOKS_GOTOFRONTBACK": "ir a capa %1", - "LOOKS_GOTOFRONTBACK_FRONT": "delantera", - "LOOKS_GOTOFRONTBACK_BACK": "trasera", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ir %2 capas hacia %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "delante", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atrás", - "LOOKS_BACKDROPNUMBERNAME": "%1 de fondo", - "LOOKS_COSTUMENUMBERNAME": "%1 de disfraz", - "LOOKS_NUMBERNAME_NUMBER": "número", - "LOOKS_NUMBERNAME_NAME": "nombre", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "cambiar fondo a %1 y esperar", - "LOOKS_NEXTBACKDROP_BLOCK": "siguiente fondo", - "LOOKS_NEXTBACKDROP": "siguiente fondo", - "LOOKS_PREVIOUSBACKDROP": "fondo anterior", - "LOOKS_RANDOMBACKDROP": "fondo aleatorio", - "MOTION_MOVESTEPS": "mover %1 pasos", - "MOTION_TURNLEFT": "girar %1 %2 grados", - "MOTION_TURNRIGHT": "girar %1 %2 grados", - "MOTION_POINTINDIRECTION": "apuntar en dirección %1", - "MOTION_POINTTOWARDS": "apuntar hacia %1", - "MOTION_POINTTOWARDS_POINTER": "puntero del ratón", - "MOTION_POINTTOWARDS_RANDOM": "dirección aleatoria", - "MOTION_GOTO": "ir a %1", - "MOTION_GOTO_POINTER": "puntero del ratón", - "MOTION_GOTO_RANDOM": "posición aleatoria", - "MOTION_GOTOXY": "ir a x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "deslizar en %1 segs a x: %2 y: %3", - "MOTION_GLIDETO": "deslizar en %1 segs a %2", - "MOTION_GLIDETO_POINTER": "puntero del ratón", - "MOTION_GLIDETO_RANDOM": "posición aleatoria", - "MOTION_CHANGEXBY": "sumar a x %1", - "MOTION_SETX": "dar a x el valor %1", - "MOTION_CHANGEYBY": "sumar a y %1", - "MOTION_SETY": "dar a y el valor %1", - "MOTION_IFONEDGEBOUNCE": "si toca un borde, rebotar", - "MOTION_SETROTATIONSTYLE": "fijar estilo de rotación a %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "izquierda-derecha", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "no rotar", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "en todas direcciones", - "MOTION_XPOSITION": "posición en x", - "MOTION_YPOSITION": "posición en y", - "MOTION_DIRECTION": "dirección", - "MOTION_SCROLLRIGHT": "desplazar a la derecha %1", - "MOTION_SCROLLUP": "desplazar arriba %1", - "MOTION_ALIGNSCENE": "alinear escena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "abajo a la izquierda", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "abajo a la derecha", - "MOTION_ALIGNSCENE_MIDDLE": "al centro", - "MOTION_ALIGNSCENE_TOPLEFT": "arriba a la izquierda", - "MOTION_ALIGNSCENE_TOPRIGHT": "arriba a la derecha", - "MOTION_XSCROLL": "desplazamiento en x", - "MOTION_YSCROLL": "desplazamiento en y", - "MOTION_STAGE_SELECTED": "Escenario seleccionado: no hay bloques de movimiento", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "número aleatorio entre %1 y %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 y %2", - "OPERATORS_OR": "%1 o %2", - "OPERATORS_NOT": "no %1", - "OPERATORS_JOIN": "unir %1 %2", - "OPERATORS_JOIN_APPLE": "manzana", - "OPERATORS_JOIN_BANANA": "plátano", - "OPERATORS_LETTEROF": "letra %1 de %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "longitud de %1", - "OPERATORS_CONTAINS": "¿%2 está en %1?", - "OPERATORS_MOD": "%1 módulo %2", - "OPERATORS_ROUND": "redondear %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "valor absoluto", - "OPERATORS_MATHOP_FLOOR": "suelo", - "OPERATORS_MATHOP_CEILING": "techo", - "OPERATORS_MATHOP_SQRT": "raíz cuadrada", - "OPERATORS_MATHOP_SIN": "sen", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "arcsen", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definir %1", - "SENSING_TOUCHINGOBJECT": "¿tocando %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "puntero del ratón", - "SENSING_TOUCHINGOBJECT_EDGE": "borde", - "SENSING_TOUCHINGCOLOR": "¿tocando el color %1?", - "SENSING_COLORISTOUCHINGCOLOR": "¿color %1 tocando %2?", - "SENSING_DISTANCETO": "distancia a %1", - "SENSING_DISTANCETO_POINTER": "puntero del ratón", - "SENSING_ASKANDWAIT": "preguntar %1 y esperar", - "SENSING_ASK_TEXT": "¿Cómo te llamas?", - "SENSING_ANSWER": "respuesta", - "SENSING_KEYPRESSED": "¿tecla %1 presionada?", - "SENSING_MOUSEDOWN": "¿ratón presionado?", - "SENSING_MOUSEX": "posición x del ratón", - "SENSING_MOUSEY": "posición y del ratón", - "SENSING_SETDRAGMODE": "fijar modo de arrastre a %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrastrable", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "no arrastrable", - "SENSING_LOUDNESS": "volumen del sonido", - "SENSING_LOUD": "¿ruidoso?", - "SENSING_TIMER": "cronómetro", - "SENSING_RESETTIMER": "reiniciar cronómetro", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "posición en x", - "SENSING_OF_YPOSITION": "posición en y", - "SENSING_OF_DIRECTION": "dirección", - "SENSING_OF_COSTUMENUMBER": "# de disfraz", - "SENSING_OF_COSTUMENAME": "nombre de disfraz", - "SENSING_OF_SIZE": "tamaño", - "SENSING_OF_VOLUME": "volumen", - "SENSING_OF_BACKDROPNUMBER": "# de fondo", - "SENSING_OF_BACKDROPNAME": "nombre de fondo", - "SENSING_OF_STAGE": "Escenario", - "SENSING_CURRENT": "%1 actual", - "SENSING_CURRENT_YEAR": "año", - "SENSING_CURRENT_MONTH": "mes", - "SENSING_CURRENT_DATE": "día", - "SENSING_CURRENT_DAYOFWEEK": "día de la semana", - "SENSING_CURRENT_HOUR": "hora", - "SENSING_CURRENT_MINUTE": "minuto", - "SENSING_CURRENT_SECOND": "segundo", - "SENSING_DAYSSINCE2000": "días desde el 2000", - "SENSING_USERNAME": "nombre de usuario", - "SENSING_USERID": "id de usuario", - "SOUND_PLAY": "iniciar sonido %1", - "SOUND_PLAYUNTILDONE": "tocar sonido %1 hasta que termine", - "SOUND_STOPALLSOUNDS": "detener todos los sonidos", - "SOUND_SETEFFECTO": "dar al efecto %1 el valor %2", - "SOUND_CHANGEEFFECTBY": "sumar al efecto %1 %2", - "SOUND_CLEAREFFECTS": "quitar efectos de sonido", - "SOUND_EFFECTS_PITCH": "altura", - "SOUND_EFFECTS_PAN": "balance izquierda/derecha", - "SOUND_CHANGEVOLUMEBY": "cambiar volumen por %1", - "SOUND_SETVOLUMETO": "fijar volumen al %1%", - "SOUND_VOLUME": "volumen", - "SOUND_RECORD": "grabar...", - "CATEGORY_MOTION": "Movimiento", - "CATEGORY_LOOKS": "Apariencia", - "CATEGORY_SOUND": "Sonido", - "CATEGORY_EVENTS": "Eventos", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Sensores", - "CATEGORY_OPERATORS": "Operadores", - "CATEGORY_VARIABLES": "Variables", - "CATEGORY_MYBLOCKS": "Mis bloques", - "DUPLICATE": "Duplicar", - "DELETE": "Eliminar", - "ADD_COMMENT": "Añadir comentario", - "REMOVE_COMMENT": "Eliminar comentario", - "DELETE_BLOCK": "Eliminar bloque", - "DELETE_X_BLOCKS": "Eliminar %1 bloques", - "DELETE_ALL_BLOCKS": "¿Eliminar los %1 bloques?", - "CLEAN_UP": "Ordenar bloques", - "HELP": "Ayuda", - "UNDO": "Deshacer", - "REDO": "Rehacer", - "EDIT_PROCEDURE": "Editar", - "SHOW_PROCEDURE_DEFINITION": "Ir a definición", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Di algo...", - "COLOUR_HUE_LABEL": "Color", - "COLOUR_SATURATION_LABEL": "Saturación", - "COLOUR_BRIGHTNESS_LABEL": "Brillo", - "CHANGE_VALUE_TITLE": "Cambiar valor:", - "RENAME_VARIABLE": "Renombrar variable", - "RENAME_VARIABLE_TITLE": "Renombrar todas las variables \"%1\" a:", - "RENAME_VARIABLE_MODAL_TITLE": "Renombrar variable", - "NEW_VARIABLE": "Crear una variable", - "NEW_VARIABLE_TITLE": "Nombre de la variable:", - "VARIABLE_MODAL_TITLE": "Nueva variable", - "VARIABLE_ALREADY_EXISTS": "Ya existe una variable llamada \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Ya existe una variable llamada \"%1\" para otra variable de tipo \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "¿Eliminar %1 usos de la variable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "No se puede eliminar la variable \"%1\" porque es parte de la definición de la función \"%2\"", - "DELETE_VARIABLE": "Eliminar la variable \"%1\"", - "NEW_PROCEDURE": "Crear un bloque", - "PROCEDURE_ALREADY_EXISTS": "Ya existe un procedimiento llamado \"%1\".", - "PROCEDURE_DEFAULT_NAME": "nombre del bloque", - "NEW_LIST": "Crear una lista", - "NEW_LIST_TITLE": "Nombre de la lista:", - "LIST_MODAL_TITLE": "Nueva lista", - "LIST_ALREADY_EXISTS": "Ya existe una lista llamada \"%1\".", - "RENAME_LIST_TITLE": "Renombrar todas las listas \"%1\" a:", - "RENAME_LIST_MODAL_TITLE": "Renombrar lista", - "DEFAULT_LIST_ITEM": "cosa", - "DELETE_LIST": "Eliminar la lista \"%1\"", - "RENAME_LIST": "Renombrar lista", - "NEW_BROADCAST_MESSAGE": "Nuevo mensaje", - "NEW_BROADCAST_MESSAGE_TITLE": "Nombre del mensaje:", - "BROADCAST_MODAL_TITLE": "Nuevo Mensaje", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mensaje1" -}; - -Blockly.ScratchMsgs.locales["es-419"] = -{ - "CONTROL_FOREVER": "por siempre", - "CONTROL_REPEAT": "repetir %1", - "CONTROL_IF": "si %1 entonces", - "CONTROL_ELSE": "si no", - "CONTROL_STOP": "detener", - "CONTROL_STOP_ALL": "todos", - "CONTROL_STOP_THIS": "este programa", - "CONTROL_STOP_OTHER": "otros programas en el objeto", - "CONTROL_WAIT": "esperar %1 segundos", - "CONTROL_WAITUNTIL": "esperar hasta que %1", - "CONTROL_REPEATUNTIL": "repetir hasta que %1", - "CONTROL_WHILE": "mientras %1", - "CONTROL_FOREACH": "para cada %1 en %2", - "CONTROL_STARTASCLONE": "al comenzar como clon", - "CONTROL_CREATECLONEOF": "crear clon de %1", - "CONTROL_CREATECLONEOF_MYSELF": "mí mismo", - "CONTROL_DELETETHISCLONE": "eliminar este clon", - "CONTROL_COUNTER": "contador", - "CONTROL_INCRCOUNTER": "incrementar contador", - "CONTROL_CLEARCOUNTER": "borrar contador", - "CONTROL_ALLATONCE": "todos a la vez", - "DATA_SETVARIABLETO": "establecer %1 a %2", - "DATA_CHANGEVARIABLEBY": "cambiar %1 en %2", - "DATA_SHOWVARIABLE": "mostrar variable %1", - "DATA_HIDEVARIABLE": "ocultar variable %1", - "DATA_ADDTOLIST": "añadir %1 a %2", - "DATA_DELETEOFLIST": "eliminar %1 de %2", - "DATA_DELETEALLOFLIST": "Eliminar todos de %1", - "DATA_INSERTATLIST": "insertar %1 en %2 de %3", - "DATA_REPLACEITEMOFLIST": "reemplazar elemento %1 de %2 con %3", - "DATA_ITEMOFLIST": "elemento %1 de %2", - "DATA_ITEMNUMOFLIST": "elemento # %1 en %2 ", - "DATA_LENGTHOFLIST": "longitud de %1", - "DATA_LISTCONTAINSITEM": "¿%1 contiene %2?", - "DATA_SHOWLIST": "mostrar lista %1", - "DATA_HIDELIST": "esconder lista %1", - "DATA_INDEX_ALL": "todos", - "DATA_INDEX_LAST": "último", - "DATA_INDEX_RANDOM": "al azar", - "EVENT_WHENFLAGCLICKED": "al presionar %1", - "EVENT_WHENTHISSPRITECLICKED": "al hacer clic en este objeto", - "EVENT_WHENSTAGECLICKED": "al hacer clic en el escenario", - "EVENT_WHENTOUCHINGOBJECT": "cuando este objeto toque %1", - "EVENT_WHENBROADCASTRECEIVED": "al recibir %1", - "EVENT_WHENBACKDROPSWITCHESTO": "cuando el fondo cambie a %1", - "EVENT_WHENGREATERTHAN": "cuando %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volumen del sonido", - "EVENT_BROADCAST": "enviar %1", - "EVENT_BROADCASTANDWAIT": "enviar %1 y esperar", - "EVENT_WHENKEYPRESSED": "al presionar la tecla %1", - "EVENT_WHENKEYPRESSED_SPACE": "espacio", - "EVENT_WHENKEYPRESSED_LEFT": "flecha izquierda", - "EVENT_WHENKEYPRESSED_RIGHT": "flecha derecha", - "EVENT_WHENKEYPRESSED_DOWN": "flecha abajo", - "EVENT_WHENKEYPRESSED_UP": "flecha arriba", - "EVENT_WHENKEYPRESSED_ANY": "cualquiera", - "LOOKS_SAYFORSECS": "decir %1 por %2 segundos", - "LOOKS_SAY": "decir %1", - "LOOKS_HELLO": "¡Hola!", - "LOOKS_THINKFORSECS": "pensar %1 por %2 segundos", - "LOOKS_THINK": "pensar %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "mostrar", - "LOOKS_HIDE": "ocultar", - "LOOKS_HIDEALLSPRITES": "esconder todos los objetos", - "LOOKS_EFFECT_COLOR": "color", - "LOOKS_EFFECT_FISHEYE": "ojo de pez", - "LOOKS_EFFECT_WHIRL": "remolino", - "LOOKS_EFFECT_PIXELATE": "pixelar", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "brillo", - "LOOKS_EFFECT_GHOST": "desvanecer", - "LOOKS_CHANGEEFFECTBY": "cambiar el efecto %1 en %2", - "LOOKS_SETEFFECTTO": "fijar efecto %1 a %2", - "LOOKS_CLEARGRAPHICEFFECTS": "quitar efectos gráficos", - "LOOKS_CHANGESIZEBY": "cambiar tamaño en %1", - "LOOKS_SETSIZETO": "fijar tamaño a %1 %", - "LOOKS_SIZE": "tamaño", - "LOOKS_CHANGESTRETCHBY": "cambiar estiramiento en %1", - "LOOKS_SETSTRETCHTO": "fijar estiramiento a %1 %", - "LOOKS_SWITCHCOSTUMETO": "cambiar disfraz a %1", - "LOOKS_NEXTCOSTUME": "siguiente disfraz", - "LOOKS_SWITCHBACKDROPTO": "cambiar fondo a %1", - "LOOKS_GOTOFRONTBACK": "ir a la capa %1 ", - "LOOKS_GOTOFRONTBACK_FRONT": "del frente", - "LOOKS_GOTOFRONTBACK_BACK": "de atrás", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ir %2 capas hacia %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "adelante", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atrás", - "LOOKS_BACKDROPNUMBERNAME": "fondo %1", - "LOOKS_COSTUMENUMBERNAME": "disfraz %1", - "LOOKS_NUMBERNAME_NUMBER": "número", - "LOOKS_NUMBERNAME_NAME": "nombre", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "cambiar fondo a %1 y esperar", - "LOOKS_NEXTBACKDROP_BLOCK": "fondo siguiente", - "LOOKS_NEXTBACKDROP": "fondo siguiente", - "LOOKS_PREVIOUSBACKDROP": "fondo anterior", - "LOOKS_RANDOMBACKDROP": "fondo aleatorio", - "MOTION_MOVESTEPS": "mover %1 pasos", - "MOTION_TURNLEFT": "girar %1 %2 grados", - "MOTION_TURNRIGHT": "girar %1 %2 grados", - "MOTION_POINTINDIRECTION": "apuntar en dirección %1", - "MOTION_POINTTOWARDS": "apuntar hacia %1", - "MOTION_POINTTOWARDS_POINTER": "puntero del ratón", - "MOTION_POINTTOWARDS_RANDOM": "dirección aleatoria", - "MOTION_GOTO": "ir a %1", - "MOTION_GOTO_POINTER": "puntero del ratón", - "MOTION_GOTO_RANDOM": "posición aleatoria", - "MOTION_GOTOXY": "ir a x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "deslizar en %1 segs a x: %2 y: %3", - "MOTION_GLIDETO": "deslizar en %1 segs a %2", - "MOTION_GLIDETO_POINTER": "puntero del ratón", - "MOTION_GLIDETO_RANDOM": "posición aleatoria", - "MOTION_CHANGEXBY": "cambiar x en %1", - "MOTION_SETX": "fijar x a %1", - "MOTION_CHANGEYBY": "cambiar y en %1", - "MOTION_SETY": "fijar y a %1", - "MOTION_IFONEDGEBOUNCE": "rebotar si toca un borde", - "MOTION_SETROTATIONSTYLE": "fijar estilo de rotación: %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "izquierda-derecha", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "no rotar", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "en todas las direcciones", - "MOTION_XPOSITION": "posición en x", - "MOTION_YPOSITION": "posición en y", - "MOTION_DIRECTION": "dirección", - "MOTION_SCROLLRIGHT": "deslizar a la derecha %1", - "MOTION_SCROLLUP": "deslizar hacia arriba %1", - "MOTION_ALIGNSCENE": "alinear escena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "abajo a la izquierda", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "abajo a la derecha", - "MOTION_ALIGNSCENE_MIDDLE": "mitad", - "MOTION_ALIGNSCENE_TOPLEFT": "arriba a la izquierda", - "MOTION_ALIGNSCENE_TOPRIGHT": "arriba a la derecha", - "MOTION_XSCROLL": "deslizar x", - "MOTION_YSCROLL": "deslizar y", - "MOTION_STAGE_SELECTED": "Escenario seleccionado: no existen bloques de movimiento", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "número al azar entre %1 y %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 y %2", - "OPERATORS_OR": "%1 o %2", - "OPERATORS_NOT": "no %1", - "OPERATORS_JOIN": "unir %1 %2", - "OPERATORS_JOIN_APPLE": "manzana", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "letra %1 de %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "longitud de %1", - "OPERATORS_CONTAINS": "%1 contiene %2?", - "OPERATORS_MOD": "%1 mód %2", - "OPERATORS_ROUND": "redondear %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "valor absoluto", - "OPERATORS_MATHOP_FLOOR": "piso", - "OPERATORS_MATHOP_CEILING": "techo", - "OPERATORS_MATHOP_SQRT": "raíz cuadrada", - "OPERATORS_MATHOP_SIN": "seno", - "OPERATORS_MATHOP_COS": "coseno", - "OPERATORS_MATHOP_TAN": "tangente", - "OPERATORS_MATHOP_ASIN": "arcoseno", - "OPERATORS_MATHOP_ACOS": "arcocoseno", - "OPERATORS_MATHOP_ATAN": "arcotangente", - "OPERATORS_MATHOP_LN": "logaritmo natural", - "OPERATORS_MATHOP_LOG": "logaritmo en base 10", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definir %1", - "SENSING_TOUCHINGOBJECT": "¿tocando %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "el puntero del ratón", - "SENSING_TOUCHINGOBJECT_EDGE": "el borde", - "SENSING_TOUCHINGCOLOR": "¿tocando el color %1?", - "SENSING_COLORISTOUCHINGCOLOR": "¿color %1 está tocando %2?", - "SENSING_DISTANCETO": "distancia a %1", - "SENSING_DISTANCETO_POINTER": "el puntero del ratón", - "SENSING_ASKANDWAIT": "preguntar %1 y esperar", - "SENSING_ASK_TEXT": "¿Cómo te llamas?", - "SENSING_ANSWER": "respuesta", - "SENSING_KEYPRESSED": "¿tecla %1 presionada?", - "SENSING_MOUSEDOWN": "¿ratón presionado?", - "SENSING_MOUSEX": "posición x del ratón", - "SENSING_MOUSEY": "posición y del ratón", - "SENSING_SETDRAGMODE": "fijar modo de arrastre a %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrastrable", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "no arrastrable", - "SENSING_LOUDNESS": "volumen del sonido", - "SENSING_LOUD": "¿fuerte?", - "SENSING_TIMER": "cronómetro", - "SENSING_RESETTIMER": "reiniciar cronómetro", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "posición en x", - "SENSING_OF_YPOSITION": "posición en y", - "SENSING_OF_DIRECTION": "dirección", - "SENSING_OF_COSTUMENUMBER": "# de disfraz", - "SENSING_OF_COSTUMENAME": "nombre del disfraz", - "SENSING_OF_SIZE": "tamaño", - "SENSING_OF_VOLUME": "volumen", - "SENSING_OF_BACKDROPNUMBER": "# de fondo", - "SENSING_OF_BACKDROPNAME": "nombre de fondo", - "SENSING_OF_STAGE": "Escenario", - "SENSING_CURRENT": "%1 actual", - "SENSING_CURRENT_YEAR": "año", - "SENSING_CURRENT_MONTH": "mes", - "SENSING_CURRENT_DATE": "fecha", - "SENSING_CURRENT_DAYOFWEEK": "día de la semana", - "SENSING_CURRENT_HOUR": "hora", - "SENSING_CURRENT_MINUTE": "minuto", - "SENSING_CURRENT_SECOND": "segundo", - "SENSING_DAYSSINCE2000": "días desde el 2000", - "SENSING_USERNAME": "nombre de usuario", - "SENSING_USERID": "identificación de usuario", - "SOUND_PLAY": "tocar sonido %1", - "SOUND_PLAYUNTILDONE": "tocar sonido %1 hasta terminar", - "SOUND_STOPALLSOUNDS": "detener todos los sonidos", - "SOUND_SETEFFECTO": "fijar efecto %1 a %2", - "SOUND_CHANGEEFFECTBY": "cambiar efecto %1 en %2", - "SOUND_CLEAREFFECTS": "borrar efectos de sonido", - "SOUND_EFFECTS_PITCH": "altura", - "SOUND_EFFECTS_PAN": "paneo izquierda/derecha", - "SOUND_CHANGEVOLUMEBY": "cambiar volumen en %1", - "SOUND_SETVOLUMETO": "fijar volumen a %1%", - "SOUND_VOLUME": "volumen", - "SOUND_RECORD": "grabar...", - "CATEGORY_MOTION": "Movimiento", - "CATEGORY_LOOKS": "Apariencia", - "CATEGORY_SOUND": "Sonido", - "CATEGORY_EVENTS": "Eventos", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Sensores", - "CATEGORY_OPERATORS": "Operadores", - "CATEGORY_VARIABLES": "Variables", - "CATEGORY_MYBLOCKS": "Mis Bloques", - "DUPLICATE": "Duplicar", - "DELETE": "Eliminar", - "ADD_COMMENT": "Agregar comentario", - "REMOVE_COMMENT": "Eliminar comentario", - "DELETE_BLOCK": "Eliminar bloque", - "DELETE_X_BLOCKS": "Eliminar %1 bloques", - "DELETE_ALL_BLOCKS": "¿Eliminar todos los bloques %1?", - "CLEAN_UP": "Limpiar bloques", - "HELP": "Ayuda", - "UNDO": "Deshacer", - "REDO": "Rehacer", - "EDIT_PROCEDURE": "Editar", - "SHOW_PROCEDURE_DEFINITION": "Ir a la definición", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Decir algo...", - "COLOUR_HUE_LABEL": "Color", - "COLOUR_SATURATION_LABEL": "Saturación", - "COLOUR_BRIGHTNESS_LABEL": "Brillo", - "CHANGE_VALUE_TITLE": "Cambiar valor:", - "RENAME_VARIABLE": "Renombrar variable", - "RENAME_VARIABLE_TITLE": "Renombrar todas las variables \"%1\" a:", - "RENAME_VARIABLE_MODAL_TITLE": "Renombrar variable", - "NEW_VARIABLE": "Crear una variable", - "NEW_VARIABLE_TITLE": "Nuevo nombre de variable:", - "VARIABLE_MODAL_TITLE": "Variable nueva", - "VARIABLE_ALREADY_EXISTS": "Ya existe una variable llamada \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Ya existe una variable llamada \"%1\" para otra variable de tipo \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "¿Eliminar %1 usos de la variable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "No se puede eliminar la variable \"%1\" porque es parte de la definición de la función \"%2\"", - "DELETE_VARIABLE": "Eliminar la variable \"%1\"", - "NEW_PROCEDURE": "Crear un bloque", - "PROCEDURE_ALREADY_EXISTS": "Ya existe un procedimiento llamado \"%1\".", - "PROCEDURE_DEFAULT_NAME": "nombre del bloque", - "NEW_LIST": "Crear una lista", - "NEW_LIST_TITLE": "Nombre para nueva lista:", - "LIST_MODAL_TITLE": "Lista nueva", - "LIST_ALREADY_EXISTS": "Ya existe una lista llamada \"%1\".", - "RENAME_LIST_TITLE": "Renombrar todas las listas \"%1\" a:", - "RENAME_LIST_MODAL_TITLE": "Renombrar lista", - "DEFAULT_LIST_ITEM": "cosa", - "DELETE_LIST": "Eliminar la lista \"%1\"", - "RENAME_LIST": "Renombrar lista", - "NEW_BROADCAST_MESSAGE": "Nuevo mensaje", - "NEW_BROADCAST_MESSAGE_TITLE": "Nombre para el nuevo mensaje:", - "BROADCAST_MODAL_TITLE": "Nuevo Mensaje", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mensaje1" -}; - -Blockly.ScratchMsgs.locales["eu"] = -{ - "CONTROL_FOREVER": "etengabe", - "CONTROL_REPEAT": "errepikatu %1 aldiz", - "CONTROL_IF": "baldin %1 orduan", - "CONTROL_ELSE": "bestela", - "CONTROL_STOP": "gelditu", - "CONTROL_STOP_ALL": "dena", - "CONTROL_STOP_THIS": "script hau", - "CONTROL_STOP_OTHER": "pertsonaiaren beste script batzuk", - "CONTROL_WAIT": "itxaron %1 segundo", - "CONTROL_WAITUNTIL": "itxaron %1 arte ", - "CONTROL_REPEATUNTIL": "errepikatu %1 arte", - "CONTROL_WHILE": "%1 den bitartean", - "CONTROL_FOREACH": "%2 ko %1 bakoitzeko ", - "CONTROL_STARTASCLONE": "klon moduan hasten naizenean", - "CONTROL_CREATECLONEOF": "sortu %1 ren klona", - "CONTROL_CREATECLONEOF_MYSELF": "nire burua", - "CONTROL_DELETETHISCLONE": "ezabatu klon hau ", - "CONTROL_COUNTER": "kontagailua", - "CONTROL_INCRCOUNTER": "gehitu kontagailuan", - "CONTROL_CLEARCOUNTER": "berrabiarazi kontagailua ", - "CONTROL_ALLATONCE": "denak batera", - "DATA_SETVARIABLETO": "ezarri %1: %2 ", - "DATA_CHANGEVARIABLEBY": "aldatu %1 %2 unitate", - "DATA_SHOWVARIABLE": "erakutsi %1 aldagaia ", - "DATA_HIDEVARIABLE": "ezkutatu %1 aldagaia", - "DATA_ADDTOLIST": "batu %1 %2 ri", - "DATA_DELETEOFLIST": "ezabatu %1 %2 tik", - "DATA_DELETEALLOFLIST": "ezabatu %1-ko guztia", - "DATA_INSERTATLIST": "txertatu %1 %3 -ren %2 -an", - "DATA_REPLACEITEMOFLIST": "aldatu %2 -ko %1 elementua %3 -rekin ", - "DATA_ITEMOFLIST": "%2 tik %1. elementua", - "DATA_ITEMNUMOFLIST": "%1 tik #. elementua %2 n", - "DATA_LENGTHOFLIST": "%1 ren luzera", - "DATA_LISTCONTAINSITEM": "%1 k bere baitan al du %2?", - "DATA_SHOWLIST": "erakutsi %1 zerrenda", - "DATA_HIDELIST": "ezkutatu %1 zerrenda", - "DATA_INDEX_ALL": "dena", - "DATA_INDEX_LAST": "azkena", - "DATA_INDEX_RANDOM": "ausazkoa", - "EVENT_WHENFLAGCLICKED": "%1 klik egitean", - "EVENT_WHENTHISSPRITECLICKED": "pertsonai honetan klik egitean", - "EVENT_WHENSTAGECLICKED": "Eszenan klik egitean", - "EVENT_WHENTOUCHINGOBJECT": "pertsonai honek %1 ukitzen duenean", - "EVENT_WHENBROADCASTRECEIVED": "%1 jasotzean", - "EVENT_WHENBACKDROPSWITCHESTO": "atzeko oihala %1 ra aldatzen denean", - "EVENT_WHENGREATERTHAN": "%1 > %2 bada", - "EVENT_WHENGREATERTHAN_TIMER": "kronometroa", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ozentasuna", - "EVENT_BROADCAST": "bidali %1 guztiei", - "EVENT_BROADCASTANDWAIT": "bidali %1 guztiei eta itxaron", - "EVENT_WHENKEYPRESSED": "%1 tekla sakatzean", - "EVENT_WHENKEYPRESSED_SPACE": "zuriunea", - "EVENT_WHENKEYPRESSED_LEFT": "ezkerrera gezia", - "EVENT_WHENKEYPRESSED_RIGHT": "eskuinera gezia", - "EVENT_WHENKEYPRESSED_DOWN": "behera gezia", - "EVENT_WHENKEYPRESSED_UP": "gora gezia", - "EVENT_WHENKEYPRESSED_ANY": "edozein", - "LOOKS_SAYFORSECS": "esan %1 %2 segundoz", - "LOOKS_SAY": "esan %1", - "LOOKS_HELLO": "Kaixo!", - "LOOKS_THINKFORSECS": "pentsatu %1 %2 segundoz", - "LOOKS_THINK": "pentsatu %1", - "LOOKS_HMM": "Mmm...", - "LOOKS_SHOW": "erakutsi", - "LOOKS_HIDE": "ezkutatu", - "LOOKS_HIDEALLSPRITES": "ezkutatu pertsonai guztiak ", - "LOOKS_EFFECT_COLOR": "kolorea", - "LOOKS_EFFECT_FISHEYE": "arrain-begia", - "LOOKS_EFFECT_WHIRL": "zurrunbiloa", - "LOOKS_EFFECT_PIXELATE": "pixelatu", - "LOOKS_EFFECT_MOSAIC": "mosaikoa", - "LOOKS_EFFECT_BRIGHTNESS": "distira", - "LOOKS_EFFECT_GHOST": "mamua", - "LOOKS_CHANGEEFFECTBY": "aldatu %1 efektua %2 unitate", - "LOOKS_SETEFFECTTO": "ezarri %1 efektua %2 ri ", - "LOOKS_CLEARGRAPHICEFFECTS": "kendu efektu grafikoak ", - "LOOKS_CHANGESIZEBY": "aldatu tamaina %1 unitate", - "LOOKS_SETSIZETO": "ezarri tamaina: % %1", - "LOOKS_SIZE": "tamaina", - "LOOKS_CHANGESTRETCHBY": "aldatu luzaketa %1 unitate", - "LOOKS_SETSTRETCHTO": "ezarri luzera: % %1", - "LOOKS_SWITCHCOSTUMETO": "aldatu tankera %1 ra ", - "LOOKS_NEXTCOSTUME": "hurrengo tankera", - "LOOKS_SWITCHBACKDROPTO": "aldatu atzeko oihala %1 ra ", - "LOOKS_GOTOFRONTBACK": "joan %1 geruzara ", - "LOOKS_GOTOFRONTBACK_FRONT": "aurrealdeko", - "LOOKS_GOTOFRONTBACK_BACK": "atzealdeko", - "LOOKS_GOFORWARDBACKWARDLAYERS": "joan %1 geruza %2", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "aurrealdera", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atzealdera", - "LOOKS_BACKDROPNUMBERNAME": "%1 atzeko oihala", - "LOOKS_COSTUMENUMBERNAME": "%1 tankera", - "LOOKS_NUMBERNAME_NUMBER": "zenbakia", - "LOOKS_NUMBERNAME_NAME": "izena", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "aldatu atzeko oihala %1 ra eta itxaron", - "LOOKS_NEXTBACKDROP_BLOCK": "hurrengo atzeko oihala", - "LOOKS_NEXTBACKDROP": "hurrengo atzeko oihala", - "LOOKS_PREVIOUSBACKDROP": "aurreko atzeko oihala", - "LOOKS_RANDOMBACKDROP": "ausazko atzeko oihala", - "MOTION_MOVESTEPS": "mugitu %1 pausu ", - "MOTION_TURNLEFT": "biratu %1 %2 gradu", - "MOTION_TURNRIGHT": "biratu %1 %2 gradu", - "MOTION_POINTINDIRECTION": "apuntatu norabidea: %1", - "MOTION_POINTTOWARDS": "jarri hona begira: %1", - "MOTION_POINTTOWARDS_POINTER": "saguaren erakuslea", - "MOTION_POINTTOWARDS_RANDOM": "ausazko norabidea", - "MOTION_GOTO": "joan hona %1", - "MOTION_GOTO_POINTER": "saguaren erakuslea", - "MOTION_GOTO_RANDOM": "ausazko kokapena", - "MOTION_GOTOXY": "joan x: %1 y: %2 kokapenera ", - "MOTION_GLIDESECSTOXY": "Irristatu %1 segundotan hona x: %2 y: %3", - "MOTION_GLIDETO": "Irristatu %1 segundotan hona: %2", - "MOTION_GLIDETO_POINTER": "saguaren erakuslea", - "MOTION_GLIDETO_RANDOM": "ausazko kokapena", - "MOTION_CHANGEXBY": "aldatu x %1 unitate", - "MOTION_SETX": "ezarri x: %1", - "MOTION_CHANGEYBY": "aldatu y %1 unitate", - "MOTION_SETY": "ezarri y: %1", - "MOTION_IFONEDGEBOUNCE": "errebotatu ertza ukitzean ", - "MOTION_SETROTATIONSTYLE": "ezarri biraketa modua: %1 ", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "ezker-eskuin", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ez biratu", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "norabide guztietara", - "MOTION_XPOSITION": "x kokapena", - "MOTION_YPOSITION": "y kokapena", - "MOTION_DIRECTION": "norabidea", - "MOTION_SCROLLRIGHT": "korritu eskuinera %1", - "MOTION_SCROLLUP": "korritu gora %1", - "MOTION_ALIGNSCENE": "lerrokatu %1 eszena", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "behean ezkerrean", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "behean eskuinean", - "MOTION_ALIGNSCENE_MIDDLE": "erdian", - "MOTION_ALIGNSCENE_TOPLEFT": "goian ezkerrean", - "MOTION_ALIGNSCENE_TOPRIGHT": "goian eskuinean", - "MOTION_XSCROLL": "korritu x", - "MOTION_YSCROLL": "korritu y", - "MOTION_STAGE_SELECTED": "Hautatutako eszena: ez dago mugimendurako blokerik", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 eta %2 arteko ausazko balioa", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 eta %2", - "OPERATORS_OR": "%1 edo %2", - "OPERATORS_NOT": "%1 ez", - "OPERATORS_JOIN": "elkartu %1 %2 rekin", - "OPERATORS_JOIN_APPLE": "sagarra", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "%1. letra %2 tik", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "%1 ren luzera", - "OPERATORS_CONTAINS": "%1(e)k bere baitan al du %2?", - "OPERATORS_MOD": "%1 modulu %2", - "OPERATORS_ROUND": "biribildu %1", - "OPERATORS_MATHOP": " %2 tik %1", - "OPERATORS_MATHOP_ABS": "balio absolutu", - "OPERATORS_MATHOP_FLOOR": "zoru-funtzioa", - "OPERATORS_MATHOP_CEILING": "sabai-funtzioa", - "OPERATORS_MATHOP_SQRT": "erro karratua", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definitu %1", - "SENSING_TOUCHINGOBJECT": "%1 ukitzen?", - "SENSING_TOUCHINGOBJECT_POINTER": "saguaren erakuslea", - "SENSING_TOUCHINGOBJECT_EDGE": "ertza", - "SENSING_TOUCHINGCOLOR": "%1 kolorea ukitzen?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 koloreak %2 ukitzen du?", - "SENSING_DISTANCETO": "%1 rako distantzia", - "SENSING_DISTANCETO_POINTER": "saguaren erakuslea", - "SENSING_ASKANDWAIT": "galdetu %1 eta itxaron", - "SENSING_ASK_TEXT": "Nola duzu izena?", - "SENSING_ANSWER": "erantzuna", - "SENSING_KEYPRESSED": "%1 tekla sakatuta?", - "SENSING_MOUSEDOWN": "sagua sakatuta?", - "SENSING_MOUSEX": "saguaren x", - "SENSING_MOUSEY": "saguaren y", - "SENSING_SETDRAGMODE": "ezarri arrastea %1 moduan", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrastagarria", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "arrastaezina", - "SENSING_LOUDNESS": "ozentasuna", - "SENSING_LOUD": "ozen?", - "SENSING_TIMER": "kronometroa", - "SENSING_RESETTIMER": "berrabiarazi kronometroa", - "SENSING_OF": "%2 tik %1", - "SENSING_OF_XPOSITION": "x kokapena", - "SENSING_OF_YPOSITION": "y kokapena", - "SENSING_OF_DIRECTION": "norabidea", - "SENSING_OF_COSTUMENUMBER": "# tankera", - "SENSING_OF_COSTUMENAME": "tankeraren izena", - "SENSING_OF_SIZE": "tamaina", - "SENSING_OF_VOLUME": "bolumena", - "SENSING_OF_BACKDROPNUMBER": "# atzeko oihala", - "SENSING_OF_BACKDROPNAME": "atzeko oihalaren izena", - "SENSING_OF_STAGE": "Eszena", - "SENSING_CURRENT": "oraingo %1", - "SENSING_CURRENT_YEAR": "urtea", - "SENSING_CURRENT_MONTH": "hilabetea", - "SENSING_CURRENT_DATE": "data", - "SENSING_CURRENT_DAYOFWEEK": "asteko eguna", - "SENSING_CURRENT_HOUR": "ordua", - "SENSING_CURRENT_MINUTE": "minutua", - "SENSING_CURRENT_SECOND": "segundoa", - "SENSING_DAYSSINCE2000": "2000tik geroztiko egunak", - "SENSING_USERNAME": "erabiltzaile-izena", - "SENSING_USERID": "erabiltzaile-id", - "SOUND_PLAY": "hasi %1 soinua", - "SOUND_PLAYUNTILDONE": "jo %1 soinua amaitu arte", - "SOUND_STOPALLSOUNDS": "gelditu soinu guztiak", - "SOUND_SETEFFECTO": "ezarri %1 efektua: %2", - "SOUND_CHANGEEFFECTBY": "aldatu %1 efektua %2 unitate", - "SOUND_CLEAREFFECTS": "kendu soinu-efektuak", - "SOUND_EFFECTS_PITCH": "tonua", - "SOUND_EFFECTS_PAN": "ezker/eskuin balantzea", - "SOUND_CHANGEVOLUMEBY": "aldatu bolumena %1 unitate", - "SOUND_SETVOLUMETO": "ezarri bolumena: %1%", - "SOUND_VOLUME": "bolumena", - "SOUND_RECORD": "grabatu...", - "CATEGORY_MOTION": "Mugimendua", - "CATEGORY_LOOKS": "Itxura", - "CATEGORY_SOUND": "Soinua", - "CATEGORY_EVENTS": "Gertaerak", - "CATEGORY_CONTROL": "Kontrola", - "CATEGORY_SENSING": "Sentsoreak", - "CATEGORY_OPERATORS": "Eragileak", - "CATEGORY_VARIABLES": "Aldagaiak", - "CATEGORY_MYBLOCKS": "Nire blokeak", - "DUPLICATE": "Bikoiztu", - "DELETE": "Ezabatu", - "ADD_COMMENT": "Gehitu iruzkina", - "REMOVE_COMMENT": "Kendu iruzkina", - "DELETE_BLOCK": "Ezabatu blokea", - "DELETE_X_BLOCKS": "Ezabatu %1 bloke", - "DELETE_ALL_BLOCKS": "Ezabatu %1 blokeak?", - "CLEAN_UP": "Kendu blokeak", - "HELP": "Laguntza", - "UNDO": "Desegin", - "REDO": "Berregin", - "EDIT_PROCEDURE": "Editatu", - "SHOW_PROCEDURE_DEFINITION": "Joan definiziora", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Esan zerbait...", - "COLOUR_HUE_LABEL": "Kolorea", - "COLOUR_SATURATION_LABEL": "Asetasuna", - "COLOUR_BRIGHTNESS_LABEL": "Distira", - "CHANGE_VALUE_TITLE": "Aldatu balioa:", - "RENAME_VARIABLE": "Aldatu izena aldagaiari", - "RENAME_VARIABLE_TITLE": "Aldatu izenak \"%1\" aldagaiei honela:", - "RENAME_VARIABLE_MODAL_TITLE": "Aldatu izena aldagaiari", - "NEW_VARIABLE": "Sortu aldagai bat", - "NEW_VARIABLE_TITLE": "Aldagai berriaren izena:", - "VARIABLE_MODAL_TITLE": "Aldagai berria", - "VARIABLE_ALREADY_EXISTS": "\"%1\" izeneko aldagaia badago lehendik.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "\"%2\" motako beste aldagai batek badu lehendik \"%1\" izena.", - "DELETE_VARIABLE_CONFIRMATION": "Ezabatu \"%2\" aldagaiaren %1 erabilerak?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ezin da \"%1\" aldagaia ezabatu \"%2\" funtzioaren definizioan parte hartzen duelako.", - "DELETE_VARIABLE": "Ezabatu \"%1\" aldagaia", - "NEW_PROCEDURE": "Sortu bloke bat", - "PROCEDURE_ALREADY_EXISTS": "\"%1\" izeneko prozedura badago lehendik.", - "PROCEDURE_DEFAULT_NAME": "blokearen izena", - "NEW_LIST": "Sortu zerrenda bat", - "NEW_LIST_TITLE": "Zerrenda berriaren izena:", - "LIST_MODAL_TITLE": "Zerrenda berria", - "LIST_ALREADY_EXISTS": "\"%1\" izeneko zerrenda badago lehendik.", - "RENAME_LIST_TITLE": "Aldatu izenak \"%1\" zerrendei honela:", - "RENAME_LIST_MODAL_TITLE": "Aldatu izena zerrendari", - "DEFAULT_LIST_ITEM": "gauza", - "DELETE_LIST": "Ezabatu \"%1\" zerrenda", - "RENAME_LIST": "Aldatu izena zerrendari", - "NEW_BROADCAST_MESSAGE": "Mezu berria", - "NEW_BROADCAST_MESSAGE_TITLE": "Mezu berriaren izena:", - "BROADCAST_MODAL_TITLE": "Mezu berria", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mezua1" -}; - -Blockly.ScratchMsgs.locales["fa"] = -{ - "CONTROL_FOREVER": "برای همیشه", - "CONTROL_REPEAT": " %1 بار تکرار کن", - "CONTROL_IF": "اگر %1 آن‌گاه", - "CONTROL_ELSE": "وگرنه", - "CONTROL_STOP": "توقف", - "CONTROL_STOP_ALL": "همه", - "CONTROL_STOP_THIS": "این دستور", - "CONTROL_STOP_OTHER": "سایر دستور‌های این شکلک", - "CONTROL_WAIT": "%1 ثانیه صبر کن", - "CONTROL_WAITUNTIL": "صبر کن تا اینکه %1", - "CONTROL_REPEATUNTIL": "تکرار کن تا اینکه %1", - "CONTROL_WHILE": "هنگامی‌که %1 ", - "CONTROL_FOREACH": "برای هر %1 در %2", - "CONTROL_STARTASCLONE": "وقتی‌که به‌عنوان یک مشابه شروع کردم", - "CONTROL_CREATECLONEOF": "مشابه %1 را بساز", - "CONTROL_CREATECLONEOF_MYSELF": "خودم", - "CONTROL_DELETETHISCLONE": "این مشابه را حذف کن", - "CONTROL_COUNTER": "شمارنده", - "CONTROL_INCRCOUNTER": "افزایش شمارنده", - "CONTROL_CLEARCOUNTER": "شمارنده را پاک کن", - "CONTROL_ALLATONCE": "همه در یک‌بار ", - "DATA_SETVARIABLETO": "%1 را %2 قرار بده", - "DATA_CHANGEVARIABLEBY": "%1 را به میزان %2 تغییر بده", - "DATA_SHOWVARIABLE": "متغیر %1 را نشان بده", - "DATA_HIDEVARIABLE": "متغیر %1 را پنهان کن", - "DATA_ADDTOLIST": " %1 را به %2 اضافه کن", - "DATA_DELETEOFLIST": "ردیف %1 را از %2 حذف کن", - "DATA_DELETEALLOFLIST": "همه‌ی ردیف‌های %1 را حذف کن", - "DATA_INSERTATLIST": "%1 را در ردیف %2 از %3 درج کن", - "DATA_REPLACEITEMOFLIST": "ردیف %1 از %2 را با %3 جایگزین کن", - "DATA_ITEMOFLIST": "ردیف %1 از %2", - "DATA_ITEMNUMOFLIST": "# ردیف %1 در %2", - "DATA_LENGTHOFLIST": "طول %1", - "DATA_LISTCONTAINSITEM": "%1 شامل عنصر %2 است؟", - "DATA_SHOWLIST": "لیست %1 را نمایش بده", - "DATA_HIDELIST": "لیست %1 را پنهان کن", - "DATA_INDEX_ALL": "همه", - "DATA_INDEX_LAST": "آخرین", - "DATA_INDEX_RANDOM": "تصادفی", - "EVENT_WHENFLAGCLICKED": "وقتی‌که %1 کلیک شد", - "EVENT_WHENTHISSPRITECLICKED": "وقتی‌که این شکلک کلیک شد", - "EVENT_WHENSTAGECLICKED": "وقتی‌که صحنه کلیک شد", - "EVENT_WHENTOUCHINGOBJECT": "وقتی‌که این شکلک %1 را لمس کرد", - "EVENT_WHENBROADCASTRECEIVED": "وقتی‌که %1 را دریافت کردم", - "EVENT_WHENBACKDROPSWITCHESTO": "وقتی‌که پس‌زمینه به %1 تغییر کرد", - "EVENT_WHENGREATERTHAN": "وقتی‌که %2 < %1 شد", - "EVENT_WHENGREATERTHAN_TIMER": "زمان سنج", - "EVENT_WHENGREATERTHAN_LOUDNESS": "بلندی صدا", - "EVENT_BROADCAST": "%1 را منتشر کن", - "EVENT_BROADCASTANDWAIT": "%1 را منتشر کن و صبر کن", - "EVENT_WHENKEYPRESSED": "وقتی‌که کلید %1 فشرده شد", - "EVENT_WHENKEYPRESSED_SPACE": "فاصله", - "EVENT_WHENKEYPRESSED_LEFT": "جهت چپ", - "EVENT_WHENKEYPRESSED_RIGHT": "جهت راست", - "EVENT_WHENKEYPRESSED_DOWN": "جهت پایین", - "EVENT_WHENKEYPRESSED_UP": "جهت بالا", - "EVENT_WHENKEYPRESSED_ANY": "هر", - "LOOKS_SAYFORSECS": "بگو %1 به مدت %2 ثانیه", - "LOOKS_SAY": "بگو %1", - "LOOKS_HELLO": "سلام", - "LOOKS_THINKFORSECS": "فکر کن به %1 به مدت %2 ثانیه", - "LOOKS_THINK": "فکر کن به %1", - "LOOKS_HMM": "اوهومم", - "LOOKS_SHOW": "ظاهر شو", - "LOOKS_HIDE": "پنهان شو", - "LOOKS_HIDEALLSPRITES": "همه‌ی شکلک‌ها را پنهان کن", - "LOOKS_EFFECT_COLOR": "رنگ", - "LOOKS_EFFECT_FISHEYE": "چشم ماهی", - "LOOKS_EFFECT_WHIRL": "چرخش گردابی", - "LOOKS_EFFECT_PIXELATE": "پیکسل بندی", - "LOOKS_EFFECT_MOSAIC": "موزاييک بندی", - "LOOKS_EFFECT_BRIGHTNESS": "روشنایی", - "LOOKS_EFFECT_GHOST": "روح", - "LOOKS_CHANGEEFFECTBY": "جلوه‌ی %1 را به میزان %2 تغییر بده", - "LOOKS_SETEFFECTTO": "جلوه‌ی %1 را %2 قرار بده", - "LOOKS_CLEARGRAPHICEFFECTS": "جلوه‌های گرافیکی را پاک کن", - "LOOKS_CHANGESIZEBY": "اندازه را به میزان %1 تغییر بده", - "LOOKS_SETSIZETO": "اندازه را % %1 قرار بده", - "LOOKS_SIZE": "اندازه", - "LOOKS_CHANGESTRETCHBY": "کشیدگی را به میزان %1 تغییر بده", - "LOOKS_SETSTRETCHTO": "کشیدگی را %1 % قرار بده", - "LOOKS_SWITCHCOSTUMETO": "تعویض حالت به %1", - "LOOKS_NEXTCOSTUME": "حالت بعدی", - "LOOKS_SWITCHBACKDROPTO": "تعویض پس‌زمینه به %1", - "LOOKS_GOTOFRONTBACK": "به لایه‌ی %1 برو", - "LOOKS_GOTOFRONTBACK_FRONT": "جلو", - "LOOKS_GOTOFRONTBACK_BACK": "عقب", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%2 لایه %1 برو", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "به جلو", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "به عقب", - "LOOKS_BACKDROPNUMBERNAME": "پس‌زمینه‌ی %1", - "LOOKS_COSTUMENUMBERNAME": "حالت %1", - "LOOKS_NUMBERNAME_NUMBER": "شماره", - "LOOKS_NUMBERNAME_NAME": "نام", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "پس‌زمینه را به %1 تغییر بده و صبر کن", - "LOOKS_NEXTBACKDROP_BLOCK": "پس‌زمینه‌ی بعدی", - "LOOKS_NEXTBACKDROP": "پس‌زمینه‌ی بعدی", - "LOOKS_PREVIOUSBACKDROP": "پس‌زمینه‌ی قبلی", - "LOOKS_RANDOMBACKDROP": "پس‌زمینه‌ی تصادفی", - "MOTION_MOVESTEPS": "%1 گام حرکت کن", - "MOTION_TURNLEFT": "%2 درجه %1 بچرخ", - "MOTION_TURNRIGHT": "%2 درجه %1 بچرخ", - "MOTION_POINTINDIRECTION": "در جهت %1 قرار بگیر", - "MOTION_POINTTOWARDS": "به سمت %1 قرار بگیر", - "MOTION_POINTTOWARDS_POINTER": "اشاره گر ماوس", - "MOTION_POINTTOWARDS_RANDOM": "جهت تصافی", - "MOTION_GOTO": "به %1 برو", - "MOTION_GOTO_POINTER": "اشاره گر ماوس", - "MOTION_GOTO_RANDOM": "مکان تصادفی", - "MOTION_GOTOXY": "به x: %1 و y: %2 برو", - "MOTION_GLIDESECSTOXY": "به x: %2 و y: %3 در مدت %1 ثانیه سر بخور", - "MOTION_GLIDETO": "به %2 در مدت %1 ثانیه سر بخور", - "MOTION_GLIDETO_POINTER": "اشاره گر ماوس", - "MOTION_GLIDETO_RANDOM": "مکان تصادفی", - "MOTION_CHANGEXBY": "x را به میزان %1 تغییر بده", - "MOTION_SETX": "x را %1 قرار بده", - "MOTION_CHANGEYBY": "y را به میزان %1 تغییر بده", - "MOTION_SETY": "y را %1 قرار بده", - "MOTION_IFONEDGEBOUNCE": "اگر روی لبه قرار گرفتی، برگرد", - "MOTION_SETROTATIONSTYLE": "حالت چرخش را %1 قرار بده", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "چپ-راست", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "بدون چرخش", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "همه طرف", - "MOTION_XPOSITION": "مکان x", - "MOTION_YPOSITION": "مکان y", - "MOTION_DIRECTION": "جهت", - "MOTION_SCROLLRIGHT": "%1 به راست پیمایش کن", - "MOTION_SCROLLUP": "%1 به بالا پیمایش کن", - "MOTION_ALIGNSCENE": "تراز کردن صحنه %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "پایین - چپ", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "پایین - راست", - "MOTION_ALIGNSCENE_MIDDLE": "وسط", - "MOTION_ALIGNSCENE_TOPLEFT": "بالا - چپ", - "MOTION_ALIGNSCENE_TOPRIGHT": "بالا - راست", - "MOTION_XSCROLL": "پیمایش x", - "MOTION_YSCROLL": "پیمایش y", - "MOTION_STAGE_SELECTED": "صحنه‌ انتخاب شده است: بدون قطعه‌های حرکت", - "OPERATORS_ADD": "%2 + %1", - "OPERATORS_SUBTRACT": "%2 - %1", - "OPERATORS_MULTIPLY": "%2 * %1", - "OPERATORS_DIVIDE": "%2 / %1", - "OPERATORS_RANDOM": "انتخاب تصادفی بین %1 تا %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 و %2", - "OPERATORS_OR": "%1 یا %2", - "OPERATORS_NOT": "%1 نباشد", - "OPERATORS_JOIN": "چسباندن %1 به %2", - "OPERATORS_JOIN_APPLE": "سیب", - "OPERATORS_JOIN_BANANA": "موز", - "OPERATORS_LETTEROF": "حرف %1 ام از %2", - "OPERATORS_LETTEROF_APPLE": "یک", - "OPERATORS_LENGTH": "طول %1", - "OPERATORS_CONTAINS": "%1 شامل %2 است؟", - "OPERATORS_MOD": "باقیمانده‌ی تقسیم %1 به %2", - "OPERATORS_ROUND": "%1 را گرد کن", - "OPERATORS_MATHOP": "%1 از %2", - "OPERATORS_MATHOP_ABS": "قدر مطلق", - "OPERATORS_MATHOP_FLOOR": "کف", - "OPERATORS_MATHOP_CEILING": "سقف", - "OPERATORS_MATHOP_SQRT": "جذر", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "تعریف %1", - "SENSING_TOUCHINGOBJECT": "%1 را لمس می‌کند؟", - "SENSING_TOUCHINGOBJECT_POINTER": "اشاره گر ماوس", - "SENSING_TOUCHINGOBJECT_EDGE": "لبه", - "SENSING_TOUCHINGCOLOR": "رنگ %1 را لمس می‌کند؟", - "SENSING_COLORISTOUCHINGCOLOR": "رنگ %1 ، %2 را لمس می‌کند؟", - "SENSING_DISTANCETO": "فاصله تا %1", - "SENSING_DISTANCETO_POINTER": "اشاره گر ماوس", - "SENSING_ASKANDWAIT": "بپرس %1 و صبر کن", - "SENSING_ASK_TEXT": "اسم شما چیه؟", - "SENSING_ANSWER": "پاسخ", - "SENSING_KEYPRESSED": "کلید %1 فشرده شده؟", - "SENSING_MOUSEDOWN": "دکمه‌ی ماوس پایین نگه داشته شده؟", - "SENSING_MOUSEX": "مکان x ماوس", - "SENSING_MOUSEY": "مکان y ماوس", - "SENSING_SETDRAGMODE": "امکان کشیده شدن را در حالت %1 قرار بده", - "SENSING_SETDRAGMODE_DRAGGABLE": "قابل کشیدن", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "غیر قابل کشیدن", - "SENSING_LOUDNESS": "بلندی صدا", - "SENSING_LOUD": "صدا بلند است؟", - "SENSING_TIMER": "زمان سنج", - "SENSING_RESETTIMER": "تنظیم مجدد زمان سنج", - "SENSING_OF": "%1 از %2", - "SENSING_OF_XPOSITION": "مکان x", - "SENSING_OF_YPOSITION": "مکان y", - "SENSING_OF_DIRECTION": "جهت", - "SENSING_OF_COSTUMENUMBER": "حالت #", - "SENSING_OF_COSTUMENAME": "نام حالت", - "SENSING_OF_SIZE": "اندازه", - "SENSING_OF_VOLUME": "درجه‌ی صدا", - "SENSING_OF_BACKDROPNUMBER": "پس‌زمینه #", - "SENSING_OF_BACKDROPNAME": "نام پس‌زمینه", - "SENSING_OF_STAGE": "صحنه", - "SENSING_CURRENT": "%1 فعلی", - "SENSING_CURRENT_YEAR": "سال", - "SENSING_CURRENT_MONTH": "ماه", - "SENSING_CURRENT_DATE": "تاریخ", - "SENSING_CURRENT_DAYOFWEEK": "روز هفته", - "SENSING_CURRENT_HOUR": "ساعت", - "SENSING_CURRENT_MINUTE": "دقیقه", - "SENSING_CURRENT_SECOND": "ثانیه", - "SENSING_DAYSSINCE2000": "تعداد روز‌ها از سال ۲۰۰۰ میلادی تا کنون", - "SENSING_USERNAME": "نام کاربری", - "SENSING_USERID": "شناسه‌ی کاربر", - "SOUND_PLAY": "شروع صدای %1", - "SOUND_PLAYUNTILDONE": "پخش صدای %1 تا وقتی که تمام شود", - "SOUND_STOPALLSOUNDS": "همه‌ی صدا‌ها را متوقف کن", - "SOUND_SETEFFECTO": "جلوه‌ی %1 را %2 قرار بده", - "SOUND_CHANGEEFFECTBY": "جلوه‌ی %1 را به میزان %2 تغییر بده", - "SOUND_CLEAREFFECTS": "جلوه‌های صدا را پاک کن", - "SOUND_EFFECTS_PITCH": "گام ", - "SOUND_EFFECTS_PAN": "قاب چپ/راست", - "SOUND_CHANGEVOLUMEBY": "درجه‌ی صدا را به میزان %1 تغییر بده", - "SOUND_SETVOLUMETO": "درجه‌ی صدا را %1% قرار بده", - "SOUND_VOLUME": "درجه‌ی صدا", - "SOUND_RECORD": "ضبط کردن...", - "CATEGORY_MOTION": "حرکت", - "CATEGORY_LOOKS": "ظاهر‌", - "CATEGORY_SOUND": "صدا", - "CATEGORY_EVENTS": "رویدادها", - "CATEGORY_CONTROL": "کنترل", - "CATEGORY_SENSING": "تشخیص", - "CATEGORY_OPERATORS": "عملگرها", - "CATEGORY_VARIABLES": "متغیرها", - "CATEGORY_MYBLOCKS": "قطعه‌های من", - "DUPLICATE": "تکثیر کردن", - "DELETE": "حذف", - "ADD_COMMENT": "افزودن توضیح", - "REMOVE_COMMENT": "حذف توضیح", - "DELETE_BLOCK": "حذف قطعه", - "DELETE_X_BLOCKS": "حذف هر %1 قطعه‌", - "DELETE_ALL_BLOCKS": "همه‌ی %1 قطعه حذف شوند؟", - "CLEAN_UP": "مرتب کردن قطعه‌ها", - "HELP": "راهنما", - "UNDO": "لغو کردن", - "REDO": "دوباره انجام دادن", - "EDIT_PROCEDURE": "ویرایش", - "SHOW_PROCEDURE_DEFINITION": "به محل تعریف شده برو", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "چیزی بگو...", - "COLOUR_HUE_LABEL": "رنگ", - "COLOUR_SATURATION_LABEL": "خلوص رنگ", - "COLOUR_BRIGHTNESS_LABEL": "روشنایی", - "CHANGE_VALUE_TITLE": "تغییر مقدار:", - "RENAME_VARIABLE": "تغییر نام متغیر", - "RENAME_VARIABLE_TITLE": "تغییر نام همه‌‌‌ی متغیر‌های \"%1\" به:", - "RENAME_VARIABLE_MODAL_TITLE": "تغییر نام متغیر", - "NEW_VARIABLE": "ایجاد یک متغیر", - "NEW_VARIABLE_TITLE": "نام متغیر جدید:", - "VARIABLE_MODAL_TITLE": "متغیر جدید", - "VARIABLE_ALREADY_EXISTS": "متغیری با نام \"%1\" هم‌اکنون وجود دارد.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "هم‌اکنون نام \"%1\" برای متغیر دیگری از نوع %2 وجود دارد", - "DELETE_VARIABLE_CONFIRMATION": "ِآیا هر %1 موردی که از متغیر \"%2\" استفاده شده است، حذف شود؟", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "امکان حذف متغیر \"%1\" نیست. زیرا جزئی از تعریف تابع \"%2\" است", - "DELETE_VARIABLE": "حذف متغیر \"%1\"", - "NEW_PROCEDURE": "ایجاد یک قطعه", - "PROCEDURE_ALREADY_EXISTS": "هم اکنون روالی به اسم \"%1\" وجود دارد.", - "PROCEDURE_DEFAULT_NAME": "نام قطعه", - "NEW_LIST": "ایجاد یک لیست", - "NEW_LIST_TITLE": "نام لیست جدید:", - "LIST_MODAL_TITLE": "لیست جدید", - "LIST_ALREADY_EXISTS": "هم اکنون لیستی به نام \"%1\" وجود دارد.", - "RENAME_LIST_TITLE": "تغییر نام همه‌ی لیست‌های \"%1\" به:", - "RENAME_LIST_MODAL_TITLE": "تغییر نام لیست", - "DEFAULT_LIST_ITEM": "چیز", - "DELETE_LIST": "حذف لیست «%1»", - "RENAME_LIST": "تغییر نام لیست", - "NEW_BROADCAST_MESSAGE": "پیام جدید", - "NEW_BROADCAST_MESSAGE_TITLE": "نام پیام جدید:", - "BROADCAST_MODAL_TITLE": "پیام جدید", - "DEFAULT_BROADCAST_MESSAGE_NAME": "پیام 1" -}; - -Blockly.ScratchMsgs.locales["fr"] = -{ - "CONTROL_FOREVER": "répéter indéfiniment", - "CONTROL_REPEAT": "répéter %1 fois", - "CONTROL_IF": "si %1 alors", - "CONTROL_ELSE": "sinon", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "tout", - "CONTROL_STOP_THIS": "ce script", - "CONTROL_STOP_OTHER": "autres scripts dans sprite", - "CONTROL_WAIT": "attendre %1 secondes", - "CONTROL_WAITUNTIL": "attendre jusqu'à ce que %1", - "CONTROL_REPEATUNTIL": "répéter jusqu'à ce que %1", - "CONTROL_WHILE": "tant que %1", - "CONTROL_FOREACH": "pour chaque %1 dans %2", - "CONTROL_STARTASCLONE": "quand je commence comme un clone", - "CONTROL_CREATECLONEOF": "créer un clone de %1", - "CONTROL_CREATECLONEOF_MYSELF": "moi-même", - "CONTROL_DELETETHISCLONE": "supprimer ce clone", - "CONTROL_COUNTER": "compteur", - "CONTROL_INCRCOUNTER": "incrémenter le compteur", - "CONTROL_CLEARCOUNTER": "effacer le compteur", - "CONTROL_ALLATONCE": "tous en même temps", - "DATA_SETVARIABLETO": "mettre %1 à %2", - "DATA_CHANGEVARIABLEBY": "ajouter %2 à %1", - "DATA_SHOWVARIABLE": "montrer la variable %1", - "DATA_HIDEVARIABLE": "cacher la variable %1", - "DATA_ADDTOLIST": "ajouter %1 à %2", - "DATA_DELETEOFLIST": "supprimer l'élément %1 de %2", - "DATA_DELETEALLOFLIST": "supprimer tous les éléments de la liste %1", - "DATA_INSERTATLIST": "insérer %1 en position %2 de %3", - "DATA_REPLACEITEMOFLIST": "remplacer l'élément %1 de la liste %2 par %3", - "DATA_ITEMOFLIST": "élément %1 de %2", - "DATA_ITEMNUMOFLIST": "élément no %1 dans %2", - "DATA_LENGTHOFLIST": "longueur de %1", - "DATA_LISTCONTAINSITEM": "%1 contient %2 ?", - "DATA_SHOWLIST": "montrer la liste %1", - "DATA_HIDELIST": "cacher la liste %1", - "DATA_INDEX_ALL": "tout", - "DATA_INDEX_LAST": "dernier", - "DATA_INDEX_RANDOM": "au hasard", - "EVENT_WHENFLAGCLICKED": "quand %1 est cliqué", - "EVENT_WHENTHISSPRITECLICKED": "quand ce sprite est cliqué", - "EVENT_WHENSTAGECLICKED": "quand la scène est cliquée", - "EVENT_WHENTOUCHINGOBJECT": "quand ce sprite touche %1", - "EVENT_WHENBROADCASTRECEIVED": "quand je reçois %1", - "EVENT_WHENBACKDROPSWITCHESTO": "quand l'arrière-plan bascule sur %1", - "EVENT_WHENGREATERTHAN": "quand le %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "chronomètre", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volume sonore", - "EVENT_BROADCAST": "envoyer à tous %1", - "EVENT_BROADCASTANDWAIT": "envoyer à tous %1 et attendre", - "EVENT_WHENKEYPRESSED": "quand la touche %1 est pressée", - "EVENT_WHENKEYPRESSED_SPACE": "espace", - "EVENT_WHENKEYPRESSED_LEFT": "flèche gauche", - "EVENT_WHENKEYPRESSED_RIGHT": "flèche droite", - "EVENT_WHENKEYPRESSED_DOWN": "flèche bas", - "EVENT_WHENKEYPRESSED_UP": "flèche haut", - "EVENT_WHENKEYPRESSED_ANY": "n'importe laquelle", - "LOOKS_SAYFORSECS": "dire %1 pendant %2 secondes", - "LOOKS_SAY": "dire %1", - "LOOKS_HELLO": "Bonjour!", - "LOOKS_THINKFORSECS": "penser à %1 pendant %2 secondes", - "LOOKS_THINK": "penser à %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "montrer", - "LOOKS_HIDE": "cacher", - "LOOKS_HIDEALLSPRITES": "cacher tous les sprites", - "LOOKS_EFFECT_COLOR": "couleur", - "LOOKS_EFFECT_FISHEYE": "œil de poisson", - "LOOKS_EFFECT_WHIRL": "tournoyer", - "LOOKS_EFFECT_PIXELATE": "pixeliser", - "LOOKS_EFFECT_MOSAIC": "mosaïque", - "LOOKS_EFFECT_BRIGHTNESS": "luminosité", - "LOOKS_EFFECT_GHOST": "fantôme", - "LOOKS_CHANGEEFFECTBY": "ajouter %2 à l'effet %1", - "LOOKS_SETEFFECTTO": "mettre l'effet %1 à %2", - "LOOKS_CLEARGRAPHICEFFECTS": "annuler les effets graphiques", - "LOOKS_CHANGESIZEBY": "ajouter %1 à la taille", - "LOOKS_SETSIZETO": "mettre la taille à %1 % de la taille initiale", - "LOOKS_SIZE": "taille", - "LOOKS_CHANGESTRETCHBY": "ajouter %1 à l'étirement", - "LOOKS_SETSTRETCHTO": "mettre l'étirement à %1 %", - "LOOKS_SWITCHCOSTUMETO": "basculer sur le costume %1", - "LOOKS_NEXTCOSTUME": "costume suivant", - "LOOKS_SWITCHBACKDROPTO": "basculer sur l'arrière-plan %1", - "LOOKS_GOTOFRONTBACK": "aller à l'%1 plan", - "LOOKS_GOTOFRONTBACK_FRONT": "avant", - "LOOKS_GOTOFRONTBACK_BACK": "arrière", - "LOOKS_GOFORWARDBACKWARDLAYERS": "déplacer de %2 plans vers l'%1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "avant", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "arrière", - "LOOKS_BACKDROPNUMBERNAME": "%1 de l'arrière-plan", - "LOOKS_COSTUMENUMBERNAME": "%1 du costume", - "LOOKS_NUMBERNAME_NUMBER": "numéro", - "LOOKS_NUMBERNAME_NAME": "nom", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "basculer sur l'arrière-plan %1 et attendre", - "LOOKS_NEXTBACKDROP_BLOCK": "arrière-plan suivant", - "LOOKS_NEXTBACKDROP": "arrière-plan suivant", - "LOOKS_PREVIOUSBACKDROP": "arrière-plan précédent", - "LOOKS_RANDOMBACKDROP": "arrière-plan aléatoire", - "MOTION_MOVESTEPS": "avancer de %1 pas", - "MOTION_TURNLEFT": "tourner %1 de %2 degrés", - "MOTION_TURNRIGHT": "tourner %1 de %2 degrés", - "MOTION_POINTINDIRECTION": "s'orienter à %1", - "MOTION_POINTTOWARDS": "s'orienter vers %1", - "MOTION_POINTTOWARDS_POINTER": "pointeur de souris", - "MOTION_POINTTOWARDS_RANDOM": "direction aléatoire", - "MOTION_GOTO": "aller à %1", - "MOTION_GOTO_POINTER": "pointeur de souris", - "MOTION_GOTO_RANDOM": "position aléatoire", - "MOTION_GOTOXY": "aller à x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "glisser en %1 secondes à x: %2 y: %3", - "MOTION_GLIDETO": "glisser en %1 secondes à %2", - "MOTION_GLIDETO_POINTER": "pointeur de souris", - "MOTION_GLIDETO_RANDOM": "position aléatoire", - "MOTION_CHANGEXBY": "ajouter %1 à x", - "MOTION_SETX": "mettre x à %1", - "MOTION_CHANGEYBY": "ajouter %1 à y", - "MOTION_SETY": "mettre y à %1", - "MOTION_IFONEDGEBOUNCE": "rebondir si le bord est atteint", - "MOTION_SETROTATIONSTYLE": "fixer le sens de rotation %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "gauche-droite", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ne tourne pas", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "à 360°", - "MOTION_XPOSITION": "abscisse x", - "MOTION_YPOSITION": "ordonnée y", - "MOTION_DIRECTION": "direction", - "MOTION_SCROLLRIGHT": "défiler à droite de %1", - "MOTION_SCROLLUP": "défiler en haut de %1", - "MOTION_ALIGNSCENE": "aligner la scène %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "bas-gauche", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bas-droite", - "MOTION_ALIGNSCENE_MIDDLE": "milieu", - "MOTION_ALIGNSCENE_TOPLEFT": "haut-gauche", - "MOTION_ALIGNSCENE_TOPRIGHT": "haut-droite", - "MOTION_XSCROLL": "défilement x", - "MOTION_YSCROLL": "défilement y", - "MOTION_STAGE_SELECTED": "Scène sélectionnée: pas de blocs de mouvement", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "nombre aléatoire entre %1 et %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 et %2", - "OPERATORS_OR": "%1 ou %2", - "OPERATORS_NOT": "non %1", - "OPERATORS_JOIN": "regrouper %1 et %2", - "OPERATORS_JOIN_APPLE": "pomme", - "OPERATORS_JOIN_BANANA": "banane", - "OPERATORS_LETTEROF": "lettre %1 de %2", - "OPERATORS_LETTEROF_APPLE": "p", - "OPERATORS_LENGTH": "longueur de %1", - "OPERATORS_CONTAINS": "%1 contient %2 ?", - "OPERATORS_MOD": "%1 modulo %2", - "OPERATORS_ROUND": "arrondi de %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "plancher", - "OPERATORS_MATHOP_CEILING": "plafond", - "OPERATORS_MATHOP_SQRT": "racine", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e^", - "OPERATORS_MATHOP_10EXP": "10^", - "PROCEDURES_DEFINITION": "définir %1", - "SENSING_TOUCHINGOBJECT": "touche le %1 ?", - "SENSING_TOUCHINGOBJECT_POINTER": "pointeur de souris", - "SENSING_TOUCHINGOBJECT_EDGE": "bord", - "SENSING_TOUCHINGCOLOR": "couleur %1 touchée ?", - "SENSING_COLORISTOUCHINGCOLOR": "couleur %1 touche %2 ?", - "SENSING_DISTANCETO": "distance de %1", - "SENSING_DISTANCETO_POINTER": "pointeur de souris", - "SENSING_ASKANDWAIT": "demander %1 et attendre", - "SENSING_ASK_TEXT": "Quel est ton nom?", - "SENSING_ANSWER": "réponse", - "SENSING_KEYPRESSED": "touche %1 pressée ?", - "SENSING_MOUSEDOWN": "souris pressée ?", - "SENSING_MOUSEX": "souris x", - "SENSING_MOUSEY": "souris y", - "SENSING_SETDRAGMODE": "mettre mode de glissement à %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "glissable", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "non glissable", - "SENSING_LOUDNESS": "volume sonore", - "SENSING_LOUD": "fort ?", - "SENSING_TIMER": "chronomètre", - "SENSING_RESETTIMER": "réinitialiser le chronomètre", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "abscisse x", - "SENSING_OF_YPOSITION": "ordonnée y", - "SENSING_OF_DIRECTION": "direction", - "SENSING_OF_COSTUMENUMBER": "numéro de costume", - "SENSING_OF_COSTUMENAME": "nom du costume", - "SENSING_OF_SIZE": "taille", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "numéro de l'arrière-plan", - "SENSING_OF_BACKDROPNAME": "nom de l'arrière-plan", - "SENSING_OF_STAGE": "la scène", - "SENSING_CURRENT": "%1 actuelle", - "SENSING_CURRENT_YEAR": "année", - "SENSING_CURRENT_MONTH": "mois", - "SENSING_CURRENT_DATE": "date", - "SENSING_CURRENT_DAYOFWEEK": "jour de la semaine", - "SENSING_CURRENT_HOUR": "heure", - "SENSING_CURRENT_MINUTE": "minute", - "SENSING_CURRENT_SECOND": "seconde", - "SENSING_DAYSSINCE2000": "jours depuis 2000", - "SENSING_USERNAME": "nom d'utilisateur", - "SENSING_USERID": "id de l'utilisateur", - "SOUND_PLAY": "jouer le son %1", - "SOUND_PLAYUNTILDONE": "jouer le son %1 jusqu'au bout", - "SOUND_STOPALLSOUNDS": "arrêter tous les sons", - "SOUND_SETEFFECTO": "mettre l'effet %1 à %2", - "SOUND_CHANGEEFFECTBY": "ajouter %2 à l'effet %1", - "SOUND_CLEAREFFECTS": "annuler tous les effets sonores", - "SOUND_EFFECTS_PITCH": "hauteur", - "SOUND_EFFECTS_PAN": "stéréo gauche/droite", - "SOUND_CHANGEVOLUMEBY": "ajouter %1 au volume", - "SOUND_SETVOLUMETO": "mettre le volume à %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "enregistrer...", - "CATEGORY_MOTION": "Mouvement", - "CATEGORY_LOOKS": "Apparence", - "CATEGORY_SOUND": "Son", - "CATEGORY_EVENTS": "Événements", - "CATEGORY_CONTROL": "Contrôle", - "CATEGORY_SENSING": "Capteurs", - "CATEGORY_OPERATORS": "Opérateurs", - "CATEGORY_VARIABLES": "Variables", - "CATEGORY_MYBLOCKS": "Mes Blocs", - "DUPLICATE": "Dupliquer", - "DELETE": "Supprimer", - "ADD_COMMENT": "Ajouter un commentaire", - "REMOVE_COMMENT": "Retirer le commentaire", - "DELETE_BLOCK": "Supprimer le bloc", - "DELETE_X_BLOCKS": "Supprimer %1 blocs", - "DELETE_ALL_BLOCKS": "Supprimer tous les %1 blocs ?", - "CLEAN_UP": "Nettoyer les blocs", - "HELP": "Aide", - "UNDO": "Restaurer", - "REDO": "Refaire", - "EDIT_PROCEDURE": "Modifier", - "SHOW_PROCEDURE_DEFINITION": "Aller à la définition", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dire quelque chose...", - "COLOUR_HUE_LABEL": "Couleur", - "COLOUR_SATURATION_LABEL": "Saturation", - "COLOUR_BRIGHTNESS_LABEL": "Luminosité", - "CHANGE_VALUE_TITLE": "Changer la valeur:", - "RENAME_VARIABLE": "Renommer la variable", - "RENAME_VARIABLE_TITLE": "Renommer toutes les variables \"%1\" en:", - "RENAME_VARIABLE_MODAL_TITLE": "Renommer la variable", - "NEW_VARIABLE": "Créer une variable", - "NEW_VARIABLE_TITLE": "Nouveau nom de la variable", - "VARIABLE_MODAL_TITLE": "Nouvelle variable", - "VARIABLE_ALREADY_EXISTS": "Une variable nommé \"%1\" existe déjà.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Une variable nommée \"%1\" existe déjà pour une autre variable de type \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Supprimer %1 utilisations de la variable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Impossible de supprimer la variable \"%1\" car elle fait partie de la définition de la fonction \"%2\"", - "DELETE_VARIABLE": "Supprimer la variable \"%1\"", - "NEW_PROCEDURE": "Créer un bloc", - "PROCEDURE_ALREADY_EXISTS": "Une procédure nommée \"%1\" existe déjà.", - "PROCEDURE_DEFAULT_NAME": "nom du bloc", - "NEW_LIST": "Créer une liste", - "NEW_LIST_TITLE": "Nom de la nouvelle liste:", - "LIST_MODAL_TITLE": "Nouvelle liste", - "LIST_ALREADY_EXISTS": "Une liste nommée \"%1\" existe déjà.", - "RENAME_LIST_TITLE": "Renommer toutes les listes \"%1\" en:", - "RENAME_LIST_MODAL_TITLE": "Renommer la liste", - "DEFAULT_LIST_ITEM": "chose", - "DELETE_LIST": "Supprimer la liste \"%1\"", - "RENAME_LIST": "Renommer la liste", - "NEW_BROADCAST_MESSAGE": "Nouveau message", - "NEW_BROADCAST_MESSAGE_TITLE": "Nom du nouveau message:", - "BROADCAST_MODAL_TITLE": "Nouveau message", - "DEFAULT_BROADCAST_MESSAGE_NAME": "message1" -}; - -Blockly.ScratchMsgs.locales["ga"] = -{ - "CONTROL_FOREVER": "go deo", - "CONTROL_REPEAT": "déan %1 uair", - "CONTROL_IF": "más %1 ansin", - "CONTROL_ELSE": "seachas sin", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "uile", - "CONTROL_STOP_THIS": "an script seo", - "CONTROL_STOP_OTHER": "scripteanna eile sa sprid", - "CONTROL_WAIT": "fan %1 soicind", - "CONTROL_WAITUNTIL": "fan go %1", - "CONTROL_REPEATUNTIL": "athdhéan go %1", - "CONTROL_WHILE": "chomh fada is %1", - "CONTROL_FOREACH": "do gach %1 i %2", - "CONTROL_STARTASCLONE": "nuair a thosaím mar chóip", - "CONTROL_CREATECLONEOF": "cruthaigh cóip de %1", - "CONTROL_CREATECLONEOF_MYSELF": "mise féin", - "CONTROL_DELETETHISCLONE": "scrios an chóip seo", - "CONTROL_COUNTER": "áiritheoir", - "CONTROL_INCRCOUNTER": "incrimintigh an t-áiritheoir", - "CONTROL_CLEARCOUNTER": "glan an t-áiritheoir", - "CONTROL_ALLATONCE": "d'aon iarraidh", - "DATA_SETVARIABLETO": "socraigh %1: %2", - "DATA_CHANGEVARIABLEBY": "athraigh %1 de %2", - "DATA_SHOWVARIABLE": "taispeáin athróg %1", - "DATA_HIDEVARIABLE": "folaigh athróg %1", - "DATA_ADDTOLIST": "cuir %1 le %2", - "DATA_DELETEOFLIST": "scrios %1 as %2", - "DATA_DELETEALLOFLIST": "scrios na %1 rud go léir", - "DATA_INSERTATLIST": "ionsáigh %1 ag %2 i %3", - "DATA_REPLACEITEMOFLIST": "cuir %3 in áit mír %1 i %2", - "DATA_ITEMOFLIST": "mír %1 as %2", - "DATA_ITEMNUMOFLIST": "mír # as %1 in %2", - "DATA_LENGTHOFLIST": "fad %1", - "DATA_LISTCONTAINSITEM": "%1 agus %2 ann?", - "DATA_SHOWLIST": "taispeáin liosta %1", - "DATA_HIDELIST": "folaigh liosta %1", - "DATA_INDEX_ALL": "uile", - "DATA_INDEX_LAST": "deireanach", - "DATA_INDEX_RANDOM": "randamach", - "EVENT_WHENFLAGCLICKED": "nuair a chliceáiltear %1", - "EVENT_WHENTHISSPRITECLICKED": "nuair a chliceáiltear an sprid seo", - "EVENT_WHENSTAGECLICKED": "nuair a chliceáiltear an stáitse", - "EVENT_WHENTOUCHINGOBJECT": "nuair a theagmhaíonn an sprid seo le %1", - "EVENT_WHENBROADCASTRECEIVED": "nuair a fhaighim %1", - "EVENT_WHENBACKDROPSWITCHESTO": "nuair a chuirtear %1 suas", - "EVENT_WHENGREATERTHAN": "nuair atá %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "amadóir", - "EVENT_WHENGREATERTHAN_LOUDNESS": "treise", - "EVENT_BROADCAST": "craol %1", - "EVENT_BROADCASTANDWAIT": "craol %1 agus fan", - "EVENT_WHENKEYPRESSED": "nuair a bhrúitear eochair %1", - "EVENT_WHENKEYPRESSED_SPACE": "spás", - "EVENT_WHENKEYPRESSED_LEFT": "saighead chlé", - "EVENT_WHENKEYPRESSED_RIGHT": "saighead dheas", - "EVENT_WHENKEYPRESSED_DOWN": "saighead síos", - "EVENT_WHENKEYPRESSED_UP": "saighead suas", - "EVENT_WHENKEYPRESSED_ANY": "ceann ar bith", - "LOOKS_SAYFORSECS": "abair %1 ar feadh %2 soicind", - "LOOKS_SAY": "abair %1", - "LOOKS_HELLO": "Dia dhuit!", - "LOOKS_THINKFORSECS": "smaoinigh %1 ar feadh %2 soicind", - "LOOKS_THINK": "smaoinigh %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "taispeáin", - "LOOKS_HIDE": "folaigh", - "LOOKS_HIDEALLSPRITES": "folaigh gach sprid", - "LOOKS_EFFECT_COLOR": "dath", - "LOOKS_EFFECT_FISHEYE": "súil an éisc", - "LOOKS_EFFECT_WHIRL": "rothlú", - "LOOKS_EFFECT_PIXELATE": "picteilíniú", - "LOOKS_EFFECT_MOSAIC": "mósáic", - "LOOKS_EFFECT_BRIGHTNESS": "gile", - "LOOKS_EFFECT_GHOST": "taibhse", - "LOOKS_CHANGEEFFECTBY": "athraigh maisíocht %1 de %2", - "LOOKS_SETEFFECTTO": "socraigh maisíocht %1: %2", - "LOOKS_CLEARGRAPHICEFFECTS": "glan na maisíochtaí grafaice", - "LOOKS_CHANGESIZEBY": "athraigh an mhéid de %1", - "LOOKS_SETSIZETO": "socraigh an mhéid: %1 %", - "LOOKS_SIZE": "méid", - "LOOKS_CHANGESTRETCHBY": "athraigh an síneadh de %1", - "LOOKS_SETSTRETCHTO": "socraigh an síneadh: %1 %", - "LOOKS_SWITCHCOSTUMETO": "athraigh an chulaith go %1", - "LOOKS_NEXTCOSTUME": "an chéad chulaith eile", - "LOOKS_SWITCHBACKDROPTO": "athraigh an cúlra go %1", - "LOOKS_GOTOFRONTBACK": "téigh go dtí an tsraith %1", - "LOOKS_GOTOFRONTBACK_FRONT": "thosaigh", - "LOOKS_GOTOFRONTBACK_BACK": "dheiridh", - "LOOKS_GOFORWARDBACKWARDLAYERS": "téigh %1 %2 sraith", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ar aghaidh", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ar gcúl", - "LOOKS_BACKDROPNUMBERNAME": "cúlra %1", - "LOOKS_COSTUMENUMBERNAME": "culaith %1", - "LOOKS_NUMBERNAME_NUMBER": "uimhir", - "LOOKS_NUMBERNAME_NAME": "ainm", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "athraigh an cúlra go %1 agus fan", - "LOOKS_NEXTBACKDROP_BLOCK": "an chéad chúlra eile", - "LOOKS_NEXTBACKDROP": "an chéad chúlra eile", - "LOOKS_PREVIOUSBACKDROP": "cúlra roimhe seo", - "LOOKS_RANDOMBACKDROP": "cúlra randamach", - "MOTION_MOVESTEPS": "bog %1 coiscéim", - "MOTION_TURNLEFT": "rothlaigh %1 %2 céim", - "MOTION_TURNRIGHT": "rothlaigh %1 %2 céim", - "MOTION_POINTINDIRECTION": "tabhair aghaidh ar %1", - "MOTION_POINTTOWARDS": "tabhair aghaidh i dtreo %1", - "MOTION_POINTTOWARDS_POINTER": "pointeoir-luiche", - "MOTION_POINTTOWARDS_RANDOM": "treo randamach", - "MOTION_GOTO": "téigh go %1", - "MOTION_GOTO_POINTER": "pointeoir-luiche", - "MOTION_GOTO_RANDOM": "ionad randamach", - "MOTION_GOTOXY": "téigh go x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "sleamhnaigh %1 soicind go x: %2 y: %3", - "MOTION_GLIDETO": "sleamhnaigh %1 soicind go %2", - "MOTION_GLIDETO_POINTER": "pointeoir-luiche", - "MOTION_GLIDETO_RANDOM": "ionad randamach", - "MOTION_CHANGEXBY": "athraigh x de %1", - "MOTION_SETX": "socraigh x: %1", - "MOTION_CHANGEYBY": "athraigh y de %1", - "MOTION_SETY": "socraigh y: %1", - "MOTION_IFONEDGEBOUNCE": "más ar an imeall, preab", - "MOTION_SETROTATIONSTYLE": "socraigh an stíl rothlaithe: %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "clé-deas", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ná rothlaigh", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "timpeall ar fad", - "MOTION_XPOSITION": "ionad x", - "MOTION_YPOSITION": "ionad y", - "MOTION_DIRECTION": "treo", - "MOTION_SCROLLRIGHT": "scrollaigh ar dheis %1", - "MOTION_SCROLLUP": "scrollaigh suas %1", - "MOTION_ALIGNSCENE": "ailínigh radharc %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "bun ar chlé", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "bun ar dheis", - "MOTION_ALIGNSCENE_MIDDLE": "lár", - "MOTION_ALIGNSCENE_TOPLEFT": "barr ar chlé", - "MOTION_ALIGNSCENE_TOPRIGHT": "barr ar dheis", - "MOTION_XSCROLL": "scrollaigh x", - "MOTION_YSCROLL": "scrollaigh y", - "MOTION_STAGE_SELECTED": "Stáitse roghnaithe: gan bloic gluaiseachta", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "uimhir randamach idir %1 agus %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 agus %2", - "OPERATORS_OR": "%1 nó %2", - "OPERATORS_NOT": "séanadh %1", - "OPERATORS_JOIN": "ceangail %1 %2", - "OPERATORS_JOIN_APPLE": "úll", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "litir %1 de %2", - "OPERATORS_LETTEROF_APPLE": "ú", - "OPERATORS_LENGTH": "fad %1", - "OPERATORS_CONTAINS": "%1 agus %2 ann?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "slánaigh %1", - "OPERATORS_MATHOP": "%1 as %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "urlár", - "OPERATORS_MATHOP_CEILING": "síleáil", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "sainmhínigh %1", - "SENSING_TOUCHINGOBJECT": "i dteagmháil le %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "pointeoir-luiche", - "SENSING_TOUCHINGOBJECT_EDGE": "ciumhais", - "SENSING_TOUCHINGCOLOR": "i dteagmháil le dath %1?", - "SENSING_COLORISTOUCHINGCOLOR": "dath %1 i dteagmháil le %2?", - "SENSING_DISTANCETO": "fad go dtí %1", - "SENSING_DISTANCETO_POINTER": "pointeoir-luiche", - "SENSING_ASKANDWAIT": "fiafraigh %1 agus fan", - "SENSING_ASK_TEXT": "Cén t-ainm atá ort?", - "SENSING_ANSWER": "freagra", - "SENSING_KEYPRESSED": "eochair %1 brúite?", - "SENSING_MOUSEDOWN": "luchóg síos?", - "SENSING_MOUSEX": "luchóg x", - "SENSING_MOUSEY": "luchóg y", - "SENSING_SETDRAGMODE": "socraigh mód tarraingthe: %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "intarraingthe", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "dotharraingthe", - "SENSING_LOUDNESS": "treise", - "SENSING_LOUD": "os ard?", - "SENSING_TIMER": "amadóir", - "SENSING_RESETTIMER": "athshocraigh an t-amadóir", - "SENSING_OF": "%1 as %2", - "SENSING_OF_XPOSITION": "ionad x", - "SENSING_OF_YPOSITION": "ionad y", - "SENSING_OF_DIRECTION": "treo", - "SENSING_OF_COSTUMENUMBER": "culaith #", - "SENSING_OF_COSTUMENAME": "ainm na culaithe", - "SENSING_OF_SIZE": "méid", - "SENSING_OF_VOLUME": "airde", - "SENSING_OF_BACKDROPNUMBER": "cúlra #", - "SENSING_OF_BACKDROPNAME": "ainm an chúlra", - "SENSING_OF_STAGE": "Stáitse", - "SENSING_CURRENT": "%1 reatha", - "SENSING_CURRENT_YEAR": "bliain", - "SENSING_CURRENT_MONTH": "mí", - "SENSING_CURRENT_DATE": "dáta", - "SENSING_CURRENT_DAYOFWEEK": "lá den tseachtain", - "SENSING_CURRENT_HOUR": "uair", - "SENSING_CURRENT_MINUTE": "nóiméad", - "SENSING_CURRENT_SECOND": "soicind", - "SENSING_DAYSSINCE2000": "laethanta ó 2000", - "SENSING_USERNAME": "ainm úsáideora", - "SENSING_USERID": "aitheantas úsáideora", - "SOUND_PLAY": "seinn fuaim %1", - "SOUND_PLAYUNTILDONE": "seinn fuaim %1 go dtí a deireadh", - "SOUND_STOPALLSOUNDS": "stop gach fuaim", - "SOUND_SETEFFECTO": "socraigh maisíocht %1: %2", - "SOUND_CHANGEEFFECTBY": "athraigh maisíocht %1 de %2", - "SOUND_CLEAREFFECTS": "glan na maisíochtaí fuaime", - "SOUND_EFFECTS_PITCH": "tuinairde", - "SOUND_EFFECTS_PAN": "peanáil ar chlé/ar dheis", - "SOUND_CHANGEVOLUMEBY": "athraigh airde na fuaime de %1", - "SOUND_SETVOLUMETO": "socraigh airde na fuaime: %1%", - "SOUND_VOLUME": "airde", - "SOUND_RECORD": "taifead...", - "CATEGORY_MOTION": "Gluaiseacht", - "CATEGORY_LOOKS": "Cuma", - "CATEGORY_SOUND": "Fuaim", - "CATEGORY_EVENTS": "Teagmhais", - "CATEGORY_CONTROL": "Rialú", - "CATEGORY_SENSING": "Brath", - "CATEGORY_OPERATORS": "Oibreoirí", - "CATEGORY_VARIABLES": "Athróga", - "CATEGORY_MYBLOCKS": "Mo Chuid Blocanna", - "DUPLICATE": "Cóipeáil", - "DELETE": "Scrios", - "ADD_COMMENT": "Cuir Nóta Tráchta Leis", - "REMOVE_COMMENT": "Bain an Nóta Tráchta", - "DELETE_BLOCK": "Scrios an Bloc", - "DELETE_X_BLOCKS": "Scrios %1 Bloc", - "DELETE_ALL_BLOCKS": "Scrios na %1 bloc go léir?", - "CLEAN_UP": "Glan na Blocanna", - "HELP": "Cabhair", - "UNDO": "Cealaigh", - "REDO": "Athdhéan", - "EDIT_PROCEDURE": "Eagar", - "SHOW_PROCEDURE_DEFINITION": "Taispeáin an sainmhíniú", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Abair rud éigin...", - "COLOUR_HUE_LABEL": "Dath", - "COLOUR_SATURATION_LABEL": "Sáithiú", - "COLOUR_BRIGHTNESS_LABEL": "Gile", - "CHANGE_VALUE_TITLE": "Athraigh an luach:", - "RENAME_VARIABLE": "Cuir ainm nua ar an athróg", - "RENAME_VARIABLE_TITLE": "Cuir ainm nua ar gach athróg \"%1\":", - "RENAME_VARIABLE_MODAL_TITLE": "Cuir Ainm Nua ar an Athróg", - "NEW_VARIABLE": "Cruthaigh Athróg", - "NEW_VARIABLE_TITLE": "Ainm na hathróige nua:", - "VARIABLE_MODAL_TITLE": "Athróg Nua", - "VARIABLE_ALREADY_EXISTS": "Tá athróg darb ainm \"%1\" ann cheana.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Tá athróg darb ainm \"%1\" ann cheana, athróg eile de chineál \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Scrios %1 cóip den athróg \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ní féidir athróg \"%1\" a scriosadh toisc gur cuid den sainmhíniú ar fheidhm \"%2\" í.", - "DELETE_VARIABLE": "Scrios an athróg \"%1\"", - "NEW_PROCEDURE": "Cruthaigh Bloc", - "PROCEDURE_ALREADY_EXISTS": "Tá feidhm darb ainm \"%1\" ann cheana.", - "PROCEDURE_DEFAULT_NAME": "ainm an bhloic", - "NEW_LIST": "Cruthaigh Liosta", - "NEW_LIST_TITLE": "Ainm an liosta nua:", - "LIST_MODAL_TITLE": "Liosta Nua", - "LIST_ALREADY_EXISTS": "Tá liosta darb ainm \"%1\" ann cheana.", - "RENAME_LIST_TITLE": "Cuir ainm nua ar gach liosta \"%1\":", - "RENAME_LIST_MODAL_TITLE": "Cuir ainm nua ar an liosta", - "DEFAULT_LIST_ITEM": "rud", - "DELETE_LIST": "Scrios liosta \"%1\"", - "RENAME_LIST": "Cuir ainm nua ar an liosta", - "NEW_BROADCAST_MESSAGE": "Teachtaireacht nua", - "NEW_BROADCAST_MESSAGE_TITLE": "Ainm na teachtaireachta nua:", - "BROADCAST_MODAL_TITLE": "Teachtaireacht Nua", - "DEFAULT_BROADCAST_MESSAGE_NAME": "teachtaireacht1" -}; - -Blockly.ScratchMsgs.locales["gd"] = -{ - "CONTROL_FOREVER": "gu buan", - "CONTROL_REPEAT": "dèan seo %1 turas", - "CONTROL_IF": "ma tha %1 a-rèiste", - "CONTROL_ELSE": "air neo", - "CONTROL_STOP": "cuir stad air", - "CONTROL_STOP_ALL": "na h-uile", - "CONTROL_STOP_THIS": "an sgriobt seo", - "CONTROL_STOP_OTHER": "sgriobtaichean eile na sprìde", - "CONTROL_WAIT": "fan fad %1 diog", - "CONTROL_WAITUNTIL": "fan gus am bi %1", - "CONTROL_REPEATUNTIL": "dèan a-rithist e gus am bi %1", - "CONTROL_WHILE": "fhad ’s a tha %1", - "CONTROL_FOREACH": "airson gach %1 air %2", - "CONTROL_STARTASCLONE": "nuair a thèid thu nad chlòn", - "CONTROL_CREATECLONEOF": "cruthaich clòn %1", - "CONTROL_CREATECLONEOF_MYSELF": "dhut fhèin", - "CONTROL_DELETETHISCLONE": "sguab às an clòn seo", - "CONTROL_COUNTER": "cunntair", - "CONTROL_INCRCOUNTER": "cunntair ioncramaide", - "CONTROL_CLEARCOUNTER": "falamhaich an cunntair", - "CONTROL_ALLATONCE": "a h-uile gin aig an aon àm", - "DATA_SETVARIABLETO": "suidhich %1 air %2", - "DATA_CHANGEVARIABLEBY": "atharraich %1 le %2", - "DATA_SHOWVARIABLE": "seall an caochladair %1", - "DATA_HIDEVARIABLE": "falaich an caochladair %1", - "DATA_ADDTOLIST": "cuir %1 ri %2", - "DATA_DELETEOFLIST": "sguab às %1 de %2", - "DATA_DELETEALLOFLIST": "sguab às na h-uile gin de %1", - "DATA_INSERTATLIST": "cuir %1 ris aig %2 de %3", - "DATA_REPLACEITEMOFLIST": "cuir %3 an àite nì %1 de %2", - "DATA_ITEMOFLIST": "nì %1 de %2", - "DATA_ITEMNUMOFLIST": "àireamh an nì %1 air %2", - "DATA_LENGTHOFLIST": "an fhaide aig %1", - "DATA_LISTCONTAINSITEM": "%2 am broinn %1", - "DATA_SHOWLIST": "seall an liosta %1", - "DATA_HIDELIST": "falaich an liosta %1", - "DATA_INDEX_ALL": "na h-uile", - "DATA_INDEX_LAST": "am fear mu dheireadh", - "DATA_INDEX_RANDOM": "tuaireamach", - "EVENT_WHENFLAGCLICKED": "le briogadh air %1", - "EVENT_WHENTHISSPRITECLICKED": "le briogadh air an sprìd seo", - "EVENT_WHENSTAGECLICKED": "le briogadh air an àrd-ùrlar", - "EVENT_WHENTOUCHINGOBJECT": "nuair a bhios an sprìd a’ beantainn ri %1", - "EVENT_WHENBROADCASTRECEIVED": "nuair a gheibh thu %1", - "EVENT_WHENBACKDROPSWITCHESTO": "nuair a thèid an cùlaibh na %1", - "EVENT_WHENGREATERTHAN": "nuair a thèid %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "an tìmear", - "EVENT_WHENGREATERTHAN_LOUDNESS": "àirde na fuaime", - "EVENT_BROADCAST": "craol %1", - "EVENT_BROADCASTANDWAIT": "craol %1 is fan", - "EVENT_WHENKEYPRESSED": "le brùthadh air iuchair %1", - "EVENT_WHENKEYPRESSED_SPACE": "spàis", - "EVENT_WHENKEYPRESSED_LEFT": "saighde gu clì", - "EVENT_WHENKEYPRESSED_RIGHT": "saighde gu deas", - "EVENT_WHENKEYPRESSED_DOWN": "saighde sìos", - "EVENT_WHENKEYPRESSED_UP": "saighde suas", - "EVENT_WHENKEYPRESSED_ANY": "sam bith", - "LOOKS_SAYFORSECS": "can %1 fad %2 diog", - "LOOKS_SAY": "can %1", - "LOOKS_HELLO": "Shin thu!", - "LOOKS_THINKFORSECS": "smaoinich %1 fad %2 diog", - "LOOKS_THINK": "smaoinich %1", - "LOOKS_HMM": "An-dà…", - "LOOKS_SHOW": "seall", - "LOOKS_HIDE": "falaich", - "LOOKS_HIDEALLSPRITES": "cuir gach sprìd am falach", - "LOOKS_EFFECT_COLOR": "datha", - "LOOKS_EFFECT_FISHEYE": "sùil èisg", - "LOOKS_EFFECT_WHIRL": "cuairteige", - "LOOKS_EFFECT_PIXELATE": "phiogsailean", - "LOOKS_EFFECT_MOSAIC": "mosàig", - "LOOKS_EFFECT_BRIGHTNESS": "soilleireachd", - "LOOKS_EFFECT_GHOST": "taibhse", - "LOOKS_CHANGEEFFECTBY": "atharraich èifeachd %1 le %2", - "LOOKS_SETEFFECTTO": "cuir èifeachd %1 de %2 ort", - "LOOKS_CLEARGRAPHICEFFECTS": "falamhaich na h-èifeachdan", - "LOOKS_CHANGESIZEBY": "atharraich do mheud le %1", - "LOOKS_SETSIZETO": "suidhich do mheud air %1 %", - "LOOKS_SIZE": "meud", - "LOOKS_CHANGESTRETCHBY": "atharraich an sìneadh le %1", - "LOOKS_SETSTRETCHTO": "suidhich an sìneadh air %1 %", - "LOOKS_SWITCHCOSTUMETO": "cuir dreach %1 ort", - "LOOKS_NEXTCOSTUME": "an t-ath-dhreach", - "LOOKS_SWITCHBACKDROPTO": "cuir %1 air a’ chùlaibh", - "LOOKS_GOTOFRONTBACK": "rach gu breath %1", - "LOOKS_GOTOFRONTBACK_FRONT": "an fhìor-bheulaibh", - "LOOKS_GOTOFRONTBACK_BACK": "an fhìor-chùlaibh", - "LOOKS_GOFORWARDBACKWARDLAYERS": "rach %2 breath %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "an comhair a’ bheòil", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "an comhair a’ chùil", - "LOOKS_BACKDROPNUMBERNAME": "%1 a’ chùlaibh", - "LOOKS_COSTUMENUMBERNAME": "%1 an dreacha", - "LOOKS_NUMBERNAME_NUMBER": "àireamh", - "LOOKS_NUMBERNAME_NAME": "ainm", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "cuir %1 air a’ chùlaibh is fan", - "LOOKS_NEXTBACKDROP_BLOCK": "an t-ath-chùlaibh", - "LOOKS_NEXTBACKDROP": "an t-ath-chùlaibh", - "LOOKS_PREVIOUSBACKDROP": "a’ chùlaibh roimhe", - "LOOKS_RANDOMBACKDROP": "cùlaibh air thuaiream", - "MOTION_MOVESTEPS": "gluais le %1 ceum", - "MOTION_TURNLEFT": "cuairtich %1 le %2 ceum", - "MOTION_TURNRIGHT": "cuairtich %1 le %2 ceum", - "MOTION_POINTINDIRECTION": "cuir d’ aghaidh ri %1", - "MOTION_POINTTOWARDS": "cuir d’ aghaidh an comhair %1", - "MOTION_POINTTOWARDS_POINTER": "tomhaire na luchaige", - "MOTION_POINTTOWARDS_RANDOM": "tuaireamach", - "MOTION_GOTO": "rach gu %1", - "MOTION_GOTO_POINTER": "tomhaire na luchaige", - "MOTION_GOTO_RANDOM": "ionad air thuaiream", - "MOTION_GOTOXY": "rach gu x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "gluais fad %1 diog gu x: %2 y: %3", - "MOTION_GLIDETO": "gluais fad %1 diog gu %2", - "MOTION_GLIDETO_POINTER": "tomhaire na luchaige", - "MOTION_GLIDETO_RANDOM": "ionad air thuaiream", - "MOTION_CHANGEXBY": "atharraich x le %1", - "MOTION_SETX": "suidhich x air %1", - "MOTION_CHANGEYBY": "atharraich y le %1", - "MOTION_SETY": "suidhich y air %1", - "MOTION_IFONEDGEBOUNCE": "ma tha thu ris an oir, boc", - "MOTION_SETROTATIONSTYLE": "suidhich stoidhle na cuairte air %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "clì is deas", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "gun chuairteachadh", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "cuairt shlàn", - "MOTION_XPOSITION": "ionad x", - "MOTION_YPOSITION": "ionad y", - "MOTION_DIRECTION": "comhair", - "MOTION_SCROLLRIGHT": "sgrolaich gu deas le %1", - "MOTION_SCROLLUP": "sgrolaich suas le %1", - "MOTION_ALIGNSCENE": "co-thaobhaich an sealladh dhan %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "taobh clì aig a’ bhonn", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "taobh deas aig a’ bhonn", - "MOTION_ALIGNSCENE_MIDDLE": "mheadhan", - "MOTION_ALIGNSCENE_TOPLEFT": "taobh clì aig a’ bhàrr", - "MOTION_ALIGNSCENE_TOPRIGHT": "taobh deas aig a’ bhàrr", - "MOTION_XSCROLL": "sgroladh x", - "MOTION_YSCROLL": "sgroladh y", - "MOTION_STAGE_SELECTED": "Chan eil bloca gluasaid an-seo on a thagh thu àrd-ùrlar", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 × %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "luach tuaireamach eadar %1 is %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 agus %2", - "OPERATORS_OR": "%1 no %2", - "OPERATORS_NOT": "e fallsa gu bheil %1", - "OPERATORS_JOIN": "ceangail %1 ri %2", - "OPERATORS_JOIN_APPLE": "eòrna", - "OPERATORS_JOIN_BANANA": "seagal", - "OPERATORS_LETTEROF": "litir %1 de %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "an fhaide aig %1", - "OPERATORS_CONTAINS": "%2 am broinn %1", - "OPERATORS_MOD": "%1 mòidealas %2", - "OPERATORS_ROUND": "cuairtich %1", - "OPERATORS_MATHOP": "%1 aig %2", - "OPERATORS_MATHOP_ABS": "an luach absaloideach", - "OPERATORS_MATHOP_FLOOR": "an cuairteachadh sìos", - "OPERATORS_MATHOP_CEILING": "an cuairteachadh suas", - "OPERATORS_MATHOP_SQRT": "am freumh ceàrnagach", - "OPERATORS_MATHOP_SIN": "an sìneas", - "OPERATORS_MATHOP_COS": "an co-shìneas", - "OPERATORS_MATHOP_TAN": "am beantan", - "OPERATORS_MATHOP_ASIN": "an t-àrc-shìneas", - "OPERATORS_MATHOP_ACOS": "an t-àrc-cho-shìneas", - "OPERATORS_MATHOP_ATAN": "an t-àrc-bheantan", - "OPERATORS_MATHOP_LN": "an log-àireamh nàdarra", - "OPERATORS_MATHOP_LOG": "an log-àireamh", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "mìnich %1", - "SENSING_TOUCHINGOBJECT": "%1 a’ beantainn riut", - "SENSING_TOUCHINGOBJECT_POINTER": "tomhaire na luchaige", - "SENSING_TOUCHINGOBJECT_EDGE": "an oir", - "SENSING_TOUCHINGCOLOR": "an dath %1 a’ beantainn riut", - "SENSING_COLORISTOUCHINGCOLOR": "an dath %1 a’ beantainn ri %2", - "SENSING_DISTANCETO": "an t-astar gu %1", - "SENSING_DISTANCETO_POINTER": "tomhaire na luchaige", - "SENSING_ASKANDWAIT": "faighnich %1 is fan", - "SENSING_ASK_TEXT": "Dè an t-ainm a th’ort?", - "SENSING_ANSWER": "freagairt", - "SENSING_KEYPRESSED": "iuchair %1 ga brùthadh", - "SENSING_MOUSEDOWN": "an luchag ga briogadh", - "SENSING_MOUSEX": "x na luchaige", - "SENSING_MOUSEY": "y na luchaige", - "SENSING_SETDRAGMODE": "suidhich %1 a shlaodadh", - "SENSING_SETDRAGMODE_DRAGGABLE": "gun gabh", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nach gabh", - "SENSING_LOUDNESS": "àirde na fuaime", - "SENSING_LOUD": "an fhuaim air", - "SENSING_TIMER": "an tìmear", - "SENSING_RESETTIMER": "ath-shuidhich an tìmear", - "SENSING_OF": "%1 aig %2", - "SENSING_OF_XPOSITION": "ionad x", - "SENSING_OF_YPOSITION": "ionad y", - "SENSING_OF_DIRECTION": "comhair", - "SENSING_OF_COSTUMENUMBER": "àireamh an dreacha", - "SENSING_OF_COSTUMENAME": "ainm an dreacha", - "SENSING_OF_SIZE": "meud", - "SENSING_OF_VOLUME": "àirde na fuaime", - "SENSING_OF_BACKDROPNUMBER": "àireamh a’ chùlaibh", - "SENSING_OF_BACKDROPNAME": "ainm a’ chùlaibh", - "SENSING_OF_STAGE": "Àrd-ùrlar", - "SENSING_CURRENT": "%1 làithreach", - "SENSING_CURRENT_YEAR": "am bliadhna", - "SENSING_CURRENT_MONTH": "am mìos", - "SENSING_CURRENT_DATE": "an ceann-là", - "SENSING_CURRENT_DAYOFWEEK": "latha na seachdaine", - "SENSING_CURRENT_HOUR": "an uair", - "SENSING_CURRENT_MINUTE": "a’ mhionaid", - "SENSING_CURRENT_SECOND": "an diog", - "SENSING_DAYSSINCE2000": "làithean o 2000 a-mach", - "SENSING_USERNAME": "ainm-cleachdaiche", - "SENSING_USERID": "ID a’ chleachdaiche", - "SOUND_PLAY": "tòisich air fuaim %1 a chluich", - "SOUND_PLAYUNTILDONE": "cluich fuaim %1 gu lèir", - "SOUND_STOPALLSOUNDS": "cuir stad air a h-uile fuaim", - "SOUND_SETEFFECTO": "cuir èifeachd %1 de %2 ort", - "SOUND_CHANGEEFFECTBY": "atharraich èifeachd %1 le %2", - "SOUND_CLEAREFFECTS": "falamhaich èifeachdan na fuaime", - "SOUND_EFFECTS_PITCH": "gleusa", - "SOUND_EFFECTS_PAN": "panachaidh gu clì/deas", - "SOUND_CHANGEVOLUMEBY": "atharraich àirde na fuaime le %1", - "SOUND_SETVOLUMETO": "suidhich àirde na fuaime air %1%", - "SOUND_VOLUME": "àirde na fuaime", - "SOUND_RECORD": "clàraich...", - "CATEGORY_MOTION": "Gluasad", - "CATEGORY_LOOKS": "Coltas", - "CATEGORY_SOUND": "Fuaim", - "CATEGORY_EVENTS": "Tachartas", - "CATEGORY_CONTROL": "Smachd", - "CATEGORY_SENSING": "Mothachadh", - "CATEGORY_OPERATORS": "Gnìomharaiche", - "CATEGORY_VARIABLES": "Caochladairean", - "CATEGORY_MYBLOCKS": "Bloca agamsa", - "DUPLICATE": "Dùblaich", - "DELETE": "Sguab às", - "ADD_COMMENT": "Cuir beachd ris", - "REMOVE_COMMENT": "Thoir am beachd air falbh", - "DELETE_BLOCK": "Sguab às am bloca", - "DELETE_X_BLOCKS": "Sguab às %1 bloca(ichean)", - "DELETE_ALL_BLOCKS": "A bheil thu airson na %1 bloca(ichean) uile a sguabadh às?", - "CLEAN_UP": "Sgioblaich na blocaichean", - "HELP": "Cobhair", - "UNDO": "Neo-dhèan", - "REDO": "Ath-dhèan", - "EDIT_PROCEDURE": "Deasaich", - "SHOW_PROCEDURE_DEFINITION": "Rach dhan mhìneachadh", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Can rudeigin…", - "COLOUR_HUE_LABEL": "Dath", - "COLOUR_SATURATION_LABEL": "Sàthachd", - "COLOUR_BRIGHTNESS_LABEL": "Soilleireachd", - "CHANGE_VALUE_TITLE": "Atharraich an luach:", - "RENAME_VARIABLE": "Thoir ainm ùr air a’ chaochladair", - "RENAME_VARIABLE_TITLE": "Thoir ainm ùr air gach caochladair “%1”:", - "RENAME_VARIABLE_MODAL_TITLE": "Thoir ainm ùr air a’ chaochladair", - "NEW_VARIABLE": "Cruthaich caochladair", - "NEW_VARIABLE_TITLE": "Ainm ùr a’ chaochladair:", - "VARIABLE_MODAL_TITLE": "Caochladair ùr", - "VARIABLE_ALREADY_EXISTS": "Tha caochladair air a bheil “%1” ann mu thràth.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Tha caochladair air a bheil “%1” ann mu thràth airson caochladair eile dhen t-seòrsa “%2”.", - "DELETE_VARIABLE_CONFIRMATION": "A bheil thu airson a sguabadh às dha %1 chleachdadh/cleachdaidhean dhen chaochladair “%2”?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Chan urrainn dhuinn an caochladair “%1” a sguabadh às on a e am broinn mìneachadh an fhoincsein “%2”", - "DELETE_VARIABLE": "Sguab às dha “%1”", - "NEW_PROCEDURE": "Cruthaich bloca", - "PROCEDURE_ALREADY_EXISTS": "Tha modh air a bheil “%1” ann mu thràth.", - "PROCEDURE_DEFAULT_NAME": "ainm a’ bhloca", - "NEW_LIST": "Cruthaich liosta", - "NEW_LIST_TITLE": "Ainm na liosta ùire:", - "LIST_MODAL_TITLE": "Liosta ùr", - "LIST_ALREADY_EXISTS": "Tha liosta air a bheil “%1” ann mu thràth.", - "RENAME_LIST_TITLE": "Thoir ainm ùr air gach liosta “%1”:", - "RENAME_LIST_MODAL_TITLE": "Thoir ainm ùr air an liosta", - "DEFAULT_LIST_ITEM": "nì", - "DELETE_LIST": "Sguab às dhan liosta “%1”", - "RENAME_LIST": "Thoir ainm ùr air an liosta", - "NEW_BROADCAST_MESSAGE": "Teachdaireachd ùr", - "NEW_BROADCAST_MESSAGE_TITLE": "Ainm na teachdaireachd ùire:", - "BROADCAST_MODAL_TITLE": "teachdaireachd ùr", - "DEFAULT_BROADCAST_MESSAGE_NAME": "teachdaireachd1" -}; - -Blockly.ScratchMsgs.locales["gl"] = -{ - "CONTROL_FOREVER": "para sempre", - "CONTROL_REPEAT": "repetir %1", - "CONTROL_IF": "se %1 entón", - "CONTROL_ELSE": "se non", - "CONTROL_STOP": "parar.", - "CONTROL_STOP_ALL": "todos", - "CONTROL_STOP_THIS": "este programa", - "CONTROL_STOP_OTHER": "outros programas na figura", - "CONTROL_WAIT": "agardar %1 segundos", - "CONTROL_WAITUNTIL": "agardar até %1", - "CONTROL_REPEATUNTIL": "repetir até %1", - "CONTROL_WHILE": "mentres %1", - "CONTROL_FOREACH": "para cada %1 en %2", - "CONTROL_STARTASCLONE": "Ao comezar como clon", - "CONTROL_CREATECLONEOF": "crear un clon de %1", - "CONTROL_CREATECLONEOF_MYSELF": "min mesmo", - "CONTROL_DELETETHISCLONE": "eliminar este clon.", - "CONTROL_COUNTER": "contador", - "CONTROL_INCRCOUNTER": "incrementar o contador", - "CONTROL_CLEARCOUNTER": "limpar o contador", - "CONTROL_ALLATONCE": "todo de vez", - "DATA_SETVARIABLETO": "asignar %2 a %1", - "DATA_CHANGEVARIABLEBY": "sumarlle %2 a %1", - "DATA_SHOWVARIABLE": "amosar a variábel %1", - "DATA_HIDEVARIABLE": "agochar a variábel %1", - "DATA_ADDTOLIST": "engadir %1 a %2", - "DATA_DELETEOFLIST": "eliminar %1 de %2", - "DATA_DELETEALLOFLIST": "eliminar todo o contido de %1", - "DATA_INSERTATLIST": "inserir %1 na posición %2 de %3", - "DATA_REPLACEITEMOFLIST": "substituír o elemento %1 de %2 por %3", - "DATA_ITEMOFLIST": "elemento %1 de %2", - "DATA_ITEMNUMOFLIST": "posición de %2 que contén %1", - "DATA_LENGTHOFLIST": "lonxitude de %1", - "DATA_LISTCONTAINSITEM": "%1 contén %2", - "DATA_SHOWLIST": "amosar a lista %1", - "DATA_HIDELIST": "agochar a lista %1", - "DATA_INDEX_ALL": "todos", - "DATA_INDEX_LAST": "último", - "DATA_INDEX_RANDOM": "ao chou", - "EVENT_WHENFLAGCLICKED": "Ao premer en %1", - "EVENT_WHENTHISSPRITECLICKED": "Ao premer nesta figura", - "EVENT_WHENSTAGECLICKED": "Ao premer no escenario", - "EVENT_WHENTOUCHINGOBJECT": "Cando esta figura toque %1", - "EVENT_WHENBROADCASTRECEIVED": "Ao recibir %1", - "EVENT_WHENBACKDROPSWITCHESTO": "Ao mudar o fondo a %1", - "EVENT_WHENGREATERTHAN": "Cando %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volume do micrófono", - "EVENT_BROADCAST": "emitir %1", - "EVENT_BROADCASTANDWAIT": "emitir %1 e agardar", - "EVENT_WHENKEYPRESSED": "Ao premer a tecla %1", - "EVENT_WHENKEYPRESSED_SPACE": "espazo", - "EVENT_WHENKEYPRESSED_LEFT": "frecha esquerda", - "EVENT_WHENKEYPRESSED_RIGHT": "frecha dereita", - "EVENT_WHENKEYPRESSED_DOWN": "frecha abaixo", - "EVENT_WHENKEYPRESSED_UP": "frecha arriba", - "EVENT_WHENKEYPRESSED_ANY": "calquera", - "LOOKS_SAYFORSECS": "dicir %1 durante %2 segundos", - "LOOKS_SAY": "dicir %1", - "LOOKS_HELLO": "Ola!", - "LOOKS_THINKFORSECS": "pensar %1 durante %2 segundos", - "LOOKS_THINK": "pensar %1", - "LOOKS_HMM": "Mmm...", - "LOOKS_SHOW": "amosarse", - "LOOKS_HIDE": "agocharse", - "LOOKS_HIDEALLSPRITES": "agochar todas as figuras", - "LOOKS_EFFECT_COLOR": "cor", - "LOOKS_EFFECT_FISHEYE": "ollo de peixe", - "LOOKS_EFFECT_WHIRL": "remuiño", - "LOOKS_EFFECT_PIXELATE": "pixelar", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "luminosidade", - "LOOKS_EFFECT_GHOST": "desaparecer", - "LOOKS_CHANGEEFFECTBY": "sumar %2 ao efecto %1", - "LOOKS_SETEFFECTTO": "aplicar o efecto %1 co valor %2", - "LOOKS_CLEARGRAPHICEFFECTS": "limpar os efectos gráficos", - "LOOKS_CHANGESIZEBY": "sumar %1 ao tamaño", - "LOOKS_SETSIZETO": "pór o tamaño ao %1 %", - "LOOKS_SIZE": "tamaño", - "LOOKS_CHANGESTRETCHBY": "sumar %1 ao estiramento", - "LOOKS_SETSTRETCHTO": "pór o estiramento no %1 %", - "LOOKS_SWITCHCOSTUMETO": "mudar vestimenta a %1", - "LOOKS_NEXTCOSTUME": "vestimenta seguinte", - "LOOKS_SWITCHBACKDROPTO": "mudar fondo a %1", - "LOOKS_GOTOFRONTBACK": "ir para a capa %1", - "LOOKS_GOTOFRONTBACK_FRONT": "por diante", - "LOOKS_GOTOFRONTBACK_BACK": "por detrás", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ir %1 %2 capas", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "adiante", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atrás", - "LOOKS_BACKDROPNUMBERNAME": "fondo %1", - "LOOKS_COSTUMENUMBERNAME": "vestimenta %1", - "LOOKS_NUMBERNAME_NUMBER": "número", - "LOOKS_NUMBERNAME_NAME": "nome", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "mudar fondo a %1 e agardar", - "LOOKS_NEXTBACKDROP_BLOCK": "fondo seguinte", - "LOOKS_NEXTBACKDROP": "fondo seguinte", - "LOOKS_PREVIOUSBACKDROP": "fondo anterior", - "LOOKS_RANDOMBACKDROP": "fondo de pantalla aleatorio", - "MOTION_MOVESTEPS": "mover %1 pasos", - "MOTION_TURNLEFT": "xirar %1 %2 graos", - "MOTION_TURNRIGHT": "xirar %1 %2 graos", - "MOTION_POINTINDIRECTION": "apuntar na dirección %1", - "MOTION_POINTTOWARDS": "apuntar cara a %1", - "MOTION_POINTTOWARDS_POINTER": "punteiro do rato", - "MOTION_POINTTOWARDS_RANDOM": "dirección aleatoria", - "MOTION_GOTO": "ir para %1", - "MOTION_GOTO_POINTER": "punteiro do rato", - "MOTION_GOTO_RANDOM": "posición aleatoria", - "MOTION_GOTOXY": "ir para X: %1 Y: %2", - "MOTION_GLIDESECSTOXY": "esvarar durante %1 seg a X: %2 Y: %3", - "MOTION_GLIDETO": "esvarar durante %1 seg a %2", - "MOTION_GLIDETO_POINTER": "punteiro do rato", - "MOTION_GLIDETO_RANDOM": "posición aleatoria", - "MOTION_CHANGEXBY": "sumar %1 a X", - "MOTION_SETX": "asignar a X o valor %1", - "MOTION_CHANGEYBY": "sumar %1 a Y", - "MOTION_SETY": "asignar a Y o valor %1", - "MOTION_IFONEDGEBOUNCE": "se toca un bordo, rebotar", - "MOTION_SETROTATIONSTYLE": "usar o estilo de rotación %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "esquerda-dereita", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "non rotar", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "en todas as direccións", - "MOTION_XPOSITION": "posición en X", - "MOTION_YPOSITION": "posición en Y", - "MOTION_DIRECTION": "dirección", - "MOTION_SCROLLRIGHT": "desprazamento dereita %1", - "MOTION_SCROLLUP": "desprazamento arriba %1", - "MOTION_ALIGNSCENE": "aliñar a escena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "abaixo esquerda", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "abaixo dereita", - "MOTION_ALIGNSCENE_MIDDLE": "medio", - "MOTION_ALIGNSCENE_TOPLEFT": "arriba esquerda", - "MOTION_ALIGNSCENE_TOPRIGHT": "arriba dereita", - "MOTION_XSCROLL": "desprazamento x", - "MOTION_YSCROLL": "desprazamento Y", - "MOTION_STAGE_SELECTED": "Escenario seleccionado: sen bloques de movemento", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 – %2", - "OPERATORS_MULTIPLY": "%1 × %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "número ao chou entre %1 e %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 e %2", - "OPERATORS_OR": "%1 ou %2", - "OPERATORS_NOT": "non %1", - "OPERATORS_JOIN": "concatenar %1 %2", - "OPERATORS_JOIN_APPLE": "mazá", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "letra %1 de %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "lonxitude de %1", - "OPERATORS_CONTAINS": "%1 contén %2", - "OPERATORS_MOD": "%1 módulo %2", - "OPERATORS_ROUND": "arredondar %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "valor absoluto", - "OPERATORS_MATHOP_FLOOR": "chan", - "OPERATORS_MATHOP_CEILING": "teito", - "OPERATORS_MATHOP_SQRT": "raíz cadrada", - "OPERATORS_MATHOP_SIN": "seno", - "OPERATORS_MATHOP_COS": "coseno", - "OPERATORS_MATHOP_TAN": "tanxente", - "OPERATORS_MATHOP_ASIN": "arco seno", - "OPERATORS_MATHOP_ACOS": "arco coseno", - "OPERATORS_MATHOP_ATAN": "arco tanxente", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definir %1", - "SENSING_TOUCHINGOBJECT": "toca %1", - "SENSING_TOUCHINGOBJECT_POINTER": "punteiro do rato", - "SENSING_TOUCHINGOBJECT_EDGE": "bordo", - "SENSING_TOUCHINGCOLOR": "toca na cor %1", - "SENSING_COLORISTOUCHINGCOLOR": "a cor %1 toca %2", - "SENSING_DISTANCETO": "distancia a %1", - "SENSING_DISTANCETO_POINTER": "punteiro do rato", - "SENSING_ASKANDWAIT": "preguntar %1 e agardar", - "SENSING_ASK_TEXT": "Como te chamas?", - "SENSING_ANSWER": "resposta", - "SENSING_KEYPRESSED": "a tecla %1 está premida", - "SENSING_MOUSEDOWN": "o rato está premido", - "SENSING_MOUSEX": "posición en X do rato", - "SENSING_MOUSEY": "posición en Y do rato", - "SENSING_SETDRAGMODE": "usar o modo de arrastre %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrastrábel", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "non arrastrábel", - "SENSING_LOUDNESS": "volume no micrófono", - "SENSING_LOUD": "forte?", - "SENSING_TIMER": "cronómetro", - "SENSING_RESETTIMER": "reiniciar o cronómetro", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "posición en X", - "SENSING_OF_YPOSITION": "posición en Y", - "SENSING_OF_DIRECTION": "dirección", - "SENSING_OF_COSTUMENUMBER": "vestimenta n.º", - "SENSING_OF_COSTUMENAME": "nome da vestimenta", - "SENSING_OF_SIZE": "tamaño", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "fondo n.º", - "SENSING_OF_BACKDROPNAME": "nome do fondo", - "SENSING_OF_STAGE": "Escenario", - "SENSING_CURRENT": "%1 actual", - "SENSING_CURRENT_YEAR": "ano", - "SENSING_CURRENT_MONTH": "mes", - "SENSING_CURRENT_DATE": "data", - "SENSING_CURRENT_DAYOFWEEK": "día da semana", - "SENSING_CURRENT_HOUR": "hora", - "SENSING_CURRENT_MINUTE": "minuto", - "SENSING_CURRENT_SECOND": "segundo", - "SENSING_DAYSSINCE2000": "días desde o 2000", - "SENSING_USERNAME": "nome de usuario", - "SENSING_USERID": "identificador de usuario", - "SOUND_PLAY": "iniciar son %1", - "SOUND_PLAYUNTILDONE": "reproducir %1 até rematar", - "SOUND_STOPALLSOUNDS": "deter todos os sons", - "SOUND_SETEFFECTO": "aplicar o efecto %1 como %2", - "SOUND_CHANGEEFFECTBY": "sumar ao efecto %1 o valor %2", - "SOUND_CLEAREFFECTS": "limpar os efectos de son", - "SOUND_EFFECTS_PITCH": "ton", - "SOUND_EFFECTS_PAN": "canle esquerda/dereita", - "SOUND_CHANGEVOLUMEBY": "subir o volume en %1", - "SOUND_SETVOLUMETO": "pór o volume no %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "gravar...", - "CATEGORY_MOTION": "Movemento", - "CATEGORY_LOOKS": "Aparencia", - "CATEGORY_SOUND": "Son", - "CATEGORY_EVENTS": "Eventos", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Sensores", - "CATEGORY_OPERATORS": "Operadores", - "CATEGORY_VARIABLES": "Variábeis", - "CATEGORY_MYBLOCKS": "Os meus bloques", - "DUPLICATE": "Duplicar", - "DELETE": "Eliminar", - "ADD_COMMENT": "Engadir comentario", - "REMOVE_COMMENT": "Retirar comentario", - "DELETE_BLOCK": "Eliminar bloque", - "DELETE_X_BLOCKS": "Eliminar %1 bloques", - "DELETE_ALL_BLOCKS": "Eliminar os %1 bloques?", - "CLEAN_UP": "Limpar bloques", - "HELP": "Axuda", - "UNDO": "Desfacer", - "REDO": "Refacer", - "EDIT_PROCEDURE": "Editar", - "SHOW_PROCEDURE_DEFINITION": "Ir á definición", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Di algo...", - "COLOUR_HUE_LABEL": "Cor", - "COLOUR_SATURATION_LABEL": "Saturación", - "COLOUR_BRIGHTNESS_LABEL": "Luminosidade", - "CHANGE_VALUE_TITLE": "Cambiar valor:", - "RENAME_VARIABLE": "Renomear variábel", - "RENAME_VARIABLE_TITLE": "Renomear as variábeis «%1» como:", - "RENAME_VARIABLE_MODAL_TITLE": "Renomear variábel", - "NEW_VARIABLE": "Crear unha variábel", - "NEW_VARIABLE_TITLE": "Nome da nova variábel:", - "VARIABLE_MODAL_TITLE": "Nova variábel", - "VARIABLE_ALREADY_EXISTS": "Xa existe unha variábel chamada «%1».", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Xa existe unha variábel chamada «%1» para outra variábel de tipo «%2».", - "DELETE_VARIABLE_CONFIRMATION": "Eliminar %1 usos da variábel «%2»?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Non é posíbel eliminar a variábel «%1» porque é parte da definición da función «%2».", - "DELETE_VARIABLE": "Eliminar a variábel «%1»", - "NEW_PROCEDURE": "Crear un bloque", - "PROCEDURE_ALREADY_EXISTS": "Xa existe un procedemento chamado «%1».", - "PROCEDURE_DEFAULT_NAME": "nome do bloque", - "NEW_LIST": "Crear unha lista", - "NEW_LIST_TITLE": "Nome da nova lista:", - "LIST_MODAL_TITLE": "Nova lista", - "LIST_ALREADY_EXISTS": "Xa existe unha lista chamada «%1».", - "RENAME_LIST_TITLE": "Renomear as listas «%1» como:", - "RENAME_LIST_MODAL_TITLE": "Renomear lista", - "DEFAULT_LIST_ITEM": "cousa", - "DELETE_LIST": "Eliminar a lista «%1»", - "RENAME_LIST": "Renomear lista", - "NEW_BROADCAST_MESSAGE": "Nova mensaxe", - "NEW_BROADCAST_MESSAGE_TITLE": "Nome da nova mensaxe:", - "BROADCAST_MODAL_TITLE": "Mensaxe nova", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mensaxe1" -}; - -Blockly.ScratchMsgs.locales["ko"] = -{ - "CONTROL_FOREVER": "무한 반복하기", - "CONTROL_REPEAT": "%1 번 반복하기", - "CONTROL_IF": "만약 %1 (이)라면", - "CONTROL_ELSE": "아니면", - "CONTROL_STOP": "멈추기", - "CONTROL_STOP_ALL": "모두", - "CONTROL_STOP_THIS": "이 스크립트", - "CONTROL_STOP_OTHER": "이 스프라이트에 있는 다른 스크립트", - "CONTROL_WAIT": "%1 초 기다리기", - "CONTROL_WAITUNTIL": "%1 까지 기다리기", - "CONTROL_REPEATUNTIL": "%1 까지 반복하기", - "CONTROL_WHILE": "%1 동안 반복하기", - "CONTROL_FOREACH": "%1 변수로 %2 번 반복하기", - "CONTROL_STARTASCLONE": "복제되었을 때", - "CONTROL_CREATECLONEOF": "%1 복제하기", - "CONTROL_CREATECLONEOF_MYSELF": "나 자신", - "CONTROL_DELETETHISCLONE": "이 복제본 삭제하기", - "CONTROL_COUNTER": "카운터", - "CONTROL_INCRCOUNTER": "카운터 증가하기", - "CONTROL_CLEARCOUNTER": "카운터 초기화", - "CONTROL_ALLATONCE": "한 번에 실행하기", - "DATA_SETVARIABLETO": "%1 을(를) %2 로 정하기", - "DATA_CHANGEVARIABLEBY": "%1 을(를) %2 만큼 바꾸기", - "DATA_SHOWVARIABLE": "%1 변수 보이기", - "DATA_HIDEVARIABLE": "%1 변수 숨기기", - "DATA_ADDTOLIST": "%1 을(를) %2 에 추가하기", - "DATA_DELETEOFLIST": "%1 번째 항목을 %2 에서 삭제하기", - "DATA_DELETEALLOFLIST": "%1 의 항목을 모두 삭제하기 ", - "DATA_INSERTATLIST": "%1 을(를) %3 리스트의 %2 번째에 넣기", - "DATA_REPLACEITEMOFLIST": "%2 리스트의 %1 번째 항목을 %3 으로 바꾸기", - "DATA_ITEMOFLIST": "%2 리스트의 %1 번째 항목", - "DATA_ITEMNUMOFLIST": "%2 리스트에서 %1 항목의 위치", - "DATA_LENGTHOFLIST": "%1 의 길이", - "DATA_LISTCONTAINSITEM": "%1 이(가) %2 을(를) 포함하는가?", - "DATA_SHOWLIST": "%1 리스트 보이기", - "DATA_HIDELIST": "%1 리스트 숨기기", - "DATA_INDEX_ALL": "모두", - "DATA_INDEX_LAST": "마지막", - "DATA_INDEX_RANDOM": "무작위", - "EVENT_WHENFLAGCLICKED": "%1 클릭했을 때", - "EVENT_WHENTHISSPRITECLICKED": "이 스프라이트를 클릭했을 때", - "EVENT_WHENSTAGECLICKED": "무대를 클릭했을 때", - "EVENT_WHENTOUCHINGOBJECT": "이 스프라이트가 %1 에 닿을 때", - "EVENT_WHENBROADCASTRECEIVED": "%1 신호를 받았을 때", - "EVENT_WHENBACKDROPSWITCHESTO": "배경이 %1 (으)로 바뀌었을 때", - "EVENT_WHENGREATERTHAN": "%1 > %2 일 때", - "EVENT_WHENGREATERTHAN_TIMER": "타이머", - "EVENT_WHENGREATERTHAN_LOUDNESS": "음량", - "EVENT_BROADCAST": "%1 신호 보내기", - "EVENT_BROADCASTANDWAIT": "%1 신호 보내고 기다리기", - "EVENT_WHENKEYPRESSED": "%1 키를 눌렀을 때", - "EVENT_WHENKEYPRESSED_SPACE": "스페이스", - "EVENT_WHENKEYPRESSED_LEFT": "왼쪽 화살표", - "EVENT_WHENKEYPRESSED_RIGHT": "오른쪽 화살표", - "EVENT_WHENKEYPRESSED_DOWN": "아래쪽 화살표", - "EVENT_WHENKEYPRESSED_UP": "위쪽 화살표", - "EVENT_WHENKEYPRESSED_ANY": "아무", - "LOOKS_SAYFORSECS": "%1 을(를) %2 초 동안 말하기", - "LOOKS_SAY": "%1 말하기", - "LOOKS_HELLO": "안녕!", - "LOOKS_THINKFORSECS": "%1 을(를) %2 초 동안 생각하기", - "LOOKS_THINK": "%1 생각하기", - "LOOKS_HMM": "음...", - "LOOKS_SHOW": "보이기", - "LOOKS_HIDE": "숨기기", - "LOOKS_HIDEALLSPRITES": "모든 스프라이트 숨기기", - "LOOKS_EFFECT_COLOR": "색깔", - "LOOKS_EFFECT_FISHEYE": "어안 렌즈", - "LOOKS_EFFECT_WHIRL": "소용돌이", - "LOOKS_EFFECT_PIXELATE": "픽셀화", - "LOOKS_EFFECT_MOSAIC": "모자이크", - "LOOKS_EFFECT_BRIGHTNESS": "밝기", - "LOOKS_EFFECT_GHOST": "투명도", - "LOOKS_CHANGEEFFECTBY": "%1 효과를 %2 만큼 바꾸기", - "LOOKS_SETEFFECTTO": "%1 효과를 %2 (으)로 정하기", - "LOOKS_CLEARGRAPHICEFFECTS": "그래픽 효과 지우기", - "LOOKS_CHANGESIZEBY": "크기를 %1 만큼 바꾸기", - "LOOKS_SETSIZETO": "크기를 %1 %로 정하기", - "LOOKS_SIZE": "크기", - "LOOKS_CHANGESTRETCHBY": "너비를 %1 만큼 바꾸기", - "LOOKS_SETSTRETCHTO": "너비를 %1 %로 정하기", - "LOOKS_SWITCHCOSTUMETO": "모양을 %1 (으)로 바꾸기", - "LOOKS_NEXTCOSTUME": "다음 모양으로 바꾸기", - "LOOKS_SWITCHBACKDROPTO": "배경을 %1 (으)로 바꾸기", - "LOOKS_GOTOFRONTBACK": "%1 으로 순서 바꾸기", - "LOOKS_GOTOFRONTBACK_FRONT": "맨 앞쪽", - "LOOKS_GOTOFRONTBACK_BACK": "맨 뒤쪽", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 단계 보내기", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "앞으로", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "뒤로", - "LOOKS_BACKDROPNUMBERNAME": "배경 %1", - "LOOKS_COSTUMENUMBERNAME": "모양 %1", - "LOOKS_NUMBERNAME_NUMBER": "번호", - "LOOKS_NUMBERNAME_NAME": "이름", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "배경을 %1 (으)로 바꾸고 기다리기", - "LOOKS_NEXTBACKDROP_BLOCK": "다음 배경으로 바꾸기", - "LOOKS_NEXTBACKDROP": "다음 배경", - "LOOKS_PREVIOUSBACKDROP": "이전 배경", - "LOOKS_RANDOMBACKDROP": "무작위 배경", - "MOTION_MOVESTEPS": "%1 만큼 움직이기", - "MOTION_TURNLEFT": "%1 방향으로 %2 도 회전하기", - "MOTION_TURNRIGHT": "%1 방향으로 %2 도 회전하기", - "MOTION_POINTINDIRECTION": "%1 도 방향 보기", - "MOTION_POINTTOWARDS": "%1 쪽 보기", - "MOTION_POINTTOWARDS_POINTER": "마우스 포인터", - "MOTION_POINTTOWARDS_RANDOM": "무작위 방향", - "MOTION_GOTO": "%1 (으)로 이동하기", - "MOTION_GOTO_POINTER": "마우스 포인터", - "MOTION_GOTO_RANDOM": "무작위 위치", - "MOTION_GOTOXY": "x: %1 y: %2 (으)로 이동하기", - "MOTION_GLIDESECSTOXY": "%1 초 동안 x: %2 y: %3 (으)로 이동하기", - "MOTION_GLIDETO": "%1 초 동안 %2 (으)로 이동하기", - "MOTION_GLIDETO_POINTER": "마우스 포인터", - "MOTION_GLIDETO_RANDOM": "무작위 위치", - "MOTION_CHANGEXBY": "x 좌표를 %1 만큼 바꾸기", - "MOTION_SETX": "x 좌표를 %1 (으)로 정하기", - "MOTION_CHANGEYBY": "y 좌표를 %1 만큼 바꾸기", - "MOTION_SETY": "y 좌표를 %1 (으)로 정하기", - "MOTION_IFONEDGEBOUNCE": "벽에 닿으면 튕기기", - "MOTION_SETROTATIONSTYLE": "회전 방식을 %1 (으)로 정하기", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "왼쪽-오른쪽", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "회전하지 않기", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "회전하기", - "MOTION_XPOSITION": "x 좌표", - "MOTION_YPOSITION": "y 좌표", - "MOTION_DIRECTION": "방향", - "MOTION_SCROLLRIGHT": "오른쪽으로 %1 만큼 스크롤하기", - "MOTION_SCROLLUP": "위쪽으로 %1 만큼 스크롤하기", - "MOTION_ALIGNSCENE": "화면을 %1 로 정렬하기", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "왼쪽 아래", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "오른쪽 아래", - "MOTION_ALIGNSCENE_MIDDLE": "가운데", - "MOTION_ALIGNSCENE_TOPLEFT": "왼쪽 위", - "MOTION_ALIGNSCENE_TOPRIGHT": "오른쪽 위", - "MOTION_XSCROLL": "x 스크롤", - "MOTION_YSCROLL": "y 스크롤", - "MOTION_STAGE_SELECTED": "무대 선택됨: 동작 블록 없음", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 × %2", - "OPERATORS_DIVIDE": "%1 ÷ %2", - "OPERATORS_RANDOM": "%1 부터 %2 사이의 난수", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 그리고 %2", - "OPERATORS_OR": "%1 또는 %2", - "OPERATORS_NOT": "%1 이(가) 아니다", - "OPERATORS_JOIN": "%1 와(과) %2 결합하기", - "OPERATORS_JOIN_APPLE": "가위", - "OPERATORS_JOIN_BANANA": "나무", - "OPERATORS_LETTEROF": "%2 의 %1 번째 글자", - "OPERATORS_LETTEROF_APPLE": "가", - "OPERATORS_LENGTH": "%1 의 길이", - "OPERATORS_CONTAINS": "%1 이(가) %2 을(를) 포함하는가?", - "OPERATORS_MOD": "%1 나누기 %2 의 나머지", - "OPERATORS_ROUND": "%1 의 반올림", - "OPERATORS_MATHOP": "%1 ( %2 )", - "OPERATORS_MATHOP_ABS": "절댓값", - "OPERATORS_MATHOP_FLOOR": "버림", - "OPERATORS_MATHOP_CEILING": "올림", - "OPERATORS_MATHOP_SQRT": "제곱근", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "%1 정의하기", - "SENSING_TOUCHINGOBJECT": "%1 에 닿았는가?", - "SENSING_TOUCHINGOBJECT_POINTER": "마우스 포인터", - "SENSING_TOUCHINGOBJECT_EDGE": "벽", - "SENSING_TOUCHINGCOLOR": "%1 색에 닿았는가?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 색이 %2 색에 닿았는가?", - "SENSING_DISTANCETO": "%1 까지의 거리", - "SENSING_DISTANCETO_POINTER": "마우스 포인터", - "SENSING_ASKANDWAIT": "%1 라고 묻고 기다리기", - "SENSING_ASK_TEXT": "너 이름이 뭐니?", - "SENSING_ANSWER": "대답", - "SENSING_KEYPRESSED": "%1 키를 눌렸는가?", - "SENSING_MOUSEDOWN": "마우스를 클릭했는가?", - "SENSING_MOUSEX": "마우스의 x좌표", - "SENSING_MOUSEY": "마우스의 y좌표", - "SENSING_SETDRAGMODE": "드래그 모드를 %1 상태로 정하기", - "SENSING_SETDRAGMODE_DRAGGABLE": "드래그 할 수 있는", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "드래그 할 수 없는", - "SENSING_LOUDNESS": "음량", - "SENSING_LOUD": "소리가 큰가?", - "SENSING_TIMER": "타이머", - "SENSING_RESETTIMER": "타이머 초기화", - "SENSING_OF": "%2 의 %1", - "SENSING_OF_XPOSITION": "x좌표", - "SENSING_OF_YPOSITION": "y좌표", - "SENSING_OF_DIRECTION": "방향", - "SENSING_OF_COSTUMENUMBER": "모양 번호", - "SENSING_OF_COSTUMENAME": "모양 이름", - "SENSING_OF_SIZE": "크기", - "SENSING_OF_VOLUME": "음량", - "SENSING_OF_BACKDROPNUMBER": "배경 번호", - "SENSING_OF_BACKDROPNAME": "배경 이름", - "SENSING_OF_STAGE": "무대", - "SENSING_CURRENT": "현재 %1", - "SENSING_CURRENT_YEAR": "년", - "SENSING_CURRENT_MONTH": "월", - "SENSING_CURRENT_DATE": "일", - "SENSING_CURRENT_DAYOFWEEK": "요일", - "SENSING_CURRENT_HOUR": "시", - "SENSING_CURRENT_MINUTE": "분", - "SENSING_CURRENT_SECOND": "초", - "SENSING_DAYSSINCE2000": "2000년 이후 현재까지 날짜 수", - "SENSING_USERNAME": "사용자 이름", - "SENSING_USERID": "사용자 번호", - "SOUND_PLAY": "%1 재생하기", - "SOUND_PLAYUNTILDONE": "%1 끝까지 재생하기", - "SOUND_STOPALLSOUNDS": "모든 소리 끄기", - "SOUND_SETEFFECTO": "%1 효과를 %2 로 정하기", - "SOUND_CHANGEEFFECTBY": "%1 효과를 %2 만큼 바꾸기", - "SOUND_CLEAREFFECTS": "소리 효과 지우기", - "SOUND_EFFECTS_PITCH": "음 높이", - "SOUND_EFFECTS_PAN": "음향 위치 왼쪽/오른쪽", - "SOUND_CHANGEVOLUMEBY": "음량을 %1 만큼 바꾸기", - "SOUND_SETVOLUMETO": "음량을 %1% 로 정하기", - "SOUND_VOLUME": "음량", - "SOUND_RECORD": "녹음하기...", - "CATEGORY_MOTION": "동작", - "CATEGORY_LOOKS": "형태", - "CATEGORY_SOUND": "소리", - "CATEGORY_EVENTS": "이벤트", - "CATEGORY_CONTROL": "제어", - "CATEGORY_SENSING": "감지", - "CATEGORY_OPERATORS": "연산", - "CATEGORY_VARIABLES": "변수", - "CATEGORY_MYBLOCKS": "나만의 블록", - "DUPLICATE": "복사하기", - "DELETE": "삭제하기", - "ADD_COMMENT": "주석 넣기", - "REMOVE_COMMENT": "주석 지우기", - "DELETE_BLOCK": "블록 삭제하기", - "DELETE_X_BLOCKS": "블록 %1개 삭제하기", - "DELETE_ALL_BLOCKS": " %1개의 블록을 모두 삭제할까요?", - "CLEAN_UP": "블록 정리하기", - "HELP": "도움말", - "UNDO": "되돌리기", - "REDO": "재시도", - "EDIT_PROCEDURE": "편집", - "SHOW_PROCEDURE_DEFINITION": "정의로 이동하기", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "무엇이든 말하여 봅시다.", - "COLOUR_HUE_LABEL": "색상", - "COLOUR_SATURATION_LABEL": "채도", - "COLOUR_BRIGHTNESS_LABEL": "명도", - "CHANGE_VALUE_TITLE": "값 바꾸기:", - "RENAME_VARIABLE": "변수 이름 바꾸기", - "RENAME_VARIABLE_TITLE": "\"%1\" 변수 이름을 모두 다음으로 수정하기:", - "RENAME_VARIABLE_MODAL_TITLE": "변수 이름 바꾸기", - "NEW_VARIABLE": "변수 만들기", - "NEW_VARIABLE_TITLE": "새로운 변수 이름:", - "VARIABLE_MODAL_TITLE": "새로운 변수", - "VARIABLE_ALREADY_EXISTS": "\"%1\" 변수 이름은 이미 존재합니다.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "\"%1\" 변수 이름은 이미 \"%2\" 형태의 다른 변수로 존재합니다.", - "DELETE_VARIABLE_CONFIRMATION": "\"%2\" 변수가 사용된 %1곳을 삭제할까요?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "\"%2\" 함수의 정의 중 일부분이기 때문에 \"%1\" 변수를 삭제할 수 없습니다.", - "DELETE_VARIABLE": "\"%1\" 변수 삭제하기", - "NEW_PROCEDURE": "블록 만들기", - "PROCEDURE_ALREADY_EXISTS": "\"%1\" 함수 이름은 이미 존재합니다.", - "PROCEDURE_DEFAULT_NAME": "블록 이름", - "NEW_LIST": "리스트 만들기", - "NEW_LIST_TITLE": "새로운 리스트 이름:", - "LIST_MODAL_TITLE": "새로운 리스트", - "LIST_ALREADY_EXISTS": "\"%1\" 리스트 이름은 이미 존재합니다.", - "RENAME_LIST_TITLE": "\"%1\" 리스트 이름을 모두 다음으로 수정하기: ", - "RENAME_LIST_MODAL_TITLE": "리스트 이름 바꾸기", - "DEFAULT_LIST_ITEM": "항목", - "DELETE_LIST": "\"%1\" 리스트 삭제하기", - "RENAME_LIST": "리스트 이름 바꾸기", - "NEW_BROADCAST_MESSAGE": "새로운 메시지", - "NEW_BROADCAST_MESSAGE_TITLE": "새로운 메시지 이름:", - "BROADCAST_MODAL_TITLE": "새로운 메시지", - "DEFAULT_BROADCAST_MESSAGE_NAME": "메시지1" -}; - -Blockly.ScratchMsgs.locales["he"] = -{ - "CONTROL_FOREVER": "לעולמים", - "CONTROL_REPEAT": "חזור %1 פעמים", - "CONTROL_IF": "אם %1 אז", - "CONTROL_ELSE": "אחרת", - "CONTROL_STOP": "עצור", - "CONTROL_STOP_ALL": "הכול", - "CONTROL_STOP_THIS": "תסריט זה", - "CONTROL_STOP_OTHER": "תסריטים אחרים בדמות", - "CONTROL_WAIT": "חכה %1 שניות", - "CONTROL_WAITUNTIL": "חכה עד ש %1", - "CONTROL_REPEATUNTIL": "חזור עד ש %1", - "CONTROL_WHILE": "כל עוד %1", - "CONTROL_FOREACH": "עבור כל %1 ב %2", - "CONTROL_STARTASCLONE": "כאשר מופעל ככפיל", - "CONTROL_CREATECLONEOF": "צור כפיל של %1", - "CONTROL_CREATECLONEOF_MYSELF": "עצמי", - "CONTROL_DELETETHISCLONE": "מחק כפיל זה", - "CONTROL_COUNTER": "מונה", - "CONTROL_INCRCOUNTER": "הגדל מונה", - "CONTROL_CLEARCOUNTER": "אפס מונה", - "CONTROL_ALLATONCE": "הכל בבת אחת", - "DATA_SETVARIABLETO": "קבע %1 ל %2", - "DATA_CHANGEVARIABLEBY": "שנה %1 ב %2", - "DATA_SHOWVARIABLE": "הצג משתנה %1", - "DATA_HIDEVARIABLE": "הסתר משתנה %1", - "DATA_ADDTOLIST": "הוסף %1 ל %2", - "DATA_DELETEOFLIST": "מחק פריט %1 מתוך %2", - "DATA_DELETEALLOFLIST": "מחק הכול מ%1", - "DATA_INSERTATLIST": "הכנס %1 במקום %2 של %3", - "DATA_REPLACEITEMOFLIST": "קבע פריט %1 של %2 ל %3", - "DATA_ITEMOFLIST": "פריט %1 של %2", - "DATA_ITEMNUMOFLIST": "מספר פריט של %1 ב- %2", - "DATA_LENGTHOFLIST": "האורך של %1", - "DATA_LISTCONTAINSITEM": "%1 מכיל %2 ?", - "DATA_SHOWLIST": "הצג רשימה %1", - "DATA_HIDELIST": "הסתר רשימה %1", - "DATA_INDEX_ALL": "הכול", - "DATA_INDEX_LAST": "אחרון", - "DATA_INDEX_RANDOM": "אקראי", - "EVENT_WHENFLAGCLICKED": "כאשר לוחצים על %1", - "EVENT_WHENTHISSPRITECLICKED": "כאשר לוחצים על דמות זו", - "EVENT_WHENSTAGECLICKED": "כאשר לוחצים על הבמה", - "EVENT_WHENTOUCHINGOBJECT": "כאשר דמות זו נוגעת ב %1", - "EVENT_WHENBROADCASTRECEIVED": "כאשר מתקבל מסר %1", - "EVENT_WHENBACKDROPSWITCHESTO": "כאשר הרקע משתנה ל %1", - "EVENT_WHENGREATERTHAN": "כאשר %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "שעון עצר", - "EVENT_WHENGREATERTHAN_LOUDNESS": "עוצמת קול", - "EVENT_BROADCAST": "שדר מסר %1", - "EVENT_BROADCASTANDWAIT": "שדר מסר %1 וחכה", - "EVENT_WHENKEYPRESSED": "כאשר נלחץ מקש %1", - "EVENT_WHENKEYPRESSED_SPACE": "רווח", - "EVENT_WHENKEYPRESSED_LEFT": "חץ שמאלי", - "EVENT_WHENKEYPRESSED_RIGHT": "חץ ימני", - "EVENT_WHENKEYPRESSED_DOWN": "חץ מטה", - "EVENT_WHENKEYPRESSED_UP": "חץ מעלה", - "EVENT_WHENKEYPRESSED_ANY": "כל", - "LOOKS_SAYFORSECS": "אמור %1 למשך %2 שניות", - "LOOKS_SAY": "אמור %1", - "LOOKS_HELLO": "שלום!", - "LOOKS_THINKFORSECS": "חשוב %1 למשך %2 שניות", - "LOOKS_THINK": "חשוב %1", - "LOOKS_HMM": "הממ...", - "LOOKS_SHOW": "הצג", - "LOOKS_HIDE": "הסתר", - "LOOKS_HIDEALLSPRITES": "הסתר את כל הדמויות", - "LOOKS_EFFECT_COLOR": "צבע", - "LOOKS_EFFECT_FISHEYE": "עין דג", - "LOOKS_EFFECT_WHIRL": "סחרור", - "LOOKS_EFFECT_PIXELATE": "פיקסלים", - "LOOKS_EFFECT_MOSAIC": "פסיפס", - "LOOKS_EFFECT_BRIGHTNESS": "בהירות", - "LOOKS_EFFECT_GHOST": "רוח רפאים", - "LOOKS_CHANGEEFFECTBY": "שנה אפקט %1 ב %2", - "LOOKS_SETEFFECTTO": "קבע אפקט %1 ל %2", - "LOOKS_CLEARGRAPHICEFFECTS": "נקה אפקטים", - "LOOKS_CHANGESIZEBY": "שנה גודל ב %1", - "LOOKS_SETSIZETO": "קבע גודל ל %1 %", - "LOOKS_SIZE": "גודל", - "LOOKS_CHANGESTRETCHBY": "שנה מתיחה ב %1", - "LOOKS_SETSTRETCHTO": "קבע מתיחה ל %1", - "LOOKS_SWITCHCOSTUMETO": "קבע תלבושת ל %1", - "LOOKS_NEXTCOSTUME": "התלבושת הבאה", - "LOOKS_SWITCHBACKDROPTO": "קבע רקע ל %1", - "LOOKS_GOTOFRONTBACK": "העבר לשכבה ה %1", - "LOOKS_GOTOFRONTBACK_FRONT": "קדמית", - "LOOKS_GOTOFRONTBACK_BACK": "אחורית", - "LOOKS_GOFORWARDBACKWARDLAYERS": "העבר %2 שכבות %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "קדימה", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "אחורה", - "LOOKS_BACKDROPNUMBERNAME": "%1 רקע", - "LOOKS_COSTUMENUMBERNAME": "%1 תלבושת", - "LOOKS_NUMBERNAME_NUMBER": "מספר", - "LOOKS_NUMBERNAME_NAME": "שם", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "החלף רקע ל %1 וחכה", - "LOOKS_NEXTBACKDROP_BLOCK": "הרקע הבא", - "LOOKS_NEXTBACKDROP": "הרקע הבא", - "LOOKS_PREVIOUSBACKDROP": "הרקע הקודם", - "LOOKS_RANDOMBACKDROP": "רקע אקראי", - "MOTION_MOVESTEPS": "זוז %1 צעדים", - "MOTION_TURNLEFT": "הסתובב %1 %2 מעלות", - "MOTION_TURNRIGHT": "הסתובב %1 %2 מעלות", - "MOTION_POINTINDIRECTION": "פנה לכיוון %1", - "MOTION_POINTTOWARDS": "פנה לכיוון של %1", - "MOTION_POINTTOWARDS_POINTER": "מצביע העכבר", - "MOTION_POINTTOWARDS_RANDOM": "כיוון אקראי", - "MOTION_GOTO": "קפוץ אל %1", - "MOTION_GOTO_POINTER": "מצביע העכבר", - "MOTION_GOTO_RANDOM": "מיקום אקראי", - "MOTION_GOTOXY": "קפוץ אל x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "גלוש %1 שניות אל x: %2 y: %3", - "MOTION_GLIDETO": "גלוש %1 שניות אל %2", - "MOTION_GLIDETO_POINTER": "סמן העכבר", - "MOTION_GLIDETO_RANDOM": "מיקום אקראי", - "MOTION_CHANGEXBY": "שנה את ערך x ב %1", - "MOTION_SETX": "קבע את ערך x ל %1", - "MOTION_CHANGEYBY": "שנה את ערך y ב %1", - "MOTION_SETY": "קבע את ערך y ל %1", - "MOTION_IFONEDGEBOUNCE": "בנגיעה במסגרת שנה כיוון", - "MOTION_SETROTATIONSTYLE": "קבע אופן סיבוב %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "שמאל-ימין", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "בטל סיבוב", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "מסביב", - "MOTION_XPOSITION": "מיקום על ציר x", - "MOTION_YPOSITION": "מיקום על ציר Y", - "MOTION_DIRECTION": "כיוון", - "MOTION_SCROLLRIGHT": "גלול ימינה %1", - "MOTION_SCROLLUP": "גלול למעלה %1", - "MOTION_ALIGNSCENE": "ישר סצנה %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "למטה־משמאל", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "למטה־מימין", - "MOTION_ALIGNSCENE_MIDDLE": "אמצעי", - "MOTION_ALIGNSCENE_TOPLEFT": "למעלה־משמאל", - "MOTION_ALIGNSCENE_TOPRIGHT": "למעלה־מימין", - "MOTION_XSCROLL": "גלילה בציר x", - "MOTION_YSCROLL": "גלילה בציר y", - "MOTION_STAGE_SELECTED": "נבחרה במה: אין לבנים לתנועה", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%2 - %1", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%2 / %1", - "OPERATORS_RANDOM": "בחר מספר אקראי בין %1 ל %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 וגם %2", - "OPERATORS_OR": "%1 או %2", - "OPERATORS_NOT": "לא %1", - "OPERATORS_JOIN": "חבר %1 %2", - "OPERATORS_JOIN_APPLE": "תפוח", - "OPERATORS_JOIN_BANANA": "בננה", - "OPERATORS_LETTEROF": "אות %1 של %2", - "OPERATORS_LETTEROF_APPLE": "ת", - "OPERATORS_LENGTH": "האורך של %1", - "OPERATORS_CONTAINS": "%1 מכיל %2 ?", - "OPERATORS_MOD": "%1 מודולו %2", - "OPERATORS_ROUND": "עגל %1", - "OPERATORS_MATHOP": "%1 של %2", - "OPERATORS_MATHOP_ABS": "ערך מוחלט", - "OPERATORS_MATHOP_FLOOR": "עיגול למטה", - "OPERATORS_MATHOP_CEILING": "עיגול למעלה", - "OPERATORS_MATHOP_SQRT": "שורש ריבועי", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "‏e בחזקה", - "OPERATORS_MATHOP_10EXP": "‏10 בחזקה", - "PROCEDURES_DEFINITION": "הגדר %1", - "SENSING_TOUCHINGOBJECT": "נוגע ב %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "סמן העכבר", - "SENSING_TOUCHINGOBJECT_EDGE": "קצה", - "SENSING_TOUCHINGCOLOR": "נוגע בצבע %1?", - "SENSING_COLORISTOUCHINGCOLOR": "צבע %1 נוגע בצבע %2?", - "SENSING_DISTANCETO": "מרחק אל %1", - "SENSING_DISTANCETO_POINTER": "סמן העכבר", - "SENSING_ASKANDWAIT": "שאל %1 והמתן", - "SENSING_ASK_TEXT": "מה השם שלך?", - "SENSING_ANSWER": "תשובה", - "SENSING_KEYPRESSED": "מקש %1 נלחץ?", - "SENSING_MOUSEDOWN": "עכבר נלחץ?", - "SENSING_MOUSEX": "מיקום עכבר בציר x", - "SENSING_MOUSEY": "מיקום עכבר בציר y", - "SENSING_SETDRAGMODE": "קבע מצב גרירה ל %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ניתן לגרירה", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "לא ניתן לגרירה", - "SENSING_LOUDNESS": "עוצמת קול", - "SENSING_LOUD": "עוצמת קול?", - "SENSING_TIMER": "שעון עצר", - "SENSING_RESETTIMER": "אפס מונה", - "SENSING_OF": "%1 של %2", - "SENSING_OF_XPOSITION": "מיקום על ציר x", - "SENSING_OF_YPOSITION": "מיקום על ציר y", - "SENSING_OF_DIRECTION": "כיוון", - "SENSING_OF_COSTUMENUMBER": "מספר תלבושת", - "SENSING_OF_COSTUMENAME": "שם תלבושת", - "SENSING_OF_SIZE": "גודל", - "SENSING_OF_VOLUME": "עוצמת קול", - "SENSING_OF_BACKDROPNUMBER": "מספר רקע", - "SENSING_OF_BACKDROPNAME": "שם רקע", - "SENSING_OF_STAGE": "במה", - "SENSING_CURRENT": "%1 נוכחית", - "SENSING_CURRENT_YEAR": "שנה", - "SENSING_CURRENT_MONTH": "חודש", - "SENSING_CURRENT_DATE": "תאריך", - "SENSING_CURRENT_DAYOFWEEK": "יום בשבוע", - "SENSING_CURRENT_HOUR": "שעה", - "SENSING_CURRENT_MINUTE": "דקה", - "SENSING_CURRENT_SECOND": "שניה", - "SENSING_DAYSSINCE2000": "ימים מאז 2000", - "SENSING_USERNAME": "שם משתמש", - "SENSING_USERID": "זהות המשתמש", - "SOUND_PLAY": "נגן צליל %1", - "SOUND_PLAYUNTILDONE": "נגן צליל %1 עד לסיום", - "SOUND_STOPALLSOUNDS": "הפסק את כל הצלילים", - "SOUND_SETEFFECTO": "קבע אפקט %1 ל %2", - "SOUND_CHANGEEFFECTBY": "שנה אפקט %1 ב %2", - "SOUND_CLEAREFFECTS": "נקה אפקטים קוליים", - "SOUND_EFFECTS_PITCH": "גובה צליל", - "SOUND_EFFECTS_PAN": "ערוץ שמע שמאלי/ימני", - "SOUND_CHANGEVOLUMEBY": "שנה עוצמת קול ב %1", - "SOUND_SETVOLUMETO": "קבע עוצמת קול ל %1%", - "SOUND_VOLUME": "עוצמת קול", - "SOUND_RECORD": "הקלט...", - "CATEGORY_MOTION": "תנועה", - "CATEGORY_LOOKS": "מראה", - "CATEGORY_SOUND": "צלילים", - "CATEGORY_EVENTS": "אירועים", - "CATEGORY_CONTROL": "בקרה", - "CATEGORY_SENSING": "חיישנים", - "CATEGORY_OPERATORS": "מפעילים", - "CATEGORY_VARIABLES": "משתנים", - "CATEGORY_MYBLOCKS": "הלבנים שלי", - "DUPLICATE": "שכפל", - "DELETE": "מחק", - "ADD_COMMENT": "הוספת תגובה", - "REMOVE_COMMENT": "מחק תגובה", - "DELETE_BLOCK": "מחק לבנה", - "DELETE_X_BLOCKS": "מחק %1 לבנים ", - "DELETE_ALL_BLOCKS": "למחוק את כל הלבנים של %1?", - "CLEAN_UP": "נקה לבנים", - "HELP": "עזרה", - "UNDO": "בטל", - "REDO": "בצע שוב", - "EDIT_PROCEDURE": "ערוך", - "SHOW_PROCEDURE_DEFINITION": "עבור להגדרה", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "כתבו משהו...", - "COLOUR_HUE_LABEL": "צבע", - "COLOUR_SATURATION_LABEL": "רווי צבע", - "COLOUR_BRIGHTNESS_LABEL": "בהירות", - "CHANGE_VALUE_TITLE": "שנה ערך:", - "RENAME_VARIABLE": "שנה שם משתנה", - "RENAME_VARIABLE_TITLE": "שנה שמם של כל המשתנים \"%1\" ל:", - "RENAME_VARIABLE_MODAL_TITLE": "שנה שם משתנה", - "NEW_VARIABLE": "צור משתנה", - "NEW_VARIABLE_TITLE": "שם המשתנה החדש", - "VARIABLE_MODAL_TITLE": "משתנה חדש", - "VARIABLE_ALREADY_EXISTS": "משתנה בשם \"%1\" כבר קיים", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "משתנה בשם \"%1\" כבר קיים למשתנה אחר %2\"", - "DELETE_VARIABLE_CONFIRMATION": "האם למחוק את %1 השימושים של המשתנה %2 ?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "לא ניתן למחוק את המשתנה \"%1\" מפני שזה חלק מהגדרת הפונקציה \"%2\"", - "DELETE_VARIABLE": "מחק את המשתנה \"%1\"", - "NEW_PROCEDURE": "צור לבנה", - "PROCEDURE_ALREADY_EXISTS": "פרוצדורה בשם \"%1\" כבר קיימת", - "PROCEDURE_DEFAULT_NAME": "שם הלבנה", - "NEW_LIST": "צור רשימה", - "NEW_LIST_TITLE": "שם הרשימה", - "LIST_MODAL_TITLE": "רשימה חדשה", - "LIST_ALREADY_EXISTS": "רשימה בשם \"%1\" כבר קיימת", - "RENAME_LIST_TITLE": "שנה את שם כל רשימות ־\"%1\" ל:", - "RENAME_LIST_MODAL_TITLE": "שנה שם רשימה", - "DEFAULT_LIST_ITEM": "דבר", - "DELETE_LIST": "מחק את הרשימה %1", - "RENAME_LIST": "תן שם חדש לרשימה", - "NEW_BROADCAST_MESSAGE": "מסר חדש", - "NEW_BROADCAST_MESSAGE_TITLE": "צור מסר חדש", - "BROADCAST_MODAL_TITLE": "מסר חדש", - "DEFAULT_BROADCAST_MESSAGE_NAME": "מסר 1" -}; - -Blockly.ScratchMsgs.locales["hr"] = -{ - "CONTROL_FOREVER": "ponavljaj", - "CONTROL_REPEAT": "ponovi %1", - "CONTROL_IF": "ako %1 onda", - "CONTROL_ELSE": "inače", - "CONTROL_STOP": "zaustavi", - "CONTROL_STOP_ALL": "sve", - "CONTROL_STOP_THIS": "ovaj program", - "CONTROL_STOP_OTHER": "druge programe lika", - "CONTROL_WAIT": "čekaj %1 sekundi", - "CONTROL_WAITUNTIL": "čekaj do %1", - "CONTROL_REPEATUNTIL": "ponavljaj dok nije %1", - "CONTROL_WHILE": "dok je %1", - "CONTROL_FOREACH": "za svaki %1 u %2", - "CONTROL_STARTASCLONE": "kada krećem kao klon", - "CONTROL_CREATECLONEOF": "kloniraj %1", - "CONTROL_CREATECLONEOF_MYSELF": "ja", - "CONTROL_DELETETHISCLONE": "izbriši klona", - "CONTROL_COUNTER": "brojač", - "CONTROL_INCRCOUNTER": "uvečaj brojač", - "CONTROL_CLEARCOUNTER": "obriši brojač", - "CONTROL_ALLATONCE": "sve odjednom", - "DATA_SETVARIABLETO": "postavi %1 na %2", - "DATA_CHANGEVARIABLEBY": "promijeni %1 za %2", - "DATA_SHOWVARIABLE": "prikaži varijablu %1", - "DATA_HIDEVARIABLE": "sakrij varijablu %1", - "DATA_ADDTOLIST": "dodaj %1 u %2", - "DATA_DELETEOFLIST": "izbriši %1 iz %2", - "DATA_DELETEALLOFLIST": "izbriši sve %1", - "DATA_INSERTATLIST": "umetni %1 na %2 u %3", - "DATA_REPLACEITEMOFLIST": "zamijeni %1 na %2 s %3", - "DATA_ITEMOFLIST": "element %1 od %2", - "DATA_ITEMNUMOFLIST": "element # od %1 u %2", - "DATA_LENGTHOFLIST": "dužina %1", - "DATA_LISTCONTAINSITEM": "Sadrži li %1 %2?", - "DATA_SHOWLIST": "prikaži listu %1", - "DATA_HIDELIST": "sakrij listu %1", - "DATA_INDEX_ALL": "sve", - "DATA_INDEX_LAST": "posljednje", - "DATA_INDEX_RANDOM": "nasumično", - "EVENT_WHENFLAGCLICKED": "Kada je kliknuta %1 ", - "EVENT_WHENTHISSPRITECLICKED": "Kada je lik kliknut", - "EVENT_WHENSTAGECLICKED": "kada je kliknuto na pozadinu", - "EVENT_WHENTOUCHINGOBJECT": "kada lik dodiruje %1", - "EVENT_WHENBROADCASTRECEIVED": "kada primim %1", - "EVENT_WHENBACKDROPSWITCHESTO": "kada se pozadina promijeni u %1", - "EVENT_WHENGREATERTHAN": "kada je %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "štoperica", - "EVENT_WHENGREATERTHAN_LOUDNESS": "glasnoća", - "EVENT_BROADCAST": "pošalji %1", - "EVENT_BROADCASTANDWAIT": "pošalji %1 i čekaj", - "EVENT_WHENKEYPRESSED": "kada je tipka %1 pritisnuta", - "EVENT_WHENKEYPRESSED_SPACE": "razmaknica", - "EVENT_WHENKEYPRESSED_LEFT": "strelica lijevo", - "EVENT_WHENKEYPRESSED_RIGHT": "strelica desno", - "EVENT_WHENKEYPRESSED_DOWN": "strelica dolje", - "EVENT_WHENKEYPRESSED_UP": "strelica gore", - "EVENT_WHENKEYPRESSED_ANY": "bilo koja", - "LOOKS_SAYFORSECS": "govori %1 %2 sekundi", - "LOOKS_SAY": "reci %1", - "LOOKS_HELLO": "Bok!", - "LOOKS_THINKFORSECS": "razmišljaj %1 %2 sekundi", - "LOOKS_THINK": "misli %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "prikaži", - "LOOKS_HIDE": "sakrij", - "LOOKS_HIDEALLSPRITES": "sakrij sve likove", - "LOOKS_EFFECT_COLOR": "boja", - "LOOKS_EFFECT_FISHEYE": "riblje oko", - "LOOKS_EFFECT_WHIRL": "vrtlog", - "LOOKS_EFFECT_PIXELATE": "pozrnati", - "LOOKS_EFFECT_MOSAIC": "mozaik", - "LOOKS_EFFECT_BRIGHTNESS": "osvjetljenje", - "LOOKS_EFFECT_GHOST": "duh", - "LOOKS_CHANGEEFFECTBY": "promijeni efekt %1 za %2", - "LOOKS_SETEFFECTTO": "promijeni efekt %1 na %2", - "LOOKS_CLEARGRAPHICEFFECTS": "ukloni grafičke efekte", - "LOOKS_CHANGESIZEBY": "promijeni veličinu za %1", - "LOOKS_SETSIZETO": "postavi veličinu na %1 %", - "LOOKS_SIZE": "veličina", - "LOOKS_CHANGESTRETCHBY": "promijeni uvećanje za %1", - "LOOKS_SETSTRETCHTO": "postavi uvećanje na %1", - "LOOKS_SWITCHCOSTUMETO": "promijeni kostim u %1", - "LOOKS_NEXTCOSTUME": "sljedeći kostim", - "LOOKS_SWITCHBACKDROPTO": "promijeni pozadinu na %1", - "LOOKS_GOTOFRONTBACK": "idi na sloj %1", - "LOOKS_GOTOFRONTBACK_FRONT": "prednji", - "LOOKS_GOTOFRONTBACK_BACK": "stražnji", - "LOOKS_GOFORWARDBACKWARDLAYERS": "idi %1 %2 sloja", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "naprijed", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "natrag", - "LOOKS_BACKDROPNUMBERNAME": "pozadina %1", - "LOOKS_COSTUMENUMBERNAME": "kostim %1", - "LOOKS_NUMBERNAME_NUMBER": "broj", - "LOOKS_NUMBERNAME_NAME": "ime", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "promijeni pozadinu u %1 i čekaj", - "LOOKS_NEXTBACKDROP_BLOCK": "sljedeća pozadina", - "LOOKS_NEXTBACKDROP": "sljedeća pozadina", - "LOOKS_PREVIOUSBACKDROP": "prethodna pozadina", - "LOOKS_RANDOMBACKDROP": "nasumična pozadina", - "MOTION_MOVESTEPS": "idi %1 koraka", - "MOTION_TURNLEFT": "skreni %1 %2 stupnjeva", - "MOTION_TURNRIGHT": "skreni %1 %2 stupnjeva", - "MOTION_POINTINDIRECTION": "okreni se u smjeru %1", - "MOTION_POINTTOWARDS": "okreni se prema %1", - "MOTION_POINTTOWARDS_POINTER": "pokazivač miša", - "MOTION_POINTTOWARDS_RANDOM": "nasumičan smjer", - "MOTION_GOTO": "idi do %1", - "MOTION_GOTO_POINTER": "pokazivač miša", - "MOTION_GOTO_RANDOM": "nasumična pozicija", - "MOTION_GOTOXY": "idi na x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "klizi %1 sekundi do x: %2 y: %3", - "MOTION_GLIDETO": "klizi %1 sekundi do %2", - "MOTION_GLIDETO_POINTER": "pokazivač miša", - "MOTION_GLIDETO_RANDOM": "nasumična pozicija", - "MOTION_CHANGEXBY": "promijeni x za %1", - "MOTION_SETX": "postavi x na %1", - "MOTION_CHANGEYBY": "promijeni y za %1", - "MOTION_SETY": "postavi y na %1", - "MOTION_IFONEDGEBOUNCE": "ako si na rubu, okreni se", - "MOTION_SETROTATIONSTYLE": "postavi stil rotacije %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "lijevo-desno", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ne rotiraj", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "sve unaokolo", - "MOTION_XPOSITION": "x položaj", - "MOTION_YPOSITION": "y položaj", - "MOTION_DIRECTION": "smjer", - "MOTION_SCROLLRIGHT": "zrcali desno %1", - "MOTION_SCROLLUP": "zrcali gore %1", - "MOTION_ALIGNSCENE": "poravnanje scene %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "dolje-lijevo", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "dolje-desno", - "MOTION_ALIGNSCENE_MIDDLE": "sredina", - "MOTION_ALIGNSCENE_TOPLEFT": "gore-lijevo", - "MOTION_ALIGNSCENE_TOPRIGHT": "gore-desno", - "MOTION_XSCROLL": "x klizanje", - "MOTION_YSCROLL": "y klizanje", - "MOTION_STAGE_SELECTED": "Pozornica je izabrana: nema blokova za kretanje", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "slučajan broj od %1 do %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 i %2", - "OPERATORS_OR": "%1 ili %2", - "OPERATORS_NOT": "nije %1", - "OPERATORS_JOIN": "spoji %1 %2", - "OPERATORS_JOIN_APPLE": "jabuka", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "slovo %1 od %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "dužina %1", - "OPERATORS_CONTAINS": "%1 sadrži %2", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "zaokruži %1", - "OPERATORS_MATHOP": "%1 od %2", - "OPERATORS_MATHOP_ABS": "apsolutno", - "OPERATORS_MATHOP_FLOOR": "donja vrijednost", - "OPERATORS_MATHOP_CEILING": "gornja vrijednost", - "OPERATORS_MATHOP_SQRT": "korijen", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definiraj %1", - "SENSING_TOUCHINGOBJECT": "dodiruje %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "pokazivač miša", - "SENSING_TOUCHINGOBJECT_EDGE": "rub", - "SENSING_TOUCHINGCOLOR": "dodiruje boju %1?", - "SENSING_COLORISTOUCHINGCOLOR": "boja %1 dodiruje %2?", - "SENSING_DISTANCETO": "udaljenost do %1", - "SENSING_DISTANCETO_POINTER": "pokazivač miša", - "SENSING_ASKANDWAIT": "pitaj %1 i čekaj", - "SENSING_ASK_TEXT": "Kako se zoveš?", - "SENSING_ANSWER": "odgovor", - "SENSING_KEYPRESSED": "tipka %1 pritisnuta?", - "SENSING_MOUSEDOWN": "miš pritisnut?", - "SENSING_MOUSEX": "miš x", - "SENSING_MOUSEY": "miš y", - "SENSING_SETDRAGMODE": "postavi način povlačenja na %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "moguće povlačenje", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "bez povlačenja", - "SENSING_LOUDNESS": "glasnoća", - "SENSING_LOUD": "glasno?", - "SENSING_TIMER": "štoperica", - "SENSING_RESETTIMER": "poništi štopericu", - "SENSING_OF": "%1 od %2", - "SENSING_OF_XPOSITION": "x položaj", - "SENSING_OF_YPOSITION": "y položaj", - "SENSING_OF_DIRECTION": "smjer", - "SENSING_OF_COSTUMENUMBER": "kostim #", - "SENSING_OF_COSTUMENAME": "naziv kostima", - "SENSING_OF_SIZE": "veličina", - "SENSING_OF_VOLUME": "jačina zvuka", - "SENSING_OF_BACKDROPNUMBER": "pozadina #", - "SENSING_OF_BACKDROPNAME": "naziv pozadine", - "SENSING_OF_STAGE": "Pozornica", - "SENSING_CURRENT": "trenutna %1", - "SENSING_CURRENT_YEAR": "godina", - "SENSING_CURRENT_MONTH": "mjesec", - "SENSING_CURRENT_DATE": "dan", - "SENSING_CURRENT_DAYOFWEEK": "dan u tjednu", - "SENSING_CURRENT_HOUR": "sat", - "SENSING_CURRENT_MINUTE": "minuta", - "SENSING_CURRENT_SECOND": "sekunda", - "SENSING_DAYSSINCE2000": "dana od 2000", - "SENSING_USERNAME": "nadimak", - "SENSING_USERID": "korisnički id", - "SOUND_PLAY": "sviraj zvuk %1", - "SOUND_PLAYUNTILDONE": "sviraj zvuk %1 do kraja", - "SOUND_STOPALLSOUNDS": "zaustavi sve zvukove", - "SOUND_SETEFFECTO": "promijeni efekt %1 na %2", - "SOUND_CHANGEEFFECTBY": "promijeni efekt %1 za %2", - "SOUND_CLEAREFFECTS": "očisti sve efekte zvuka", - "SOUND_EFFECTS_PITCH": "visina tona", - "SOUND_EFFECTS_PAN": "kretanje lijevo/desno", - "SOUND_CHANGEVOLUMEBY": "promijeni glasnoću za %1", - "SOUND_SETVOLUMETO": "postavi glasnoću na %1%", - "SOUND_VOLUME": "glasnoća", - "SOUND_RECORD": "snimaj...", - "CATEGORY_MOTION": "Kretanje", - "CATEGORY_LOOKS": "Izgled", - "CATEGORY_SOUND": "Zvuk", - "CATEGORY_EVENTS": "Događaji", - "CATEGORY_CONTROL": "Upravljanje", - "CATEGORY_SENSING": "Očitanja", - "CATEGORY_OPERATORS": "Operacije", - "CATEGORY_VARIABLES": "Varijable", - "CATEGORY_MYBLOCKS": "Moji Blokovi", - "DUPLICATE": "Dupliciraj", - "DELETE": "Izbriši", - "ADD_COMMENT": "Dodaj komentar", - "REMOVE_COMMENT": "Ukloni komentar", - "DELETE_BLOCK": "Izbriši blok", - "DELETE_X_BLOCKS": "Izbriši %1 blokove", - "DELETE_ALL_BLOCKS": "Izbriši sve %1 blokove?", - "CLEAN_UP": "Očisti blokove", - "HELP": "Pomoć", - "UNDO": "Poništi", - "REDO": "Ponovi", - "EDIT_PROCEDURE": "Uredi", - "SHOW_PROCEDURE_DEFINITION": "Idi do definicije", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Reci nešto...", - "COLOUR_HUE_LABEL": "Boja", - "COLOUR_SATURATION_LABEL": "Saturacija", - "COLOUR_BRIGHTNESS_LABEL": "Osvjetljenje", - "CHANGE_VALUE_TITLE": "Promijeni vrijednost:", - "RENAME_VARIABLE": "Preimenuj varijablu", - "RENAME_VARIABLE_TITLE": "Preimenuj sve \"%1\" varijable u:", - "RENAME_VARIABLE_MODAL_TITLE": "Preimenuj varijablu", - "NEW_VARIABLE": "Napravi varijablu", - "NEW_VARIABLE_TITLE": "Ime varijable:", - "VARIABLE_MODAL_TITLE": "Nova varijabla", - "VARIABLE_ALREADY_EXISTS": "Varijabla \"%1\" već postoji.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Varijabla \"%1\" već postoji kod druge varijable tipa \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Izbriši \"%1\" upotrebu varijable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ne mogu izbrisati varijablu \"%1\" jer je dio definicije funkcije \"%2\"", - "DELETE_VARIABLE": "Izbriši varijablu \"%1\"", - "NEW_PROCEDURE": "Napravi blok", - "PROCEDURE_ALREADY_EXISTS": "Procedura \"%1\" već postoji.", - "PROCEDURE_DEFAULT_NAME": "ime bloka", - "NEW_LIST": "Napravi listu", - "NEW_LIST_TITLE": "Novo ime lliste:", - "LIST_MODAL_TITLE": "Nova lista", - "LIST_ALREADY_EXISTS": "Lista imena \"%1\" već postoji.", - "RENAME_LIST_TITLE": "Preimenuj sve \"%1\" liste u:", - "RENAME_LIST_MODAL_TITLE": "Preimenuj listu", - "DEFAULT_LIST_ITEM": "stvar", - "DELETE_LIST": "Izbriši listu \"%1\"", - "RENAME_LIST": "Preimenuj listu", - "NEW_BROADCAST_MESSAGE": "Nova poruka", - "NEW_BROADCAST_MESSAGE_TITLE": "Naziv nove poruke:", - "BROADCAST_MODAL_TITLE": "Nova poruka", - "DEFAULT_BROADCAST_MESSAGE_NAME": "poruka1" -}; - -Blockly.ScratchMsgs.locales["zu"] = -{ - "CONTROL_FOREVER": "makwenzeke njalo ", - "CONTROL_REPEAT": "phinda %1 ", - "CONTROL_IF": "uma %1 bese", - "CONTROL_ELSE": " noma ", - "CONTROL_STOP": "ima", - "CONTROL_STOP_ALL": "yonke", - "CONTROL_STOP_THIS": "lo mbhalo", - "CONTROL_STOP_OTHER": "eminye imibhalo kumlingisi", - "CONTROL_WAIT": "linda %1 umzuzuwana", - "CONTROL_WAITUNTIL": "akalinde kuze kube %1 ", - "CONTROL_REPEATUNTIL": "phinda kuze %1 ", - "CONTROL_WHILE": "ngenkathi %1", - "CONTROL_FOREACH": "ngokunye %1 ngokunye %2", - "CONTROL_STARTASCLONE": "Uma ngiqala njengo mfanekiso ", - "CONTROL_CREATECLONEOF": " Akha okufanayo %1 ", - "CONTROL_CREATECLONEOF_MYSELF": "mina", - "CONTROL_DELETETHISCLONE": " Susa umfanekiso ", - "CONTROL_COUNTER": "isibali ", - "CONTROL_INCRCOUNTER": "Khuphula isibali ", - "CONTROL_CLEARCOUNTER": "susa isibali ", - "CONTROL_ALLATONCE": "konke ngesikhathi esisodwa ", - "DATA_SETVARIABLETO": "lungisa %1 ukuze %2", - "DATA_CHANGEVARIABLEBY": "shintsha %1 ngokuthi %2 / ", - "DATA_SHOWVARIABLE": " khombisa ivariable %1 ", - "DATA_HIDEVARIABLE": "cashisa ivariable %1", - "DATA_ADDTOLIST": "engeza %1 kuya %2", - "DATA_DELETEOFLIST": " susa %1 ka %2 ", - "DATA_DELETEALLOFLIST": "susa konke %1", - "DATA_INSERTATLIST": "faka %1 ku %2 ka %3", - "DATA_REPLACEITEMOFLIST": "buyisela into %1 ye %2 nge %3", - "DATA_ITEMOFLIST": "into %1 ye %2", - "DATA_ITEMNUMOFLIST": "into # yaku %1 ku %2", - "DATA_LENGTHOFLIST": "ubude be %1", - "DATA_LISTCONTAINSITEM": "%1 Kuphathelene %2 ", - "DATA_SHOWLIST": "khombisa le-list %1 ", - "DATA_HIDELIST": "cashisa le-list %1 ", - "DATA_INDEX_ALL": "zonke ", - "DATA_INDEX_LAST": "eyokugcina", - "DATA_INDEX_RANDOM": "ngaphandle kokucabanga", - "EVENT_WHENFLAGCLICKED": "uma %1 kuchofoziwe ", - "EVENT_WHENTHISSPRITECLICKED": "Uma lomlingisi echofoziwe ", - "EVENT_WHENSTAGECLICKED": "uma Indawo ichofoziwe ", - "EVENT_WHENTOUCHINGOBJECT": "uma lomlingisi ethinta %1", - "EVENT_WHENBROADCASTRECEIVED": " uma ngikuthola %1 ", - "EVENT_WHENBACKDROPSWITCHESTO": "uma indawo ishintshela ku %1", - "EVENT_WHENGREATERTHAN": "uma %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "isikhathi esibekiwe ", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ubukhulu bomsindo", - "EVENT_BROADCAST": "sakaza %1", - "EVENT_BROADCASTANDWAIT": "sakaza %1 futhi linda", - "EVENT_WHENKEYPRESSED": "uma sekucindezelwe ukhiye %1", - "EVENT_WHENKEYPRESSED_SPACE": "isikhala", - "EVENT_WHENKEYPRESSED_LEFT": "umcibisholo kwesobunxele", - "EVENT_WHENKEYPRESSED_RIGHT": "umcibilisholo kwesokudla", - "EVENT_WHENKEYPRESSED_DOWN": "umcibisholo ophansi", - "EVENT_WHENKEYPRESSED_UP": "umcibilisholo phezulu", - "EVENT_WHENKEYPRESSED_ANY": "noma ikuphi", - "LOOKS_SAYFORSECS": "isho %1 ukuthi %2 imizuzwana ", - "LOOKS_SAY": "isho %1", - "LOOKS_HELLO": "Sawubona!", - "LOOKS_THINKFORSECS": "Cabanga %1 Ukuthi %2 Imizuzwana ", - "LOOKS_THINK": "cabanga %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "khombisa", - "LOOKS_HIDE": "cashisa", - "LOOKS_HIDEALLSPRITES": "cashisa bonke abalingisi", - "LOOKS_EFFECT_COLOR": "umbala", - "LOOKS_EFFECT_FISHEYE": "ihlo likafishi", - "LOOKS_EFFECT_WHIRL": "phenduka", - "LOOKS_EFFECT_PIXELATE": "pixelate", - "LOOKS_EFFECT_MOSAIC": "mosaic", - "LOOKS_EFFECT_BRIGHTNESS": "ukukhanya", - "LOOKS_EFFECT_GHOST": "isipoki", - "LOOKS_CHANGEEFFECTBY": "shintsha %1 umthelela ngokuthi %2", - "LOOKS_SETEFFECTTO": "lungisa %1 umthelela uwuyise %2", - "LOOKS_CLEARGRAPHICEFFECTS": "susa amagrafikhi athintekayo ", - "LOOKS_CHANGESIZEBY": "shintsha usayizi ngokuthi %1", - "LOOKS_SETSIZETO": "Lungisa usayizi ubuyise ku %1 ", - "LOOKS_SIZE": "Isisindo / Ubukhulu ", - "LOOKS_CHANGESTRETCHBY": "shinthsa ukunwebeka ngo %1", - "LOOKS_SETSTRETCHTO": "lungisa ukunwebeka ku %1", - "LOOKS_SWITCHCOSTUMETO": "shintsha impahla ukuze %1", - "LOOKS_NEXTCOSTUME": "impahla elandelayo", - "LOOKS_SWITCHBACKDROPTO": "shintsha indawo uyise kwi %1", - "LOOKS_GOTOFRONTBACK": "hamba ku %1 ngokwahlukana", - "LOOKS_GOTOFRONTBACK_FRONT": "phambili", - "LOOKS_GOTOFRONTBACK_BACK": "emuva", - "LOOKS_GOFORWARDBACKWARDLAYERS": "buyela %1 %2 ngokwahlukana", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "phambili ", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "emumva ", - "LOOKS_BACKDROPNUMBERNAME": "indawo1 %1", - "LOOKS_COSTUMENUMBERNAME": "impahla %1", - "LOOKS_NUMBERNAME_NUMBER": "inombolo", - "LOOKS_NUMBERNAME_NAME": "igama", - "LOOKS_SWITCHBACKDROPTOANDWAIT": " Shitsha indawo %1 ulinde ", - "LOOKS_NEXTBACKDROP_BLOCK": "indawo elandelayo ", - "LOOKS_NEXTBACKDROP": "indawo elandelayo", - "LOOKS_PREVIOUSBACKDROP": "indawo edlule", - "LOOKS_RANDOMBACKDROP": "Iyanoma ikuphi ndawo ", - "MOTION_MOVESTEPS": "Nyakaza%1 Izitephu ", - "MOTION_TURNLEFT": "Phendula %1 %2 ibanga ", - "MOTION_TURNRIGHT": " Phendula %1 %2 ibanga ", - "MOTION_POINTINDIRECTION": "khomba kulendlela %1", - "MOTION_POINTTOWARDS": "khomba ubhekise %1", - "MOTION_POINTTOWARDS_POINTER": "mouse-pointer ", - "MOTION_POINTTOWARDS_RANDOM": "inkomba engalindelekile / Noma iyiphi indlela ", - "MOTION_GOTO": "hamba uyeku %1 ", - "MOTION_GOTO_POINTER": "mouse-pointer", - "MOTION_GOTO_RANDOM": "Noma iyiphi indawo ", - "MOTION_GOTOXY": "hamba uyeku x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "ukushibilika %1 umzuzuwana kwi x: %2 y: %3", - "MOTION_GLIDETO": "ukushibilika %1 umzuzuwana kwi %2", - "MOTION_GLIDETO_POINTER": "mouse-pointer ", - "MOTION_GLIDETO_RANDOM": "noma iyiphi indawo", - "MOTION_CHANGEXBY": "shintsha u-x ngokuthi %1", - "MOTION_SETX": "lungisa u-x ukuze %1", - "MOTION_CHANGEYBY": "shintsha u-y ngokuthi %1", - "MOTION_SETY": "lungisa u-y ukuze %1", - "MOTION_IFONEDGEBOUNCE": "uma isenigcupheni, gxuma", - "MOTION_SETROTATIONSTYLE": "lungisa isitayela sokujika %1 ", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "kwesobunxele-kwesokudla ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ungaphenduki", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "yonke indawo ", - "MOTION_XPOSITION": "indawo ka- x ", - "MOTION_YPOSITION": "indawo ka-y", - "MOTION_DIRECTION": "indlela", - "MOTION_SCROLLRIGHT": "sikrolla kwesokudla %1 ", - "MOTION_SCROLLUP": "sikrola phezulu %1 ", - "MOTION_ALIGNSCENE": "qondanisa inkundla %1 ", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ngakwesobunxele-ngezansi", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ngakwesokudla-ngezansi ", - "MOTION_ALIGNSCENE_MIDDLE": "phakathi ", - "MOTION_ALIGNSCENE_TOPLEFT": "kwesobunxele-phezulu ", - "MOTION_ALIGNSCENE_TOPRIGHT": "kwesokudla-phezulu ", - "MOTION_XSCROLL": "x sikrola ", - "MOTION_YSCROLL": "y sikrola ", - "MOTION_STAGE_SELECTED": "Ukhethile indawo: ayinawo amabhulokisi okunyakaza ", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "khetha noma ikuphi %1 kuya %2 ", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 futhi %2", - "OPERATORS_OR": "%1 noma %2", - "OPERATORS_NOT": "akunjalo %1", - "OPERATORS_JOIN": "hlanganisa %1 %2", - "OPERATORS_JOIN_APPLE": "aphula", - "OPERATORS_JOIN_BANANA": "bhanana ", - "OPERATORS_LETTEROF": "usonhlamvu %1 ka %2 ", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "ubude be %1", - "OPERATORS_CONTAINS": "%1 okuphethwe %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "rawunda %1", - "OPERATORS_MATHOP": "%1 ya %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "phansi", - "OPERATORS_MATHOP_CEILING": "iphezulu", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "chaza %1", - "SENSING_TOUCHINGOBJECT": "thinta %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "mouse-pointer ", - "SENSING_TOUCHINGOBJECT_EDGE": "egcupheni ", - "SENSING_TOUCHINGCOLOR": "kuthinta umbala %1 ?", - "SENSING_COLORISTOUCHINGCOLOR": "umbala %1 uthinta %2? ", - "SENSING_DISTANCETO": "ibanga eliya %1", - "SENSING_DISTANCETO_POINTER": "mouse-pointer ", - "SENSING_ASKANDWAIT": "buza %1 futhi linda", - "SENSING_ASK_TEXT": "Ubani igama lakho?", - "SENSING_ANSWER": "phendula / Impendulo ", - "SENSING_KEYPRESSED": "ukhiye %1 ucindezelwe?", - "SENSING_MOUSEDOWN": "mouse phansi?", - "SENSING_MOUSEX": "mouse x", - "SENSING_MOUSEY": "mouse y", - "SENSING_SETDRAGMODE": "lungisa isimo sokuhudula %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "kuyahuduleka", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "akuhuduleki", - "SENSING_LOUDNESS": "ubukhulu bomsindo", - "SENSING_LOUD": "kukhulu umsindo? / Umsindo uphezulu? ", - "SENSING_TIMER": "Isikhathi esibekiwe ", - "SENSING_RESETTIMER": "qalakabusha isikhathi", - "SENSING_OF": "%1 ya %2", - "SENSING_OF_XPOSITION": "indawo ka-x ", - "SENSING_OF_YPOSITION": "Indawo ka-y ", - "SENSING_OF_DIRECTION": "indlela ", - "SENSING_OF_COSTUMENUMBER": "impahla #", - "SENSING_OF_COSTUMENAME": "igama lempahla", - "SENSING_OF_SIZE": "usayizi ", - "SENSING_OF_VOLUME": "ubuningi bomsindo", - "SENSING_OF_BACKDROPNUMBER": "indawo #", - "SENSING_OF_BACKDROPNAME": "igama lendawo", - "SENSING_OF_STAGE": "Isigaba", - "SENSING_CURRENT": "manje %1 ", - "SENSING_CURRENT_YEAR": "unyaka", - "SENSING_CURRENT_MONTH": "inyanga", - "SENSING_CURRENT_DATE": "usuku", - "SENSING_CURRENT_DAYOFWEEK": "usuku lwesonto", - "SENSING_CURRENT_HOUR": "ihora", - "SENSING_CURRENT_MINUTE": "umzuzu", - "SENSING_CURRENT_SECOND": "umzuzwana", - "SENSING_DAYSSINCE2000": "izinsuku kusukela 2000", - "SENSING_USERNAME": "igama elisebenzile", - "SENSING_USERID": "umsebenzisi ID", - "SOUND_PLAY": "qala umsindo %1", - "SOUND_PLAYUNTILDONE": "dlala umsindo %1 uze uqede", - "SOUND_STOPALLSOUNDS": "misa yonke imisindo", - "SOUND_SETEFFECTO": "Lungisa %1 umthelela ngo %2", - "SOUND_CHANGEEFFECTBY": "Shintsha %1 womthelela ngo %2", - "SOUND_CLEAREFFECTS": "susa umthelela womsindo", - "SOUND_EFFECTS_PITCH": "izinga elidlulele", - "SOUND_EFFECTS_PAN": "jikisa isinxele-nangakwesokudla", - "SOUND_CHANGEVOLUMEBY": "shintsha umsindo ngokuthi %1", - "SOUND_SETVOLUMETO": "lungisa inani lo msindo ukuze %1%", - "SOUND_VOLUME": "umsindo", - "SOUND_RECORD": "qopha...", - "CATEGORY_MOTION": "Ukunyakaza", - "CATEGORY_LOOKS": "Ukubukeka", - "CATEGORY_SOUND": "Umsindo", - "CATEGORY_EVENTS": "Izehlakalo", - "CATEGORY_CONTROL": "Lawula", - "CATEGORY_SENSING": "Ukuzwa", - "CATEGORY_OPERATORS": "Abalawuli", - "CATEGORY_VARIABLES": "I-variables", - "CATEGORY_MYBLOCKS": "Amabhulokisi ami", - "DUPLICATE": "Fanisa", - "DELETE": "Cima", - "ADD_COMMENT": "Faka Phawula", - "REMOVE_COMMENT": "Susa Izinkulumo", - "DELETE_BLOCK": "Susa Amabhulokisi / Susa ibhulokisi ", - "DELETE_X_BLOCKS": "Susa %1 Amabhulokisi", - "DELETE_ALL_BLOCKS": "Susa wonke %1 amabhulokisi?", - "CLEAN_UP": "Qoqa amabhulokisi", - "HELP": "Usizo", - "UNDO": "Susa okwenzile", - "REDO": "Phinda ukwenze ", - "EDIT_PROCEDURE": "Lungisa", - "SHOW_PROCEDURE_DEFINITION": "Iyokokukhethiwe", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Isho okuthile...", - "COLOUR_HUE_LABEL": "Umbala", - "COLOUR_SATURATION_LABEL": "Ukukhanya kombala", - "COLOUR_BRIGHTNESS_LABEL": "Ukukhanya", - "CHANGE_VALUE_TITLE": "Shintsha inani:", - "RENAME_VARIABLE": "Shintsha igama i-variable", - "RENAME_VARIABLE_TITLE": "Shinthsha amagama akho konke %1 i-variable ku:", - "RENAME_VARIABLE_MODAL_TITLE": "Shintsha Igama i-variable", - "NEW_VARIABLE": "Yenza i-variable", - "NEW_VARIABLE_TITLE": "Igama elisha i-variable", - "VARIABLE_MODAL_TITLE": "I-variable Entsha", - "VARIABLE_ALREADY_EXISTS": "Igama le-variable %1 selikhona ", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": " Igama le-variable \"%1\" likhona kwenye i-variable yolunye uhlobo\"%2\" ", - "DELETE_VARIABLE_CONFIRMATION": "Cisha %1 ukusetshenziswa kwe \"%2\" i-variable?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ngeke uyicishe i-variable \"%1\" ngoba iyingxenye yencazelo yalomsebenzi \"%2\"", - "DELETE_VARIABLE": " Susa\"%1\" i-variable. ", - "NEW_PROCEDURE": "Enza ibhulokisi ", - "PROCEDURE_ALREADY_EXISTS": "Inqubomgomo %1 isivele ikhona ", - "PROCEDURE_DEFAULT_NAME": "igama lebhulokisi ", - "NEW_LIST": "Yenza i-list ", - "NEW_LIST_TITLE": "Igama le-list entsha ", - "LIST_MODAL_TITLE": "i-List entsha ", - "LIST_ALREADY_EXISTS": " I-List ebizwa ngalelogama \"%1\" isikhona ", - "RENAME_LIST_TITLE": " Shintsha kabusha wonke \"%1\" Ama-List ku: ", - "RENAME_LIST_MODAL_TITLE": "Shintsha igama le-list ", - "DEFAULT_LIST_ITEM": "into", - "DELETE_LIST": "Susa \"%1\" i-List ", - "RENAME_LIST": "Shintsha igama le-List ", - "NEW_BROADCAST_MESSAGE": "Umyalezo omusha", - "NEW_BROADCAST_MESSAGE_TITLE": "Igama lomyalezo elisha", - "BROADCAST_MODAL_TITLE": "Umyalezo Omusha", - "DEFAULT_BROADCAST_MESSAGE_NAME": "umyalezo wokuqala" -}; - -Blockly.ScratchMsgs.locales["is"] = -{ - "CONTROL_FOREVER": "endalaust", - "CONTROL_REPEAT": "endurtaka %1 sinnum", - "CONTROL_IF": "ef %1 þá", - "CONTROL_ELSE": "annars", - "CONTROL_STOP": "stöðva", - "CONTROL_STOP_ALL": "allt", - "CONTROL_STOP_THIS": "þetta forrit", - "CONTROL_STOP_OTHER": "önnur forrit á karakter", - "CONTROL_WAIT": "bíða í %1 sekúndur", - "CONTROL_WAITUNTIL": "bíða þangað til %1", - "CONTROL_REPEATUNTIL": "endurtaka þar til %1", - "CONTROL_WHILE": "á meðan %1", - "CONTROL_FOREACH": "fyrir hvert %1 í %2", - "CONTROL_STARTASCLONE": "þegar ég byrja sem klónn", - "CONTROL_CREATECLONEOF": "búa til klón af %1", - "CONTROL_CREATECLONEOF_MYSELF": "sjálfum mér", - "CONTROL_DELETETHISCLONE": "eyða þessum klón", - "CONTROL_COUNTER": "teljari", - "CONTROL_INCRCOUNTER": "vaxandi teljari", - "CONTROL_CLEARCOUNTER": "tæma teljara", - "CONTROL_ALLATONCE": "alla í einu", - "DATA_SETVARIABLETO": "láttu %1 verða %2", - "DATA_CHANGEVARIABLEBY": "breyttu %1 um %2", - "DATA_SHOWVARIABLE": "sýndu mér breytu %1", - "DATA_HIDEVARIABLE": "feldu breytu %1", - "DATA_ADDTOLIST": "bættu %1 við %2", - "DATA_DELETEOFLIST": "fjarlægðu %1 af %2", - "DATA_DELETEALLOFLIST": "eyddu öllu af %1", - "DATA_INSERTATLIST": "settu %1 við %2 af %3", - "DATA_REPLACEITEMOFLIST": "skiptu út hlut %1 af %2 fyrir %3", - "DATA_ITEMOFLIST": "hlutur %1 af %2", - "DATA_ITEMNUMOFLIST": "item # of %1 in %2", - "DATA_LENGTHOFLIST": "lengd %1", - "DATA_LISTCONTAINSITEM": "inniheldur %1, %2?", - "DATA_SHOWLIST": "sýndu lista %1", - "DATA_HIDELIST": "feldu lista %1", - "DATA_INDEX_ALL": "allt", - "DATA_INDEX_LAST": "seinasti", - "DATA_INDEX_RANDOM": "handahófskenndur", - "EVENT_WHENFLAGCLICKED": "þegar smellt er á %1", - "EVENT_WHENTHISSPRITECLICKED": "þegar smellt er á þennan karakter", - "EVENT_WHENSTAGECLICKED": "þegar smellt er a sviðið", - "EVENT_WHENTOUCHINGOBJECT": "þegar karakterinn snertir %1", - "EVENT_WHENBROADCASTRECEIVED": "þegar ég fæ sent %1", - "EVENT_WHENBACKDROPSWITCHESTO": "þegar bakgrunnurinn verður %1", - "EVENT_WHENGREATERTHAN": "þegar %1 er meira en %2", - "EVENT_WHENGREATERTHAN_TIMER": "skeiðklukka", - "EVENT_WHENGREATERTHAN_LOUDNESS": "hljóðstyrkur", - "EVENT_BROADCAST": "senda %1", - "EVENT_BROADCASTANDWAIT": "senda %1 og bíða", - "EVENT_WHENKEYPRESSED": "þegar ýtt er á %1", - "EVENT_WHENKEYPRESSED_SPACE": "bilslá", - "EVENT_WHENKEYPRESSED_LEFT": "vinstri ör", - "EVENT_WHENKEYPRESSED_RIGHT": "hægri ör", - "EVENT_WHENKEYPRESSED_DOWN": "niður ör", - "EVENT_WHENKEYPRESSED_UP": "upp ör", - "EVENT_WHENKEYPRESSED_ANY": "eitthvert", - "LOOKS_SAYFORSECS": "segðu %1 í %2 sekúndur", - "LOOKS_SAY": "segðu %1", - "LOOKS_HELLO": "Hæ!", - "LOOKS_THINKFORSECS": "hugsaðu %1 í %2 sekúndur", - "LOOKS_THINK": "hugsaðu %1", - "LOOKS_HMM": "Hmmmm....", - "LOOKS_SHOW": "birta", - "LOOKS_HIDE": "fela", - "LOOKS_HIDEALLSPRITES": "fela allar teikningar", - "LOOKS_EFFECT_COLOR": "litur", - "LOOKS_EFFECT_FISHEYE": "fiskauga", - "LOOKS_EFFECT_WHIRL": "þyrla", - "LOOKS_EFFECT_PIXELATE": "pixla", - "LOOKS_EFFECT_MOSAIC": "mósaík", - "LOOKS_EFFECT_BRIGHTNESS": "birtustig", - "LOOKS_EFFECT_GHOST": "draugur", - "LOOKS_CHANGEEFFECTBY": "breyta %1 áhrifunum um %2", - "LOOKS_SETEFFECTTO": "settu %1 áhrifin á %2", - "LOOKS_CLEARGRAPHICEFFECTS": "hreinsa myndbrellur", - "LOOKS_CHANGESIZEBY": "breyta stærð um %1", - "LOOKS_SETSIZETO": "stærð verður %1 %", - "LOOKS_SIZE": "stærð", - "LOOKS_CHANGESTRETCHBY": "breyta teygju um %1", - "LOOKS_SETSTRETCHTO": "teygja verður %1 %", - "LOOKS_SWITCHCOSTUMETO": "breyttu í búning %1", - "LOOKS_NEXTCOSTUME": "næsti búningur", - "LOOKS_SWITCHBACKDROPTO": "bakgrunnur verður %1", - "LOOKS_GOTOFRONTBACK": "farðu á lag %1", - "LOOKS_GOTOFRONTBACK_FRONT": "fremst", - "LOOKS_GOTOFRONTBACK_BACK": "aftast", - "LOOKS_GOFORWARDBACKWARDLAYERS": "farðu %1 %2 lög", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "áfram", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "aftur á bak", - "LOOKS_BACKDROPNUMBERNAME": "bakgrunnur %1", - "LOOKS_COSTUMENUMBERNAME": "búningur %1", - "LOOKS_NUMBERNAME_NUMBER": "númer", - "LOOKS_NUMBERNAME_NAME": "nafn", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "nota bakgrunn %1 og bíða", - "LOOKS_NEXTBACKDROP_BLOCK": "næsti bakgrunnur", - "LOOKS_NEXTBACKDROP": "næsti bakgrunnur", - "LOOKS_PREVIOUSBACKDROP": "síðasti bakgrunnur", - "LOOKS_RANDOMBACKDROP": "handahófskenndur bakgrunnur", - "MOTION_MOVESTEPS": "fara %1 skref", - "MOTION_TURNLEFT": "snúa til %1 um %2 gráður", - "MOTION_TURNRIGHT": "snúa til %1 um %2 gráður", - "MOTION_POINTINDIRECTION": "stefna í %1 gráður", - "MOTION_POINTTOWARDS": "stefna í átt að %1", - "MOTION_POINTTOWARDS_POINTER": "músarbendill", - "MOTION_POINTTOWARDS_RANDOM": "random direction", - "MOTION_GOTO": "fara til %1", - "MOTION_GOTO_POINTER": "músarbendill", - "MOTION_GOTO_RANDOM": "handahófskennd staðsetning", - "MOTION_GOTOXY": "fara til x: %1 og y: %2", - "MOTION_GLIDESECSTOXY": "svífa í %1 sekúndur til x: %2 og y: %3", - "MOTION_GLIDETO": "svífa í %1 sekúndur til %2", - "MOTION_GLIDETO_POINTER": "músarbendill", - "MOTION_GLIDETO_RANDOM": "handahófskend staðsetning", - "MOTION_CHANGEXBY": "breyta x um %1", - "MOTION_SETX": "láttu x verða %1", - "MOTION_CHANGEYBY": "breyttu y um %1", - "MOTION_SETY": "láttu y verða %1", - "MOTION_IFONEDGEBOUNCE": "ef á kanti, snúðu við", - "MOTION_SETROTATIONSTYLE": "snúningsgerð verður %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vinstri-hægri", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ekki snúast", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "allan hringinn", - "MOTION_XPOSITION": "x hnit", - "MOTION_YPOSITION": "y hnit", - "MOTION_DIRECTION": "stefna", - "MOTION_SCROLLRIGHT": "skrolla hægri um %1", - "MOTION_SCROLLUP": "skrolla up %1", - "MOTION_ALIGNSCENE": "stilla til svið %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "neðra vinstra megin", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "neðra hægra megin", - "MOTION_ALIGNSCENE_MIDDLE": "miðjunni", - "MOTION_ALIGNSCENE_TOPLEFT": "efra vinstra megin", - "MOTION_ALIGNSCENE_TOPRIGHT": "efra hægra megin", - "MOTION_XSCROLL": "x skroll", - "MOTION_YSCROLL": "y skroll", - "MOTION_STAGE_SELECTED": "Sviðið hefur enga hreyfikubba", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "velja tölu á milli %1 og %2 af handahófi", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 og %2", - "OPERATORS_OR": "%1 eða %2", - "OPERATORS_NOT": "ekki %1", - "OPERATORS_JOIN": "sameina %1 og %2", - "OPERATORS_JOIN_APPLE": "epli", - "OPERATORS_JOIN_BANANA": "banani", - "OPERATORS_LETTEROF": "stafur númer %1 úr %2", - "OPERATORS_LETTEROF_APPLE": "e", - "OPERATORS_LENGTH": "lengd %1", - "OPERATORS_CONTAINS": "inniheldur %1 %2?", - "OPERATORS_MOD": "%1 modulus %2", - "OPERATORS_ROUND": "rúna %1", - "OPERATORS_MATHOP": "%1 af %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "rúna niður", - "OPERATORS_MATHOP_CEILING": "rúna upp", - "OPERATORS_MATHOP_SQRT": "kvaðratrót", - "OPERATORS_MATHOP_SIN": "sínus", - "OPERATORS_MATHOP_COS": "kósínus", - "OPERATORS_MATHOP_TAN": "tangens", - "OPERATORS_MATHOP_ASIN": "arksínus", - "OPERATORS_MATHOP_ACOS": "arkcósínus", - "OPERATORS_MATHOP_ATAN": "arktangens", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "skilgreina %1", - "SENSING_TOUCHINGOBJECT": "snertir %1", - "SENSING_TOUCHINGOBJECT_POINTER": "músarbendill", - "SENSING_TOUCHINGOBJECT_EDGE": "brún", - "SENSING_TOUCHINGCOLOR": "snertir litinn %1", - "SENSING_COLORISTOUCHINGCOLOR": "liturinn %1 snertir litinn %2", - "SENSING_DISTANCETO": "fjarlægð til %1", - "SENSING_DISTANCETO_POINTER": "músarbendill", - "SENSING_ASKANDWAIT": "spurðu %1 og bíddu", - "SENSING_ASK_TEXT": "Hvað heitir þú?", - "SENSING_ANSWER": "svar", - "SENSING_KEYPRESSED": "hnappur %1 sleginn", - "SENSING_MOUSEDOWN": "músarhnappur niðri?", - "SENSING_MOUSEX": "x hnit músar", - "SENSING_MOUSEY": "y hnit músar", - "SENSING_SETDRAGMODE": "breyttu dragstillingu %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "draganlegur", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ekki draganlegur", - "SENSING_LOUDNESS": "hljóðstyrkur", - "SENSING_LOUD": "hávær?", - "SENSING_TIMER": "skeiðklukka", - "SENSING_RESETTIMER": "endurstilla skeiðklukku", - "SENSING_OF": "%1 af %2", - "SENSING_OF_XPOSITION": "x hnit", - "SENSING_OF_YPOSITION": "y hnit", - "SENSING_OF_DIRECTION": "stefna", - "SENSING_OF_COSTUMENUMBER": "búnungur númer", - "SENSING_OF_COSTUMENAME": "nafn búnings", - "SENSING_OF_SIZE": "stærð", - "SENSING_OF_VOLUME": "hljóðstyrkur", - "SENSING_OF_BACKDROPNUMBER": "bakgrunnur númer", - "SENSING_OF_BACKDROPNAME": "nafn bakgrunns", - "SENSING_OF_STAGE": "Svið", - "SENSING_CURRENT": "núverandi %1", - "SENSING_CURRENT_YEAR": "ár", - "SENSING_CURRENT_MONTH": "mánuður", - "SENSING_CURRENT_DATE": "dagsetning", - "SENSING_CURRENT_DAYOFWEEK": "vikudagur", - "SENSING_CURRENT_HOUR": "klukkustund", - "SENSING_CURRENT_MINUTE": "mínúta", - "SENSING_CURRENT_SECOND": "sekúnda", - "SENSING_DAYSSINCE2000": "dagar síðan árið 2000", - "SENSING_USERNAME": "notendanafn", - "SENSING_USERID": "einkenni notenda", - "SOUND_PLAY": "spila hljóð %1", - "SOUND_PLAYUNTILDONE": "spila hljóð %1 þar til það klárast", - "SOUND_STOPALLSOUNDS": "stöðva öll hljóð", - "SOUND_SETEFFECTO": "settu %1 áhrifin á %2", - "SOUND_CHANGEEFFECTBY": "breyta %1 áhrifunum um %2", - "SOUND_CLEAREFFECTS": "fjarlægja hljóðbreytingar", - "SOUND_EFFECTS_PITCH": "tónhæð", - "SOUND_EFFECTS_PAN": "skima til vinstri/hægri", - "SOUND_CHANGEVOLUMEBY": "breyta hljóðstyrk um %1", - "SOUND_SETVOLUMETO": "setja hljóðstyrk í %1%", - "SOUND_VOLUME": "hljóðstyrkur", - "SOUND_RECORD": "record...", - "CATEGORY_MOTION": "Hreyfing", - "CATEGORY_LOOKS": "Útlit", - "CATEGORY_SOUND": "Hljóð", - "CATEGORY_EVENTS": "Atburðir", - "CATEGORY_CONTROL": "Stjórn", - "CATEGORY_SENSING": "Mæling", - "CATEGORY_OPERATORS": "Virkjar", - "CATEGORY_VARIABLES": "Breytur", - "CATEGORY_MYBLOCKS": "Mínir kubbar", - "DUPLICATE": "Tvöfalda", - "DELETE": "Eyða", - "ADD_COMMENT": "Bæta við athugasemd", - "REMOVE_COMMENT": "Fjarlægja athugasemd", - "DELETE_BLOCK": "Eyða kubb", - "DELETE_X_BLOCKS": "Eyða %1 kubbum", - "DELETE_ALL_BLOCKS": "Eyða öllum %1 kubbum", - "CLEAN_UP": "Hreinsa til kubbana", - "HELP": "Hjálp", - "UNDO": "Afturkalla", - "REDO": "Framkalla", - "EDIT_PROCEDURE": "Breyta", - "SHOW_PROCEDURE_DEFINITION": "Fara að skilgreiningu", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Segðu eitthvað...", - "COLOUR_HUE_LABEL": "Litur", - "COLOUR_SATURATION_LABEL": "mettun", - "COLOUR_BRIGHTNESS_LABEL": "Birtustig", - "CHANGE_VALUE_TITLE": "Breyta gildi:", - "RENAME_VARIABLE": "Endurskýra breytu", - "RENAME_VARIABLE_TITLE": "Endurskýra allar %1 breytur sem: ", - "RENAME_VARIABLE_MODAL_TITLE": "Endurskýra breytu", - "NEW_VARIABLE": "Smíða breytu", - "NEW_VARIABLE_TITLE": "Nafn nýrrar breytu:", - "VARIABLE_MODAL_TITLE": "Ný breyta", - "VARIABLE_ALREADY_EXISTS": "Það er nú þegar til breyta sem heitir \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Það er nú þegar til breyta sem heitir \"%1\" fyrir aðra breytu af týpunni \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Þú ert að nota %2 á %1 stöðum. Viltu samt eyða breytunni?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Þú getur ekki eytt breytunni %1 vegna þess að þú ert að nota hana í kubb af eigin hönnun. Hann heitir: %2.", - "DELETE_VARIABLE": "Eyða \"%1\" breytunni", - "NEW_PROCEDURE": "Búa til kubb", - "PROCEDURE_ALREADY_EXISTS": "Fall með nafninu \"%1\" er nú þegar til.", - "PROCEDURE_DEFAULT_NAME": "nafn kubbs", - "NEW_LIST": "Búa til lista", - "NEW_LIST_TITLE": "Nafn nýs lista:", - "LIST_MODAL_TITLE": "Nýr listi", - "LIST_ALREADY_EXISTS": "Það er nú þegar til listi sem heitir \"%1\".", - "RENAME_LIST_TITLE": "Endurskýra alla %1 lista sem:", - "RENAME_LIST_MODAL_TITLE": "Endurskýra lista", - "DEFAULT_LIST_ITEM": "hlutur", - "DELETE_LIST": "Delete the \"%1\" list", - "RENAME_LIST": "Rename list", - "NEW_BROADCAST_MESSAGE": "Ný skilaboð", - "NEW_BROADCAST_MESSAGE_TITLE": "Nafn nýrra skilaboða", - "BROADCAST_MODAL_TITLE": "Ný skilaboð", - "DEFAULT_BROADCAST_MESSAGE_NAME": "dæmiUmNafnÁSkilaboðum" -}; - -Blockly.ScratchMsgs.locales["it"] = -{ - "CONTROL_FOREVER": "per sempre", - "CONTROL_REPEAT": "ripeti %1 volte", - "CONTROL_IF": "se %1 allora", - "CONTROL_ELSE": "altrimenti", - "CONTROL_STOP": "ferma", - "CONTROL_STOP_ALL": "tutto", - "CONTROL_STOP_THIS": "questo script", - "CONTROL_STOP_OTHER": "tutti gli altri script dello sprite", - "CONTROL_WAIT": "attendi %1 secondi", - "CONTROL_WAITUNTIL": "attendi fino a quando %1", - "CONTROL_REPEATUNTIL": "ripeti fino a quando %1", - "CONTROL_WHILE": "mentre %1", - "CONTROL_FOREACH": "per ogni %1 in %2", - "CONTROL_STARTASCLONE": "quando vengo clonato", - "CONTROL_CREATECLONEOF": "crea clone di %1", - "CONTROL_CREATECLONEOF_MYSELF": "me stesso", - "CONTROL_DELETETHISCLONE": "elimina questo clone", - "CONTROL_COUNTER": "contatore", - "CONTROL_INCRCOUNTER": "incrementa contatore", - "CONTROL_CLEARCOUNTER": "azzera contatore", - "CONTROL_ALLATONCE": "esegui tutto insieme", - "DATA_SETVARIABLETO": "porta %1 a %2", - "DATA_CHANGEVARIABLEBY": "cambia %1 di %2", - "DATA_SHOWVARIABLE": "mostra la variabile %1", - "DATA_HIDEVARIABLE": "nascondi la variabile %1", - "DATA_ADDTOLIST": "aggiungi %1 a %2", - "DATA_DELETEOFLIST": "cancella %1 da %2", - "DATA_DELETEALLOFLIST": "cancella tutto da %1", - "DATA_INSERTATLIST": "inserisci %1 alla posizione %2 di %3", - "DATA_REPLACEITEMOFLIST": "sostituisci elemento %1 di %2 con %3", - "DATA_ITEMOFLIST": "elemento %1 di %2", - "DATA_ITEMNUMOFLIST": "posizione di %1 in %2", - "DATA_LENGTHOFLIST": "lunghezza di %1", - "DATA_LISTCONTAINSITEM": "%1 contiene %2", - "DATA_SHOWLIST": "mostra la lista %1", - "DATA_HIDELIST": "nascondi la lista %1", - "DATA_INDEX_ALL": "tutto", - "DATA_INDEX_LAST": "ultimo", - "DATA_INDEX_RANDOM": "a caso", - "EVENT_WHENFLAGCLICKED": "quando si clicca su %1", - "EVENT_WHENTHISSPRITECLICKED": "quando si clicca questo sprite", - "EVENT_WHENSTAGECLICKED": "quando si clicca sullo Stage", - "EVENT_WHENTOUCHINGOBJECT": "quando questo sprite tocca %1", - "EVENT_WHENBROADCASTRECEIVED": "quando ricevo %1", - "EVENT_WHENBACKDROPSWITCHESTO": "quando lo sfondo passa a %1", - "EVENT_WHENGREATERTHAN": "quando %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronometro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volume microfono", - "EVENT_BROADCAST": "invia a tutti %1", - "EVENT_BROADCASTANDWAIT": "invia a tutti %1 e attendi", - "EVENT_WHENKEYPRESSED": "quando si preme il tasto %1", - "EVENT_WHENKEYPRESSED_SPACE": "spazio", - "EVENT_WHENKEYPRESSED_LEFT": "freccia sinistra", - "EVENT_WHENKEYPRESSED_RIGHT": "freccia destra", - "EVENT_WHENKEYPRESSED_DOWN": "freccia giù", - "EVENT_WHENKEYPRESSED_UP": "freccia su", - "EVENT_WHENKEYPRESSED_ANY": "qualunque", - "LOOKS_SAYFORSECS": "dire %1 per %2 secondi", - "LOOKS_SAY": "dire %1", - "LOOKS_HELLO": "Ciao!", - "LOOKS_THINKFORSECS": "pensa %1 per %2 secondi", - "LOOKS_THINK": "pensa %1", - "LOOKS_HMM": "Uhm...", - "LOOKS_SHOW": "mostra", - "LOOKS_HIDE": "nascondi", - "LOOKS_HIDEALLSPRITES": "nascondi tutti gli sprite", - "LOOKS_EFFECT_COLOR": "colore", - "LOOKS_EFFECT_FISHEYE": "fish-eye", - "LOOKS_EFFECT_WHIRL": "mulinello", - "LOOKS_EFFECT_PIXELATE": "effetto pixel", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "luminosità", - "LOOKS_EFFECT_GHOST": "fantasma", - "LOOKS_CHANGEEFFECTBY": "cambia effetto %1 di %2", - "LOOKS_SETEFFECTTO": "porta effetto %1 a %2", - "LOOKS_CLEARGRAPHICEFFECTS": "rimuovi effetti grafici", - "LOOKS_CHANGESIZEBY": "cambia dimensione di %1", - "LOOKS_SETSIZETO": "porta dimensione a %1 %", - "LOOKS_SIZE": "dimensione", - "LOOKS_CHANGESTRETCHBY": "cambia allungamento di %1", - "LOOKS_SETSTRETCHTO": "porta allungamento a %1 %", - "LOOKS_SWITCHCOSTUMETO": "passa al costume %1", - "LOOKS_NEXTCOSTUME": "passa al costume seguente", - "LOOKS_SWITCHBACKDROPTO": "passa allo sfondo %1", - "LOOKS_GOTOFRONTBACK": "vai in %1 piano", - "LOOKS_GOTOFRONTBACK_FRONT": "primo", - "LOOKS_GOTOFRONTBACK_BACK": "secondo", - "LOOKS_GOFORWARDBACKWARDLAYERS": "vai %1 di %2 livelli", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "avanti", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "indietro", - "LOOKS_BACKDROPNUMBERNAME": "%1 sfondo", - "LOOKS_COSTUMENUMBERNAME": "%1 costume", - "LOOKS_NUMBERNAME_NUMBER": "numero", - "LOOKS_NUMBERNAME_NAME": "nome", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "passa allo sfondo %1 e attendi", - "LOOKS_NEXTBACKDROP_BLOCK": "passa allo sfondo seguente", - "LOOKS_NEXTBACKDROP": "seguente", - "LOOKS_PREVIOUSBACKDROP": "precedente", - "LOOKS_RANDOMBACKDROP": "scelto a caso", - "MOTION_MOVESTEPS": "fai %1 passi", - "MOTION_TURNLEFT": "ruota %1 di %2 gradi", - "MOTION_TURNRIGHT": "ruota %1 di %2 gradi", - "MOTION_POINTINDIRECTION": "punta in direzione %1", - "MOTION_POINTTOWARDS": "punta verso %1", - "MOTION_POINTTOWARDS_POINTER": "puntatore del mouse", - "MOTION_POINTTOWARDS_RANDOM": "direzione a caso", - "MOTION_GOTO": "raggiungi %1", - "MOTION_GOTO_POINTER": "puntatore del mouse", - "MOTION_GOTO_RANDOM": "posizione a caso", - "MOTION_GOTOXY": "vai a x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "scivola in %1 secondi a x: %2 y: %3", - "MOTION_GLIDETO": "scivola in %1 secondi a %2", - "MOTION_GLIDETO_POINTER": "puntatore del mouse", - "MOTION_GLIDETO_RANDOM": "posizione a caso", - "MOTION_CHANGEXBY": "cambia x di %1", - "MOTION_SETX": "vai dove x è %1", - "MOTION_CHANGEYBY": "cambia y di %1", - "MOTION_SETY": "vai dove y è %1", - "MOTION_IFONEDGEBOUNCE": "rimbalza quando tocchi il bordo", - "MOTION_SETROTATIONSTYLE": "usa stile rotazione %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "sinistra-destra", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "non ruotare", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "può ruotare", - "MOTION_XPOSITION": "posizione x", - "MOTION_YPOSITION": "posizione y", - "MOTION_DIRECTION": "direzione", - "MOTION_SCROLLRIGHT": "scrolla a destra di %1", - "MOTION_SCROLLUP": "scrolla in alto di %1", - "MOTION_ALIGNSCENE": "allinea la scena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "in basso a sinistra", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "in basso a destra", - "MOTION_ALIGNSCENE_MIDDLE": "in mezzo", - "MOTION_ALIGNSCENE_TOPLEFT": "in alto a sinistra", - "MOTION_ALIGNSCENE_TOPRIGHT": "in alto a destra", - "MOTION_XSCROLL": "posizione x dello scroll", - "MOTION_YSCROLL": "posizione y dello scroll", - "MOTION_STAGE_SELECTED": "Stage selezionato: nessun blocco di movimento", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "numero a caso tra %1 e %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 e %2", - "OPERATORS_OR": "%1 o %2", - "OPERATORS_NOT": "non %1", - "OPERATORS_JOIN": "unione di %1 e %2", - "OPERATORS_JOIN_APPLE": "mela", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "lettera %1 di %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "lunghezza di %1", - "OPERATORS_CONTAINS": "%1 contiene %2", - "OPERATORS_MOD": "resto della divisione di %1 diviso %2", - "OPERATORS_ROUND": "arrotonda %1", - "OPERATORS_MATHOP": "%1 di %2", - "OPERATORS_MATHOP_ABS": "valore assoluto", - "OPERATORS_MATHOP_FLOOR": "intero inferiore", - "OPERATORS_MATHOP_CEILING": "intero superiore", - "OPERATORS_MATHOP_SQRT": "radice quadrata", - "OPERATORS_MATHOP_SIN": "sen", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "arcsen", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definisci %1", - "SENSING_TOUCHINGOBJECT": "sta toccando %1", - "SENSING_TOUCHINGOBJECT_POINTER": "puntatore del mouse", - "SENSING_TOUCHINGOBJECT_EDGE": "bordo", - "SENSING_TOUCHINGCOLOR": "sta toccando il colore %1", - "SENSING_COLORISTOUCHINGCOLOR": "il colore %1 sta toccando il colore %2", - "SENSING_DISTANCETO": "distanza da %1", - "SENSING_DISTANCETO_POINTER": "puntatore del mouse", - "SENSING_ASKANDWAIT": "chiedi %1 e attendi", - "SENSING_ASK_TEXT": "Come ti chiami?", - "SENSING_ANSWER": "risposta", - "SENSING_KEYPRESSED": "tasto %1 premuto", - "SENSING_MOUSEDOWN": "pulsante del mouse premuto", - "SENSING_MOUSEX": "x del mouse", - "SENSING_MOUSEY": "y del mouse", - "SENSING_SETDRAGMODE": "rendi lo sprite %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "trascinabile", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "non trascinabile", - "SENSING_LOUDNESS": "volume microfono", - "SENSING_LOUD": "volume alto?", - "SENSING_TIMER": "cronometro", - "SENSING_RESETTIMER": "azzera cronometro", - "SENSING_OF": "%1 di %2", - "SENSING_OF_XPOSITION": "posizione x", - "SENSING_OF_YPOSITION": "posizione y", - "SENSING_OF_DIRECTION": "direzione", - "SENSING_OF_COSTUMENUMBER": "numero del costume", - "SENSING_OF_COSTUMENAME": "nome del costume", - "SENSING_OF_SIZE": "dimensione", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "numero dello sfondo", - "SENSING_OF_BACKDROPNAME": "nome dello sfondo", - "SENSING_OF_STAGE": "Stage", - "SENSING_CURRENT": "%1 attuale", - "SENSING_CURRENT_YEAR": "anno", - "SENSING_CURRENT_MONTH": "mese", - "SENSING_CURRENT_DATE": "data", - "SENSING_CURRENT_DAYOFWEEK": "giorno della settimana", - "SENSING_CURRENT_HOUR": "ora", - "SENSING_CURRENT_MINUTE": "minuto", - "SENSING_CURRENT_SECOND": "secondo", - "SENSING_DAYSSINCE2000": "giorni trascorsi dal 2000", - "SENSING_USERNAME": "username", - "SENSING_USERID": "user id", - "SOUND_PLAY": "avvia riproduzione suono %1", - "SOUND_PLAYUNTILDONE": "riproduci suono %1 e attendi la fine", - "SOUND_STOPALLSOUNDS": "ferma tutti i suoni", - "SOUND_SETEFFECTO": "porta effetto %1 a %2", - "SOUND_CHANGEEFFECTBY": "cambia effetto %1 di %2", - "SOUND_CLEAREFFECTS": "rimuovi effetti audio", - "SOUND_EFFECTS_PITCH": "frequenza", - "SOUND_EFFECTS_PAN": "panning sinistra/destra", - "SOUND_CHANGEVOLUMEBY": "cambia volume di %1", - "SOUND_SETVOLUMETO": "porta volume a %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "registrazione...", - "CATEGORY_MOTION": "Movimento", - "CATEGORY_LOOKS": "Aspetto", - "CATEGORY_SOUND": "Suono", - "CATEGORY_EVENTS": "Situazioni", - "CATEGORY_CONTROL": "Controllo", - "CATEGORY_SENSING": "Sensori", - "CATEGORY_OPERATORS": "Operatori", - "CATEGORY_VARIABLES": "Variabili", - "CATEGORY_MYBLOCKS": "I Miei Blocchi", - "DUPLICATE": "Duplica", - "DELETE": "Cancella", - "ADD_COMMENT": "Aggiungi commento", - "REMOVE_COMMENT": "Rimuovi commento", - "DELETE_BLOCK": "Cancella questo Blocco", - "DELETE_X_BLOCKS": "Cancella %1 Blocchi", - "DELETE_ALL_BLOCKS": "Cancellare i %1 blocchi?", - "CLEAN_UP": "Riordina i Blocchi", - "HELP": "Aiuto", - "UNDO": "Annulla", - "REDO": "Ripristina", - "EDIT_PROCEDURE": "Modifica", - "SHOW_PROCEDURE_DEFINITION": "Vai alla definizione", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dì qualcosa...", - "COLOUR_HUE_LABEL": "Colore", - "COLOUR_SATURATION_LABEL": "Saturazione", - "COLOUR_BRIGHTNESS_LABEL": "Luminosità", - "CHANGE_VALUE_TITLE": "Cambia il valore:", - "RENAME_VARIABLE": "Rinomina la variabile", - "RENAME_VARIABLE_TITLE": "Rinomina tutti i riferimenti alla variabile \"%1\" come:", - "RENAME_VARIABLE_MODAL_TITLE": "Rinomina la Variabile", - "NEW_VARIABLE": "Crea una Variabile", - "NEW_VARIABLE_TITLE": "Nome della nuova variabile:", - "VARIABLE_MODAL_TITLE": "Nuova Variabile", - "VARIABLE_ALREADY_EXISTS": "Una variabile chiamata \"%1\" esiste già.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Una variabile chiamata \"%1\" già esiste per un'altra variabile di tipo '%2'.", - "DELETE_VARIABLE_CONFIRMATION": "Eliminare tutti i %1 riferimenti alla variabile \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Non è possibile eliminare la variabile \"%1\" perchè fa parte della definizione della funzione \"%2\"", - "DELETE_VARIABLE": "Elimina la variabile \"%1\"", - "NEW_PROCEDURE": "Crea un Blocco", - "PROCEDURE_ALREADY_EXISTS": "Una procedura chiamata \"%1\" esiste già.", - "PROCEDURE_DEFAULT_NAME": "nome del blocco", - "NEW_LIST": "Crea una Lista", - "NEW_LIST_TITLE": "Nome della nuova lista:", - "LIST_MODAL_TITLE": "Nuova Lista", - "LIST_ALREADY_EXISTS": "Una lista chiamata \"%1\" esiste già.", - "RENAME_LIST_TITLE": "Rinomina tutti i riferimenti alla lista \"%1\" come:", - "RENAME_LIST_MODAL_TITLE": "Rinomina la Lista", - "DEFAULT_LIST_ITEM": "cosa", - "DELETE_LIST": "Cancella la lista \"%1\"", - "RENAME_LIST": "Rinomina lista", - "NEW_BROADCAST_MESSAGE": "Nuovo messaggio", - "NEW_BROADCAST_MESSAGE_TITLE": "Nome del nuovo messaggio:", - "BROADCAST_MODAL_TITLE": "Nuovo Messaggio", - "DEFAULT_BROADCAST_MESSAGE_NAME": "messaggio1" -}; - -Blockly.ScratchMsgs.locales["ka"] = -{ - "CONTROL_FOREVER": "მუდმივად", - "CONTROL_REPEAT": "გაიმეორე %1ჯერ", - "CONTROL_IF": "თუ %1 მაშინ", - "CONTROL_ELSE": "სხვა შემთხვევაში", - "CONTROL_STOP": "გააჩერე", - "CONTROL_STOP_ALL": "ყველაფერი", - "CONTROL_STOP_THIS": "ეს სკრიპტი", - "CONTROL_STOP_OTHER": "სპრაიტის სხვა სკრიპტები", - "CONTROL_WAIT": "იცადე %1 წამი", - "CONTROL_WAITUNTIL": "იცადე ვიდრე %1", - "CONTROL_REPEATUNTIL": "გაიმეორე ვიდრე %1", - "CONTROL_WHILE": "მანამ სანამ %1", - "CONTROL_FOREACH": "ყოველი %1თვის %2ში", - "CONTROL_STARTASCLONE": "როდესაც მე ვიწყებ როგორც კლონი", - "CONTROL_CREATECLONEOF": "შექმენი %1ს კლონი", - "CONTROL_CREATECLONEOF_MYSELF": "ჩემი", - "CONTROL_DELETETHISCLONE": "წაშალე ეს კლონი", - "CONTROL_COUNTER": "მრიცხველი", - "CONTROL_INCRCOUNTER": "ნამატის მრიცხველი", - "CONTROL_CLEARCOUNTER": "მრიცხველის განულება", - "CONTROL_ALLATONCE": "ყველაფერი ერთად", - "DATA_SETVARIABLETO": "მიანიჭე %1ს %2", - "DATA_CHANGEVARIABLEBY": "შეცვალე %1 %2ით", - "DATA_SHOWVARIABLE": "გამოაჩინე ცვლადი %1", - "DATA_HIDEVARIABLE": "დამალე ცვლადი %1", - "DATA_ADDTOLIST": "დაუმატე %1 %2ს", - "DATA_DELETEOFLIST": "წაშალე %1 %2დან", - "DATA_DELETEALLOFLIST": "წაშალე ყველაფერი %1დან", - "DATA_INSERTATLIST": "ჩასვი %1 %2მდე %3ში", - "DATA_REPLACEITEMOFLIST": "შეცვალე %1 %2დან %3ით", - "DATA_ITEMOFLIST": "ელემენტი %1 %2დან ", - "DATA_ITEMNUMOFLIST": "%1 ელემენტის № %2ში", - "DATA_LENGTHOFLIST": "%1ს სიგრძე", - "DATA_LISTCONTAINSITEM": "%1 შეიცავს %2ს?", - "DATA_SHOWLIST": "გამოაჩინე სია %1", - "DATA_HIDELIST": "დამალე სია %1", - "DATA_INDEX_ALL": "ყველა", - "DATA_INDEX_LAST": "ბოლო", - "DATA_INDEX_RANDOM": "შემთხვევითი", - "EVENT_WHENFLAGCLICKED": "როდესაც აჭერ %1", - "EVENT_WHENTHISSPRITECLICKED": "როდესაც აჭერ ამ სპრაიტს", - "EVENT_WHENSTAGECLICKED": "როდესაც აჭერ სცენას", - "EVENT_WHENTOUCHINGOBJECT": "როდესაც ეს სპრაიტი ეხება %1ს", - "EVENT_WHENBROADCASTRECEIVED": "როდესაც ვიღებ %1ს", - "EVENT_WHENBACKDROPSWITCHESTO": "როდესაც ფონი ხდება %1", - "EVENT_WHENGREATERTHAN": "როდესაც %1 >%2", - "EVENT_WHENGREATERTHAN_TIMER": "წამზომი", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ხმის სიმაღლე", - "EVENT_BROADCAST": "გადაეცი %1", - "EVENT_BROADCASTANDWAIT": "გადაეცი %1 და იცადე", - "EVENT_WHENKEYPRESSED": "როდესაც აჭერ ღილაკს %1", - "EVENT_WHENKEYPRESSED_SPACE": "დაშორება", - "EVENT_WHENKEYPRESSED_LEFT": "ისარი მარცხნივ", - "EVENT_WHENKEYPRESSED_RIGHT": "ისარი მარჯვნივ", - "EVENT_WHENKEYPRESSED_DOWN": "ისარი ქვევით", - "EVENT_WHENKEYPRESSED_UP": "ისარი ზევით", - "EVENT_WHENKEYPRESSED_ANY": "ნებისმიერი", - "LOOKS_SAYFORSECS": "თქვი %1 %2 წამით", - "LOOKS_SAY": "თქვი %1", - "LOOKS_HELLO": "გამარჯობა!", - "LOOKS_THINKFORSECS": "იფიქრე %1 %2 წამით", - "LOOKS_THINK": "იფიქრე %1", - "LOOKS_HMM": "ჰმმ...", - "LOOKS_SHOW": "გამოჩნდი", - "LOOKS_HIDE": "დაიმალე", - "LOOKS_HIDEALLSPRITES": "დამალე ყველა სპრაიტი", - "LOOKS_EFFECT_COLOR": "ფერი", - "LOOKS_EFFECT_FISHEYE": "თევზის თვალი", - "LOOKS_EFFECT_WHIRL": "ქარიშხალი", - "LOOKS_EFFECT_PIXELATE": "პიქსელიზაცია", - "LOOKS_EFFECT_MOSAIC": "მოზაიკა", - "LOOKS_EFFECT_BRIGHTNESS": "სიკაშკაშე", - "LOOKS_EFFECT_GHOST": "მოჩვენება", - "LOOKS_CHANGEEFFECTBY": "შეცვალე%1ეფექტი%2ით", - "LOOKS_SETEFFECTTO": "დააყენე %1 ეფექტი %2", - "LOOKS_CLEARGRAPHICEFFECTS": "გრაფიკული ეფექტების მოხსნა", - "LOOKS_CHANGESIZEBY": "შეცვალე ზომა %1ით", - "LOOKS_SETSIZETO": "დააყენე ზომა %1 %", - "LOOKS_SIZE": "ზომა", - "LOOKS_CHANGESTRETCHBY": "შეცვალე დაჭიმულობა %1ით", - "LOOKS_SETSTRETCHTO": "დაჭიმულობა %1 %", - "LOOKS_SWITCHCOSTUMETO": "გადაერთე კოსტიუმზე %1", - "LOOKS_NEXTCOSTUME": "მომდევნო კოსტიუმი", - "LOOKS_SWITCHBACKDROPTO": "გადაერთე ფონზე %1", - "LOOKS_GOTOFRONTBACK": "გადადი %1 შრეზე", - "LOOKS_GOTOFRONTBACK_FRONT": "წინა", - "LOOKS_GOTOFRONTBACK_BACK": "უკანა", - "LOOKS_GOFORWARDBACKWARDLAYERS": "გადადი %1 %2 შრით", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "წინ", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "უკან", - "LOOKS_BACKDROPNUMBERNAME": "ფონი %1", - "LOOKS_COSTUMENUMBERNAME": "კოსტიუმი %1", - "LOOKS_NUMBERNAME_NUMBER": "ნომერი", - "LOOKS_NUMBERNAME_NAME": "სახელი", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "გადაერთე ფონზე %1 და იცადე", - "LOOKS_NEXTBACKDROP_BLOCK": "მომდევნო ფონი", - "LOOKS_NEXTBACKDROP": "მომდევნო ფონი", - "LOOKS_PREVIOUSBACKDROP": "წინა ფონი", - "LOOKS_RANDOMBACKDROP": "შემთხვევითი ფონი", - "MOTION_MOVESTEPS": "გადადგი %1 ნაბიჯი", - "MOTION_TURNLEFT": "მობრუნდი %1 %2 გრადუსით", - "MOTION_TURNRIGHT": "მობრუნდი %1 %2 გრადუსით", - "MOTION_POINTINDIRECTION": "მიუთითე %1 მიმართულებით", - "MOTION_POINTTOWARDS": "მიუთითე %1", - "MOTION_POINTTOWARDS_POINTER": "თაგვის მაჩვენებლისაკენ", - "MOTION_POINTTOWARDS_RANDOM": "შემთხვევითი მიმართულებით", - "MOTION_GOTO": "გადადი %1", - "MOTION_GOTO_POINTER": "თაგვის მაჩვენებლისაკენ", - "MOTION_GOTO_RANDOM": "შემთხვევითი ადგილისაკენ", - "MOTION_GOTOXY": "გადადი x: %1 y:%2", - "MOTION_GLIDESECSTOXY": "ისრიალე %1 წმ x:%2 y:%3კენ", - "MOTION_GLIDETO": "ისრიალე %1 წმ %2", - "MOTION_GLIDETO_POINTER": "თაგვის მაჩვენებლისაკენ", - "MOTION_GLIDETO_RANDOM": "შემთხვევითი ადგილისაკენ", - "MOTION_CHANGEXBY": "შეცვალე x %1ით", - "MOTION_SETX": "მიანიჭე x-ს %1", - "MOTION_CHANGEYBY": "შეცვალე y %1ით", - "MOTION_SETY": "მიანიჭე y-ს %1", - "MOTION_IFONEDGEBOUNCE": "ზღვარზე უკანდახევა", - "MOTION_SETROTATIONSTYLE": "ბრუნვის წესი %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "მარცხნივ-მარჯვნივ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ბრუნვის გარეშე", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "გარშემო", - "MOTION_XPOSITION": "x მდებარეობა", - "MOTION_YPOSITION": "y მდებარეობა", - "MOTION_DIRECTION": "მიმართულება", - "MOTION_SCROLLRIGHT": "მარჯვნივ გადახვევა %1", - "MOTION_SCROLLUP": "ზემოთ გადახვევა %1", - "MOTION_ALIGNSCENE": "გაასწორე სცენა %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ქვედა-მარცხენა", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ქვედა-მარჯვენა", - "MOTION_ALIGNSCENE_MIDDLE": "შუა", - "MOTION_ALIGNSCENE_TOPLEFT": "ზედა-მარცხენა", - "MOTION_ALIGNSCENE_TOPRIGHT": "ზედა-მარჯვენა", - "MOTION_XSCROLL": "x გადახვევა", - "MOTION_YSCROLL": "y გადახვევა", - "MOTION_STAGE_SELECTED": "არჩეულია სცენა: მოძრაობის ბლოკების გარეშე", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1-%2", - "OPERATORS_MULTIPLY": "%1*%2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "შემთხვევითი %1დან %2მდე", - "OPERATORS_GT": "%1>%2", - "OPERATORS_LT": "%1<%2", - "OPERATORS_EQUALS": "%1=%2", - "OPERATORS_AND": "%1 და %2", - "OPERATORS_OR": "%1 ან %2", - "OPERATORS_NOT": "არა %1", - "OPERATORS_JOIN": "შეაერთე %1 %2", - "OPERATORS_JOIN_APPLE": "ვაშლი", - "OPERATORS_JOIN_BANANA": "ბანანი", - "OPERATORS_LETTEROF": "ასო %1 %2დან ", - "OPERATORS_LETTEROF_APPLE": "ა", - "OPERATORS_LENGTH": "%1ს სიგრძე", - "OPERATORS_CONTAINS": "%1 შეიცავს %2ს?", - "OPERATORS_MOD": "%1 მოდული %2", - "OPERATORS_ROUND": "დაამრგვალე %1", - "OPERATORS_MATHOP": "%2ს %1", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "უმცირესი მთელი", - "OPERATORS_MATHOP_CEILING": "უდიდესი მთელი", - "OPERATORS_MATHOP_SQRT": "კვადრატული ფესვი", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10^", - "PROCEDURES_DEFINITION": "განსაზღვრე %1", - "SENSING_TOUCHINGOBJECT": "ეხება %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "თაგვის მაჩვენებელს", - "SENSING_TOUCHINGOBJECT_EDGE": "ზღვარს", - "SENSING_TOUCHINGCOLOR": "ეხება ფერს %1?", - "SENSING_COLORISTOUCHINGCOLOR": "ფერი %1 ეხება %2ს?", - "SENSING_DISTANCETO": "მანძილი %1", - "SENSING_DISTANCETO_POINTER": "თაგვის მაჩვენებლამდე", - "SENSING_ASKANDWAIT": "იკითხე %1 და იცადე ", - "SENSING_ASK_TEXT": "რა გქვია?", - "SENSING_ANSWER": "პასუხი", - "SENSING_KEYPRESSED": "ღილაკი %1 დაჭერილია?", - "SENSING_MOUSEDOWN": "თაგვი დაჭერილია?", - "SENSING_MOUSEX": "თაგვი x", - "SENSING_MOUSEY": "თაგვი y", - "SENSING_SETDRAGMODE": "გადატანის წესი %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "შეიძლება", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "არ შეიძლება", - "SENSING_LOUDNESS": "ხმის სიმაღლე", - "SENSING_LOUD": "ხმა მაღალია?", - "SENSING_TIMER": "წამზომი", - "SENSING_RESETTIMER": "წამზომის განულება", - "SENSING_OF": "%2ს %1", - "SENSING_OF_XPOSITION": "x მდებარეობა", - "SENSING_OF_YPOSITION": "y მდებარეობა", - "SENSING_OF_DIRECTION": "მიმართულება", - "SENSING_OF_COSTUMENUMBER": "კოსტიუმის ნომერი", - "SENSING_OF_COSTUMENAME": "კოსტიუმის სახელი", - "SENSING_OF_SIZE": "ზომა", - "SENSING_OF_VOLUME": "ხმის სიმაღლე", - "SENSING_OF_BACKDROPNUMBER": "ფონის ნომერი", - "SENSING_OF_BACKDROPNAME": "ფონის სახელი", - "SENSING_OF_STAGE": "სცენა", - "SENSING_CURRENT": "მიმდინარე %1", - "SENSING_CURRENT_YEAR": "წელი", - "SENSING_CURRENT_MONTH": "თვე", - "SENSING_CURRENT_DATE": "თარიღი", - "SENSING_CURRENT_DAYOFWEEK": "კვირის დღე", - "SENSING_CURRENT_HOUR": "საათი", - "SENSING_CURRENT_MINUTE": "წუთი", - "SENSING_CURRENT_SECOND": "წამი", - "SENSING_DAYSSINCE2000": "2000-ის შემდგომი დღეები", - "SENSING_USERNAME": "მომხმარებელი", - "SENSING_USERID": "მომხმარებლის id", - "SOUND_PLAY": "ჩართე ხმა %1", - "SOUND_PLAYUNTILDONE": "დაუკარი ხმა %1 დასრულებამდე", - "SOUND_STOPALLSOUNDS": "გამორთე ყველა ხმა", - "SOUND_SETEFFECTO": "დააყენე%1ეფექტი%2", - "SOUND_CHANGEEFFECTBY": "შეცვალე%1ეფექტი%2ით", - "SOUND_CLEAREFFECTS": "ხმის ეფექტების მოხსნა", - "SOUND_EFFECTS_PITCH": "ბგერის სიმაღლე", - "SOUND_EFFECTS_PAN": "ხმა მარცხნიდან/მარჯვნიდან", - "SOUND_CHANGEVOLUMEBY": "შეცვლე ხმის სიმაღლე %1ით", - "SOUND_SETVOLUMETO": "ხმის სიმაღლე %1%", - "SOUND_VOLUME": "ხმის სიმაღლე", - "SOUND_RECORD": "ჩაწერა...", - "CATEGORY_MOTION": "მოძრაობა", - "CATEGORY_LOOKS": "გარეგნობა", - "CATEGORY_SOUND": "ხმა", - "CATEGORY_EVENTS": "მოვლენები", - "CATEGORY_CONTROL": "მართვა", - "CATEGORY_SENSING": "სენსორები", - "CATEGORY_OPERATORS": "ოპერატორები", - "CATEGORY_VARIABLES": "ცვლადები", - "CATEGORY_MYBLOCKS": "ჩემი ბლოკები", - "DUPLICATE": "დუბლირება", - "DELETE": "წაშლა", - "ADD_COMMENT": "დაამატე კომენტარი", - "REMOVE_COMMENT": "წაშალე კომენტარი", - "DELETE_BLOCK": "წაშალე ბლოკი", - "DELETE_X_BLOCKS": "წაშალე %1 ბლოკები", - "DELETE_ALL_BLOCKS": "წავშალო ყველა %1 ბლოკები?", - "CLEAN_UP": "გაასუფთავე ბლოკები", - "HELP": "დახმარება", - "UNDO": "მოქმედების გაუქმება", - "REDO": "აღდგენა", - "EDIT_PROCEDURE": "რედაქტირება", - "SHOW_PROCEDURE_DEFINITION": "გადადი განმარტებაზე", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "თქვი რამე...", - "COLOUR_HUE_LABEL": "ფერი", - "COLOUR_SATURATION_LABEL": "გაჯერება", - "COLOUR_BRIGHTNESS_LABEL": "სიკაშკაშე", - "CHANGE_VALUE_TITLE": "შეცვალე მნიშვნელობა:", - "RENAME_VARIABLE": "შეუცვალე სახელი ცვლადს", - "RENAME_VARIABLE_TITLE": "შეუცვალე სახელი ყველა \"%1\" ცვლადს შემდეგით:", - "RENAME_VARIABLE_MODAL_TITLE": "შეუცვალე სახელი ცვლადს", - "NEW_VARIABLE": "შექმენი ცვლადი", - "NEW_VARIABLE_TITLE": "ახალი ცვლადის სახელი:", - "VARIABLE_MODAL_TITLE": "ახალი ცვლადი", - "VARIABLE_ALREADY_EXISTS": "ცვლადი სახელად \"%1\" უკვე არსებობს", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ცვლადი სახელად \"%1\" უკვე არსებობს სხვა ცვლადების ტიპისათვის \"%2\" ", - "DELETE_VARIABLE_CONFIRMATION": "წავშალო \"%2\" ცვლადის %1 გამოყენება? ", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "შეუძლებელია ცვლადი \"%1\"-ის წაშლა რადგან ის არის \"%2\"-ის ფუნქციის განსაზღვრის ნაწილი ", - "DELETE_VARIABLE": "წაშალე ცვლადი \"%1\"", - "NEW_PROCEDURE": "შექმენი ბლოკი", - "PROCEDURE_ALREADY_EXISTS": "პროცედურა სახელად \"%1\" უკვე არსებობს", - "PROCEDURE_DEFAULT_NAME": "ბლოკის სახელი", - "NEW_LIST": "შექმენი სია", - "NEW_LIST_TITLE": "ახალი სიის სახელი:", - "LIST_MODAL_TITLE": "ახალი სია", - "LIST_ALREADY_EXISTS": "სია სახელად \"%1\" უკვე არსებობს", - "RENAME_LIST_TITLE": "შეუცვალე სახელი ყველა \"%1\" სიას:", - "RENAME_LIST_MODAL_TITLE": "სიის სახელის შეცვლა", - "DEFAULT_LIST_ITEM": "რაიმე", - "DELETE_LIST": "წაშალე სია \"%1\"", - "RENAME_LIST": "სიის სახელის შეცვლა", - "NEW_BROADCAST_MESSAGE": "ახალი შეტყობინება", - "NEW_BROADCAST_MESSAGE_TITLE": "ახალი შეტყობინების სახელი", - "BROADCAST_MODAL_TITLE": "ახალი შეტყობინება", - "DEFAULT_BROADCAST_MESSAGE_NAME": "შეტყობინება1" -}; - -Blockly.ScratchMsgs.locales["sw"] = -{ - "CONTROL_FOREVER": "milele", - "CONTROL_REPEAT": "rudia %1", - "CONTROL_IF": "ikiwa %1 basi", - "CONTROL_ELSE": "isivyo", - "CONTROL_STOP": "komesha", - "CONTROL_STOP_ALL": "kila kitu", - "CONTROL_STOP_THIS": "hati hii", - "CONTROL_STOP_OTHER": "hati nyingine katika kihusika", - "CONTROL_WAIT": "subiri sekunde %1", - "CONTROL_WAITUNTIL": "subiri hadi %1", - "CONTROL_REPEATUNTIL": "rudia hadi %1", - "CONTROL_WHILE": "wakati %1", - "CONTROL_FOREACH": "kwa kila %1 katika %2 ", - "CONTROL_STARTASCLONE": "nikianza kama kinakili", - "CONTROL_CREATECLONEOF": "unda kinakili cha %1", - "CONTROL_CREATECLONEOF_MYSELF": "mimi mwenye", - "CONTROL_DELETETHISCLONE": "futa kinakili hiki", - "CONTROL_COUNTER": "kipiga hesabu", - "CONTROL_INCRCOUNTER": "ongezea kwa kipiga hesabu", - "CONTROL_CLEARCOUNTER": "futa kipiga hesabu", - "CONTROL_ALLATONCE": "zote mara moja", - "DATA_SETVARIABLETO": "weka %1 iwe %2", - "DATA_CHANGEVARIABLEBY": "badilisha %1 kwa %2", - "DATA_SHOWVARIABLE": "onyesha kibadilika %1", - "DATA_HIDEVARIABLE": "ficha kibadilika %1", - "DATA_ADDTOLIST": "ongeza %1 kwa %2", - "DATA_DELETEOFLIST": "futa %1 kati ya %2", - "DATA_DELETEALLOFLIST": "futa %1 zote", - "DATA_INSERTATLIST": "weka %1 kwa %2 kati ya %3", - "DATA_REPLACEITEMOFLIST": "badilisha kipengee %1 kati ya %2 na %3", - "DATA_ITEMOFLIST": "kipengee %1 kati ya %2", - "DATA_ITEMNUMOFLIST": "kipengee # kati ya %1 katika %2", - "DATA_LENGTHOFLIST": "urefu wa %1", - "DATA_LISTCONTAINSITEM": "%1 ina %2?", - "DATA_SHOWLIST": "onyesha orodha %1", - "DATA_HIDELIST": "ficha orodha %1", - "DATA_INDEX_ALL": "kila kitu", - "DATA_INDEX_LAST": "mwisho", - "DATA_INDEX_RANDOM": "mahali popote", - "EVENT_WHENFLAGCLICKED": "wakati %1 inapobonyezwa", - "EVENT_WHENTHISSPRITECLICKED": "wakati kihusika hiki kinapobonyezwa", - "EVENT_WHENSTAGECLICKED": "wakati jukwaa linapobonyezwa", - "EVENT_WHENTOUCHINGOBJECT": "wakati kihusika hiki kinapoguza %1", - "EVENT_WHENBROADCASTRECEIVED": "wakati ninapopokea %1", - "EVENT_WHENBACKDROPSWITCHESTO": "mandhari ya nyuma itakapobadilika kuwa %1", - "EVENT_WHENGREATERTHAN": "wakati %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "kipima muda", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ukubwa wa sauti", - "EVENT_BROADCAST": "tangaza %1", - "EVENT_BROADCASTANDWAIT": "tangaza %1 na usubiri", - "EVENT_WHENKEYPRESSED": "wakati kitufe cha %1 kinapobonyezwa", - "EVENT_WHENKEYPRESSED_SPACE": "nafasi", - "EVENT_WHENKEYPRESSED_LEFT": "kishale kushoto", - "EVENT_WHENKEYPRESSED_RIGHT": "kishale kulia", - "EVENT_WHENKEYPRESSED_DOWN": "kishale chini", - "EVENT_WHENKEYPRESSED_UP": "kishale juu", - "EVENT_WHENKEYPRESSED_ANY": "kitufe chochote", - "LOOKS_SAYFORSECS": "sema %1 kwa sekunde %2", - "LOOKS_SAY": "sema %1", - "LOOKS_HELLO": "Habari!", - "LOOKS_THINKFORSECS": "fikiria %1 kwa sekunde %2", - "LOOKS_THINK": "fikiria %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "onyesha", - "LOOKS_HIDE": "ficha", - "LOOKS_HIDEALLSPRITES": "ficha vihusika vyote", - "LOOKS_EFFECT_COLOR": "rangi", - "LOOKS_EFFECT_FISHEYE": "jicho la samaki", - "LOOKS_EFFECT_WHIRL": "mzunguko", - "LOOKS_EFFECT_PIXELATE": "ubora wa picha", - "LOOKS_EFFECT_MOSAIC": "mozaiki", - "LOOKS_EFFECT_BRIGHTNESS": "mng'aro", - "LOOKS_EFFECT_GHOST": "mzuka", - "LOOKS_CHANGEEFFECTBY": "badilisha athari ya %1 kwa %2", - "LOOKS_SETEFFECTTO": "weka athari ya %1 iwe %2", - "LOOKS_CLEARGRAPHICEFFECTS": "futa athari za picha", - "LOOKS_CHANGESIZEBY": "badilisha ukubwa kwa %1", - "LOOKS_SETSIZETO": "weka ukubwa uwe %1", - "LOOKS_SIZE": "ukubwa", - "LOOKS_CHANGESTRETCHBY": "badilisha mnyoosho kwa %1", - "LOOKS_SETSTRETCHTO": "weka mnyoosho uwe %1 %", - "LOOKS_SWITCHCOSTUMETO": "badilisha mtindo kuwa %1", - "LOOKS_NEXTCOSTUME": "mtindo ufuatao", - "LOOKS_SWITCHBACKDROPTO": "badilisha mandhari ya nyuma iwe %1", - "LOOKS_GOTOFRONTBACK": "enda kwa safu ya %1", - "LOOKS_GOTOFRONTBACK_FRONT": "mbele", - "LOOKS_GOTOFRONTBACK_BACK": "nyuma", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 kwa safu ya %2", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "enda mbele", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "rudi nyuma", - "LOOKS_BACKDROPNUMBERNAME": "mandhari ya nyuma %1", - "LOOKS_COSTUMENUMBERNAME": "mtindo %1", - "LOOKS_NUMBERNAME_NUMBER": "nambari", - "LOOKS_NUMBERNAME_NAME": "jina", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "badilisha mandhari ya nyuma kuwa %1 na subiri", - "LOOKS_NEXTBACKDROP_BLOCK": "mandhari ya nyuma ifuatayo", - "LOOKS_NEXTBACKDROP": "mandhari ya nyuma ifuatayo", - "LOOKS_PREVIOUSBACKDROP": "mandhari ya nyuma iliyotangulia", - "LOOKS_RANDOMBACKDROP": "mandhari ya nyuma yoyote", - "MOTION_MOVESTEPS": "songa hatua %1", - "MOTION_TURNLEFT": "zunguka digrii %1 %2 ", - "MOTION_TURNRIGHT": "zunguka digrii %1 %2 ", - "MOTION_POINTINDIRECTION": "elekeza kwa mwelekeo %1", - "MOTION_POINTTOWARDS": "elekea %1", - "MOTION_POINTTOWARDS_POINTER": "kielekezi cha kipanya", - "MOTION_POINTTOWARDS_RANDOM": "mwelekeo wowote", - "MOTION_GOTO": "enda kwa %1", - "MOTION_GOTO_POINTER": "kielekezi cha kipanya", - "MOTION_GOTO_RANDOM": "mahali popote", - "MOTION_GOTOXY": "enda kwa x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "teleza %1 sekunde hadi x: %2 y: %3", - "MOTION_GLIDETO": "teleza sekunde %1 hadi %2", - "MOTION_GLIDETO_POINTER": "kielekezi cha kipanya", - "MOTION_GLIDETO_RANDOM": "mahali popote", - "MOTION_CHANGEXBY": "badilisha x kwa %1", - "MOTION_SETX": "weka x kuwa %1", - "MOTION_CHANGEYBY": "badilisha y kwa %1", - "MOTION_SETY": "weka y kuwa %1", - "MOTION_IFONEDGEBOUNCE": "ikiwa kwenye ukingo wa jukwaa, rejesha", - "MOTION_SETROTATIONSTYLE": "weka mtindo wa mzunguko %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "kushoto-kulia", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "isizunguke", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "pande zote", - "MOTION_XPOSITION": "nafasi ya x", - "MOTION_YPOSITION": "nafasi ya y", - "MOTION_DIRECTION": "mwelekeo", - "MOTION_SCROLLRIGHT": "tembeza kulia %1", - "MOTION_SCROLLUP": "tembeza juu %1", - "MOTION_ALIGNSCENE": "patanisha eneo %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "chini-kushoto", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "chini-kulia", - "MOTION_ALIGNSCENE_MIDDLE": "katikati", - "MOTION_ALIGNSCENE_TOPLEFT": "juu-kushoto", - "MOTION_ALIGNSCENE_TOPRIGHT": "juu-kulia", - "MOTION_XSCROLL": "tembeza x", - "MOTION_YSCROLL": "tembeza y", - "MOTION_STAGE_SELECTED": "Jukwaa limechanguliwa: hakuna bloku za mwendo", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "chagua %1 yoyote hadi %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 na %2", - "OPERATORS_OR": "%1 au %2", - "OPERATORS_NOT": "si %1", - "OPERATORS_JOIN": "unganisha %1 %2", - "OPERATORS_JOIN_APPLE": "tufaha", - "OPERATORS_JOIN_BANANA": "ndizi", - "OPERATORS_LETTEROF": "herufi %1 kati ya %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "urefu wa %1", - "OPERATORS_CONTAINS": "%1 ina %2?", - "OPERATORS_MOD": "%1 mabaki %2", - "OPERATORS_ROUND": "kadiria %1", - "OPERATORS_MATHOP": "%1 kati ya %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "sakafu", - "OPERATORS_MATHOP_CEILING": "dari", - "OPERATORS_MATHOP_SQRT": "kipeo cha pili", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "fafanua %1", - "SENSING_TOUCHINGOBJECT": "inashika %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "kielekezi cha kipanya", - "SENSING_TOUCHINGOBJECT_EDGE": "ukingo", - "SENSING_TOUCHINGCOLOR": "inashika rangi %1?", - "SENSING_COLORISTOUCHINGCOLOR": "rangi %1 inashika %2?", - "SENSING_DISTANCETO": "umbali hadi %1", - "SENSING_DISTANCETO_POINTER": "kielekezi cha kipanya", - "SENSING_ASKANDWAIT": "uliza %1 na subiri", - "SENSING_ASK_TEXT": "Jina lako nani?", - "SENSING_ANSWER": "jibu", - "SENSING_KEYPRESSED": "kitufe cha %1 kimebonyezwa?", - "SENSING_MOUSEDOWN": "kipanya chini?", - "SENSING_MOUSEX": "kipanya x", - "SENSING_MOUSEY": "kipanya y", - "SENSING_SETDRAGMODE": "kihusika %1 kuvutwa", - "SENSING_SETDRAGMODE_DRAGGABLE": "kinaweza", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "hakiwezi", - "SENSING_LOUDNESS": "ukubwa wa sauti", - "SENSING_LOUD": "kuna sauti kubwa?", - "SENSING_TIMER": "kitunza wakati", - "SENSING_RESETTIMER": "anzisha tena kitunza muda", - "SENSING_OF": "%1 kwa %2", - "SENSING_OF_XPOSITION": "nafasi ya x", - "SENSING_OF_YPOSITION": "nafasi ya y", - "SENSING_OF_DIRECTION": "mwelekeo", - "SENSING_OF_COSTUMENUMBER": "mtindo #", - "SENSING_OF_COSTUMENAME": "jina la mtindo", - "SENSING_OF_SIZE": "ukubwa", - "SENSING_OF_VOLUME": "kiasi ya sauti", - "SENSING_OF_BACKDROPNUMBER": "mandhari ya nyuma #", - "SENSING_OF_BACKDROPNAME": "jina la mandhari ya nyuma", - "SENSING_OF_STAGE": "Jukwaa", - "SENSING_CURRENT": "sasa hivi %1", - "SENSING_CURRENT_YEAR": "mwaka", - "SENSING_CURRENT_MONTH": "mwezi", - "SENSING_CURRENT_DATE": "tarehe", - "SENSING_CURRENT_DAYOFWEEK": "siku ya wiki", - "SENSING_CURRENT_HOUR": "saa", - "SENSING_CURRENT_MINUTE": "dakika", - "SENSING_CURRENT_SECOND": "sekunde", - "SENSING_DAYSSINCE2000": "siku tangu 2000", - "SENSING_USERNAME": "jina la mtumiaji", - "SENSING_USERID": "kitambulisho cha mtumiaji", - "SOUND_PLAY": "anza sauti %1", - "SOUND_PLAYUNTILDONE": "cheza sauti %1 hadi ikamilike", - "SOUND_STOPALLSOUNDS": "komesha sauti zote", - "SOUND_SETEFFECTO": "weka athari ya %1 kuwa %2", - "SOUND_CHANGEEFFECTBY": "badilisha athari ya %1 kwa %2", - "SOUND_CLEAREFFECTS": "futa athari zote za sauti", - "SOUND_EFFECTS_PITCH": "uzito wa sauti", - "SOUND_EFFECTS_PAN": "peleka sauti kushoto/kulia", - "SOUND_CHANGEVOLUMEBY": "badilisha kiasi ya sauti kwa %1", - "SOUND_SETVOLUMETO": "weka kiasi ya sauti kuwa %1%", - "SOUND_VOLUME": "kiasi ya sauti", - "SOUND_RECORD": "inarekodi...", - "CATEGORY_MOTION": "Mwendo", - "CATEGORY_LOOKS": "Muonekano", - "CATEGORY_SOUND": "Sauti", - "CATEGORY_EVENTS": "Matukio", - "CATEGORY_CONTROL": "Kidhibiti", - "CATEGORY_SENSING": "Hisi", - "CATEGORY_OPERATORS": "Opereta", - "CATEGORY_VARIABLES": "Vibadilika", - "CATEGORY_MYBLOCKS": "Bloku Zangu", - "DUPLICATE": "Toa Nakala Nyingine", - "DELETE": "Futa", - "ADD_COMMENT": "Ongeza Maoni", - "REMOVE_COMMENT": "Futa Maoni", - "DELETE_BLOCK": "Futa Bloku", - "DELETE_X_BLOCKS": "Futa Bloku %1", - "DELETE_ALL_BLOCKS": "Unataka kufuta bloku zote za %1?", - "CLEAN_UP": "Safisha Bloku", - "HELP": "Usaidizi", - "UNDO": "Ondoa", - "REDO": "Rudia", - "EDIT_PROCEDURE": "Hariri", - "SHOW_PROCEDURE_DEFINITION": "Enda kwa ufafanuzi", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sema kitu...", - "COLOUR_HUE_LABEL": "Rangi", - "COLOUR_SATURATION_LABEL": "Kiasi ya Rangi", - "COLOUR_BRIGHTNESS_LABEL": "Mng'aro", - "CHANGE_VALUE_TITLE": "Badilisha thamani:", - "RENAME_VARIABLE": "Badilisha jina la kibadilika", - "RENAME_VARIABLE_TITLE": "Badilisha majina ya vibadilika vyote \"%1\" viwe:", - "RENAME_VARIABLE_MODAL_TITLE": "Badilisha Jina la Kibadilika", - "NEW_VARIABLE": "Unda Kibadilika", - "NEW_VARIABLE_TITLE": "Jina jipya la kibadilika:", - "VARIABLE_MODAL_TITLE": "Kibadilika Kipya", - "VARIABLE_ALREADY_EXISTS": "Kibadilika kinachoitwa \"%1\" tayari ipo.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Kibadilika kinachoitwa \"%1\" tayari ipo kwa kibadilika kingine chenye aina ya \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Unataka kufuta matumizi %1 ya kibadilika \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Haiwezi kufuta kibadilika \"%1\" kwa sababu ni sehemu ya kitendaji \"%2\"", - "DELETE_VARIABLE": "Futa kibadilika \"%1\"", - "NEW_PROCEDURE": "Unda Bloku", - "PROCEDURE_ALREADY_EXISTS": "Utaratibu ulio na jina \"%1\" tayari upo.", - "PROCEDURE_DEFAULT_NAME": "jina la bloku", - "NEW_LIST": "Unda Orodha", - "NEW_LIST_TITLE": "Jina ya orodha mpya:", - "LIST_MODAL_TITLE": "Orodha Mpya", - "LIST_ALREADY_EXISTS": "Orodha iliyo na jina \"%1\" tayari upo.", - "RENAME_LIST_TITLE": "Badilisha jina la orodha zote \"%1\" kuwa:", - "RENAME_LIST_MODAL_TITLE": "Badilisha Jina La Orodha", - "DEFAULT_LIST_ITEM": "kitu", - "DELETE_LIST": "Futa orodha ya \"%1\"", - "RENAME_LIST": "Badilisha jina la orodha", - "NEW_BROADCAST_MESSAGE": "Ujumbe mpya", - "NEW_BROADCAST_MESSAGE_TITLE": "Jina la ujumbe mpya:", - "BROADCAST_MODAL_TITLE": "Ujumbe Mpya", - "DEFAULT_BROADCAST_MESSAGE_NAME": "ujumbe1" -}; - -Blockly.ScratchMsgs.locales["ht"] = -{ - "CONTROL_FOREVER": "pou toujou", - "CONTROL_REPEAT": "repete %1", - "CONTROL_IF": "si %1 ebyen", - "CONTROL_ELSE": "si non", - "CONTROL_STOP": "kanpe", - "CONTROL_STOP_ALL": "tout", - "CONTROL_STOP_THIS": "eskrip sa a", - "CONTROL_STOP_OTHER": "lòt eskrip nan sprite la", - "CONTROL_WAIT": "rete tann %1 segond", - "CONTROL_WAITUNTIL": "tann jiska %1", - "CONTROL_REPEATUNTIL": "repete jiska %1", - "CONTROL_WHILE": "pandan %1", - "CONTROL_FOREACH": "pou chak %1 nan %2", - "CONTROL_STARTASCLONE": "lè m parèt kòm marasa", - "CONTROL_CREATECLONEOF": "kreye marasa pou %1 sa a", - "CONTROL_CREATECLONEOF_MYSELF": "mwen menm", - "CONTROL_DELETETHISCLONE": "efase marasa sa a", - "CONTROL_COUNTER": "kontè", - "CONTROL_INCRCOUNTER": "ajoute sou kontè a", - "CONTROL_CLEARCOUNTER": "efase kontè a", - "CONTROL_ALLATONCE": "on sèl kou", - "DATA_SETVARIABLETO": "fikse %2 a %1", - "DATA_CHANGEVARIABLEBY": "chanje %1 pa %2", - "DATA_SHOWVARIABLE": "montre varyab %1", - "DATA_HIDEVARIABLE": "kache varyab %1", - "DATA_ADDTOLIST": "ajoute %1 sou %2", - "DATA_DELETEOFLIST": "efase %1 nan %2", - "DATA_DELETEALLOFLIST": "efase tout %1", - "DATA_INSERTATLIST": "antre %1 nan %2 de %3", - "DATA_REPLACEITEMOFLIST": "ranplase %1 nan %2 avèk %3", - "DATA_ITEMOFLIST": "bagay %1 nan %2", - "DATA_ITEMNUMOFLIST": "bagay # de %1 nan %2", - "DATA_LENGTHOFLIST": "longè %1 a", - "DATA_LISTCONTAINSITEM": "èske %1 genyen %2 ladan l ? ", - "DATA_SHOWLIST": "montre lis %1", - "DATA_HIDELIST": "kache lis %1", - "DATA_INDEX_ALL": "tout", - "DATA_INDEX_LAST": "dènye", - "DATA_INDEX_RANDOM": "pa aza", - "EVENT_WHENFLAGCLICKED": "lè %1 klike", - "EVENT_WHENTHISSPRITECLICKED": "lè sprite la klike", - "EVENT_WHENSTAGECLICKED": "lè sèn an klike", - "EVENT_WHENTOUCHINGOBJECT": "lè ti tonton sa a touche %1", - "EVENT_WHENBROADCASTRECEIVED": "lè m resevwa %1", - "EVENT_WHENBACKDROPSWITCHESTO": "lè fon an chanje a %1", - "EVENT_WHENGREATERTHAN": "lè %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "kwonomèt", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volim lan", - "EVENT_BROADCAST": "kònen %1", - "EVENT_BROADCASTANDWAIT": "kònen %1 epi tann", - "EVENT_WHENKEYPRESSED": "depi bouton %1 peze", - "EVENT_WHENKEYPRESSED_SPACE": "espas", - "EVENT_WHENKEYPRESSED_LEFT": "flèch goch", - "EVENT_WHENKEYPRESSED_RIGHT": "flèch dwat", - "EVENT_WHENKEYPRESSED_DOWN": "flèch an ba", - "EVENT_WHENKEYPRESSED_UP": "flèch an wo", - "EVENT_WHENKEYPRESSED_ANY": "nenpòt", - "LOOKS_SAYFORSECS": "di %1 pandan %2 segond", - "LOOKS_SAY": "di %1", - "LOOKS_HELLO": "Alo !", - "LOOKS_THINKFORSECS": "panse %1 pou %2 segond", - "LOOKS_THINK": "panse %1", - "LOOKS_HMM": "M ap reflechi...", - "LOOKS_SHOW": "montre", - "LOOKS_HIDE": "kache", - "LOOKS_HIDEALLSPRITES": "Kache tout sprite yo", - "LOOKS_EFFECT_COLOR": "koulè", - "LOOKS_EFFECT_FISHEYE": "objektif gran ang", - "LOOKS_EFFECT_WHIRL": "toubiyon", - "LOOKS_EFFECT_PIXELATE": "piksale", - "LOOKS_EFFECT_MOSAIC": "mozayik", - "LOOKS_EFFECT_BRIGHTNESS": "ekleraj", - "LOOKS_EFFECT_GHOST": "transparan", - "LOOKS_CHANGEEFFECTBY": "chanje efè %1 pa %2", - "LOOKS_SETEFFECTTO": "fikse efè %1 a %2 ", - "LOOKS_CLEARGRAPHICEFFECTS": "efase efè grafik yo", - "LOOKS_CHANGESIZEBY": "chanje gwosè a pa %1", - "LOOKS_SETSIZETO": "mete gwosè a %1 %", - "LOOKS_SIZE": "gwosè", - "LOOKS_CHANGESTRETCHBY": "chanje detire a pa %1", - "LOOKS_SETSTRETCHTO": "detire li pa %1 %", - "LOOKS_SWITCHCOSTUMETO": "chanje a kostim %1", - "LOOKS_NEXTCOSTUME": "pwochenn kostim", - "LOOKS_SWITCHBACKDROPTO": "chanje fon an a %1", - "LOOKS_GOTOFRONTBACK": "ale nan kouch %1 ", - "LOOKS_GOTOFRONTBACK_FRONT": "devan", - "LOOKS_GOTOFRONTBACK_BACK": "dèyè", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ale nan kouch %1 %2", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "mete devan", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "mete dèyè", - "LOOKS_BACKDROPNUMBERNAME": "fon %1", - "LOOKS_COSTUMENUMBERNAME": "kostim %1", - "LOOKS_NUMBERNAME_NUMBER": "nimewo", - "LOOKS_NUMBERNAME_NAME": "non", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "chanje fon a %1 epi tann", - "LOOKS_NEXTBACKDROP_BLOCK": "pwochenn fon ", - "LOOKS_NEXTBACKDROP": "pwochenn fon", - "LOOKS_PREVIOUSBACKDROP": "fon anvan an", - "LOOKS_RANDOMBACKDROP": "fon pa aza", - "MOTION_MOVESTEPS": "fè %1 pa", - "MOTION_TURNLEFT": "vire %1 %2 grad", - "MOTION_TURNRIGHT": "vire %1 %2 grad", - "MOTION_POINTINDIRECTION": "bay tèt li sou direksyon %1", - "MOTION_POINTTOWARDS": "bay tèt li sou %1", - "MOTION_POINTTOWARDS_POINTER": "flèch souri a", - "MOTION_POINTTOWARDS_RANDOM": "direksyon pa aza", - "MOTION_GOTO": "ale nan %1", - "MOTION_GOTO_POINTER": "flèch souri a", - "MOTION_GOTO_RANDOM": "pozisyon pa aza", - "MOTION_GOTOXY": "ale nan x : %1 y : %2", - "MOTION_GLIDESECSTOXY": "glise pou %1 segond vè x : %2 y : %3 ", - "MOTION_GLIDETO": "glise pou %1 segond vè %2", - "MOTION_GLIDETO_POINTER": "flèch souri a", - "MOTION_GLIDETO_RANDOM": "pozisyon pa aza", - "MOTION_CHANGEXBY": "chanje x pa %1", - "MOTION_SETX": "fikse x a %1", - "MOTION_CHANGEYBY": "chanje y pa %1", - "MOTION_SETY": "fikse y a %1", - "MOTION_IFONEDGEBOUNCE": "si li nan bout la, rebondi li", - "MOTION_SETROTATIONSTYLE": "fikse stil vire a %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "goch-dwat", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "pa vire", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "fè wonn", - "MOTION_XPOSITION": "pozisyon x", - "MOTION_YPOSITION": "pozisyon y", - "MOTION_DIRECTION": "direksyon", - "MOTION_SCROLLRIGHT": "ale a dwat %1", - "MOTION_SCROLLUP": "monte %1", - "MOTION_ALIGNSCENE": "aliyen sèn %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "an ba a goch", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "an ba a dwat", - "MOTION_ALIGNSCENE_MIDDLE": "mitan", - "MOTION_ALIGNSCENE_TOPLEFT": "an wo a goch", - "MOTION_ALIGNSCENE_TOPRIGHT": "an wo a dwat", - "MOTION_XSCROLL": "ale sou x", - "MOTION_YSCROLL": "ale sou y", - "MOTION_STAGE_SELECTED": "Sèn la chwazi : pa gen blòk mouvman", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "chwazi pa aza soti %1 rive %2 ", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 ak %2", - "OPERATORS_OR": "%1 oubyen %2", - "OPERATORS_NOT": "pa %1", - "OPERATORS_JOIN": "kole %1 ak %2", - "OPERATORS_JOIN_APPLE": "pòm", - "OPERATORS_JOIN_BANANA": "fig", - "OPERATORS_LETTEROF": "lèt %1 nan %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "longè %1 ", - "OPERATORS_CONTAINS": "èske %1 gen %2 ladan l ?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "awondi %1", - "OPERATORS_MATHOP": "%1 nan %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "desann pou awondi chif la", - "OPERATORS_MATHOP_CEILING": "monte pou awondi chif la", - "OPERATORS_MATHOP_SQRT": "rasin kare", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "defini %1", - "SENSING_TOUCHINGOBJECT": "èske l ap touche %1 ?", - "SENSING_TOUCHINGOBJECT_POINTER": "flèch souri a", - "SENSING_TOUCHINGOBJECT_EDGE": "bout", - "SENSING_TOUCHINGCOLOR": "èske l ap touche koulè %1 ?", - "SENSING_COLORISTOUCHINGCOLOR": "èske koulè %1 ap touche %2 ? ", - "SENSING_DISTANCETO": "distans a %1", - "SENSING_DISTANCETO_POINTER": "flèch souri ", - "SENSING_ASKANDWAIT": "mande %1 epi tann", - "SENSING_ASK_TEXT": "Ki jan w rele ?", - "SENSING_ANSWER": "repons", - "SENSING_KEYPRESSED": "èske bouton %1 peze ?", - "SENSING_MOUSEDOWN": "sourit peze ?", - "SENSING_MOUSEX": "sourit x", - "SENSING_MOUSEY": "sourit y", - "SENSING_SETDRAGMODE": "fikse mòd glise a %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ka glise", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "pa ka glise", - "SENSING_LOUDNESS": "volim ", - "SENSING_LOUD": "fò ?", - "SENSING_TIMER": "kwonomèt", - "SENSING_RESETTIMER": "rekòmanse kwonomèt la", - "SENSING_OF": "%1 nan %2", - "SENSING_OF_XPOSITION": "pozisyon x", - "SENSING_OF_YPOSITION": "pozisyon y", - "SENSING_OF_DIRECTION": "direksyon", - "SENSING_OF_COSTUMENUMBER": "kostim #", - "SENSING_OF_COSTUMENAME": "non kostim", - "SENSING_OF_SIZE": "gwosè", - "SENSING_OF_VOLUME": "volim", - "SENSING_OF_BACKDROPNUMBER": "# fon ", - "SENSING_OF_BACKDROPNAME": "non fon an", - "SENSING_OF_STAGE": "Sèn", - "SENSING_CURRENT": "%1 aktyèl", - "SENSING_CURRENT_YEAR": "ane", - "SENSING_CURRENT_MONTH": "mwa", - "SENSING_CURRENT_DATE": "jou", - "SENSING_CURRENT_DAYOFWEEK": "jou nan semenn lan", - "SENSING_CURRENT_HOUR": "lè", - "SENSING_CURRENT_MINUTE": "minit", - "SENSING_CURRENT_SECOND": "segond", - "SENSING_DAYSSINCE2000": "jou depi 2000", - "SENSING_USERNAME": "non itilizatè", - "SENSING_USERID": "idantite itilizatè", - "SOUND_PLAY": "kòmanse jwe son %1", - "SOUND_PLAYUNTILDONE": "jwe son %1 jiskaske l fini", - "SOUND_STOPALLSOUNDS": "koupe tout son", - "SOUND_SETEFFECTO": "fikse efè %1 a %2 ", - "SOUND_CHANGEEFFECTBY": "chanje efè %1 pa %2", - "SOUND_CLEAREFFECTS": "efase tout efè son yo", - "SOUND_EFFECTS_PITCH": "ton", - "SOUND_EFFECTS_PAN": "voye sou bò goch/dwat", - "SOUND_CHANGEVOLUMEBY": "chanje volim lan pa %1", - "SOUND_SETVOLUMETO": "fikse volim lan a %1%", - "SOUND_VOLUME": "volim", - "SOUND_RECORD": "anrejistre...", - "CATEGORY_MOTION": "Mouvman", - "CATEGORY_LOOKS": "Aparans", - "CATEGORY_SOUND": "Son", - "CATEGORY_EVENTS": "Evènman", - "CATEGORY_CONTROL": "Kontwòl", - "CATEGORY_SENSING": "Deteksyon", - "CATEGORY_OPERATORS": "Operatè", - "CATEGORY_VARIABLES": "Varyab ", - "CATEGORY_MYBLOCKS": "Blòk mwen yo", - "DUPLICATE": "Fè marasa", - "DELETE": "Efase", - "ADD_COMMENT": "Ajoute remak", - "REMOVE_COMMENT": "Retire remak", - "DELETE_BLOCK": "Efase blòk la", - "DELETE_X_BLOCKS": "Efase blòk %1 yo", - "DELETE_ALL_BLOCKS": "Efase tout blòk %1 yo ?", - "CLEAN_UP": "Òganize blòk yo", - "HELP": "Èd", - "UNDO": "Anile", - "REDO": "Fè ankò", - "EDIT_PROCEDURE": "Chanje", - "SHOW_PROCEDURE_DEFINITION": "Ale nan definisyon", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Di yon bagay...", - "COLOUR_HUE_LABEL": "Koulè", - "COLOUR_SATURATION_LABEL": "Satirasyon", - "COLOUR_BRIGHTNESS_LABEL": "Ekleraj", - "CHANGE_VALUE_TITLE": "Chanje valè : ", - "RENAME_VARIABLE": "Chanje non varyab la", - "RENAME_VARIABLE_TITLE": "Chanje non tout varyab ki rele \"%1\" yo a :", - "RENAME_VARIABLE_MODAL_TITLE": "Chanje non varyab la", - "NEW_VARIABLE": "Fè yon varyab", - "NEW_VARIABLE_TITLE": "Non nouvo varyab la :", - "VARIABLE_MODAL_TITLE": "Nouvo varyab", - "VARIABLE_ALREADY_EXISTS": "Gen yon varyab ki rele \"%1\" deja", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Gen yon varyab ki rele \"%1\" deja nan kategori \"%2\"", - "DELETE_VARIABLE_CONFIRMATION": "Efase tou le %1 fwa w ap sèvi ak varyab \"%2\" la ?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Varyab \"%1\" pa ka efase paske li fè pati fonksyon \"%2\"", - "DELETE_VARIABLE": "Efase varyab \"%1\" la", - "NEW_PROCEDURE": "Fè yon blòk ", - "PROCEDURE_ALREADY_EXISTS": "Gen yon pwosedi ki rele \"%1\" deja", - "PROCEDURE_DEFAULT_NAME": "non blòk la", - "NEW_LIST": "Fè yon lis", - "NEW_LIST_TITLE": "Non nouvo lis la :", - "LIST_MODAL_TITLE": "Nouvo lis", - "LIST_ALREADY_EXISTS": "Gen yon lis ki rele \"%1\" deja", - "RENAME_LIST_TITLE": "Bay tout lis ki rele \"%1\" yo nouvo non sa a :", - "RENAME_LIST_MODAL_TITLE": "Chanje non lis la", - "DEFAULT_LIST_ITEM": "bagay", - "DELETE_LIST": "Efase lis \"%1\" la :", - "RENAME_LIST": "Chanje non lis la", - "NEW_BROADCAST_MESSAGE": "Nouvo mesaj", - "NEW_BROADCAST_MESSAGE_TITLE": "Non nouvo mesaj la:", - "BROADCAST_MODAL_TITLE": "Nouvo Mesaj", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mesaj1" -}; - -Blockly.ScratchMsgs.locales["ckb"] = -{ - "CONTROL_FOREVER": "بۆهەتایە", - "CONTROL_REPEAT": "دوبارەکردنەوە %1", - "CONTROL_IF": "ئەگەر %1 ئینجا", - "CONTROL_ELSE": "ئەگەرنا", - "CONTROL_STOP": "وەستان", - "CONTROL_STOP_ALL": "هەموو", - "CONTROL_STOP_THIS": "ئەم سکریپتە", - "CONTROL_STOP_OTHER": "سکریپتەکانی تر لە تەن", - "CONTROL_WAIT": "بوەستە %1 چرکە", - "CONTROL_WAITUNTIL": "چاوەڕێ بکە تا %1", - "CONTROL_REPEATUNTIL": "دوبارەکردنەوە تا %1", - "CONTROL_WHILE": "کاتێک %1", - "CONTROL_FOREACH": "بۆ هەر %1 لە %2", - "CONTROL_STARTASCLONE": "کاتێک دەستپێدەکەم وەک لێکچووێک", - "CONTROL_CREATECLONEOF": "دروستکردنی لێکچوو لە %1", - "CONTROL_CREATECLONEOF_MYSELF": "خۆم", - "CONTROL_DELETETHISCLONE": "سڕینەوەی ئەم لێکچووە", - "CONTROL_COUNTER": "ژمێرەر", - "CONTROL_INCRCOUNTER": "زیادکردنی ژمێرەر", - "CONTROL_CLEARCOUNTER": "بەتاڵکردنەوەی ژمێرەر", - "CONTROL_ALLATONCE": "هەموو بەیەکەوە", - "DATA_SETVARIABLETO": "دانانی %1 بۆ %2", - "DATA_CHANGEVARIABLEBY": "گۆڕین %1 بە %2", - "DATA_SHOWVARIABLE": "پیشاندانی گۆڕاو %1", - "DATA_HIDEVARIABLE": "شاردنەوەی گۆڕاوی %1", - "DATA_ADDTOLIST": "زیادکردنی %1 بۆ %2", - "DATA_DELETEOFLIST": "سڕینەوە %1 لە %2", - "DATA_DELETEALLOFLIST": "سڕینەوەی هەموو لە %1", - "DATA_INSERTATLIST": "خستنەناو %1 بۆ %2 لە %3", - "DATA_REPLACEITEMOFLIST": "گۆڕینەوەی دانە %1 لە %2 لەگەڵ %3", - "DATA_ITEMOFLIST": "دانە %1 لە %2", - "DATA_ITEMNUMOFLIST": "دانەی # %1 لە %2", - "DATA_LENGTHOFLIST": "درێژی لە %1", - "DATA_LISTCONTAINSITEM": "%1 تێیدایە %2؟", - "DATA_SHOWLIST": "پیشاندانی لیست %1", - "DATA_HIDELIST": "شاردنەوەی لیست %1", - "DATA_INDEX_ALL": "هەموو", - "DATA_INDEX_LAST": "دوایەمین", - "DATA_INDEX_RANDOM": "هەڕەمەکی", - "EVENT_WHENFLAGCLICKED": "کاتێک %1 کرتەکرا", - "EVENT_WHENTHISSPRITECLICKED": "کاتێک ئەم تەنە کرتەکرا", - "EVENT_WHENSTAGECLICKED": "کاتێک سەکۆ کرتەکرا", - "EVENT_WHENTOUCHINGOBJECT": "کاتێک ئەم تەنە بەرکەوت %1", - "EVENT_WHENBROADCASTRECEIVED": "کاتێک بەدەستم گەیشت %1", - "EVENT_WHENBACKDROPSWITCHESTO": "کاتێک پاشبنەما دەگۆڕێت بۆ %1", - "EVENT_WHENGREATERTHAN": "کاتێک %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "کاتێنەر", - "EVENT_WHENGREATERTHAN_LOUDNESS": "دەنگەدەنگ", - "EVENT_BROADCAST": "پەخشکردن %1", - "EVENT_BROADCASTANDWAIT": "پەخشکردنی %1 و چاوەڕێکردن", - "EVENT_WHENKEYPRESSED": "کاتێک دوگمەی %1 کرتەکرا", - "EVENT_WHENKEYPRESSED_SPACE": "بۆشایی", - "EVENT_WHENKEYPRESSED_LEFT": "تیری چەپ", - "EVENT_WHENKEYPRESSED_RIGHT": "تیری ڕاست", - "EVENT_WHENKEYPRESSED_DOWN": "تیری خواروو", - "EVENT_WHENKEYPRESSED_UP": "تیری سەروو", - "EVENT_WHENKEYPRESSED_ANY": "هەر کام", - "LOOKS_SAYFORSECS": "بڵێ %1 بۆ %2 چرکە", - "LOOKS_SAY": "بڵێ %1", - "LOOKS_HELLO": "سڵاو!", - "LOOKS_THINKFORSECS": "بیرکردنەوە %1 بۆ %2 چرکە", - "LOOKS_THINK": "بیرکردنەوەی %1", - "LOOKS_HMM": "ئمم...", - "LOOKS_SHOW": "پیشاندان", - "LOOKS_HIDE": "شاردنەوە", - "LOOKS_HIDEALLSPRITES": "شاردنەوەی هەموو تەنەکان", - "LOOKS_EFFECT_COLOR": "ڕەنگ", - "LOOKS_EFFECT_FISHEYE": "چاوماسی", - "LOOKS_EFFECT_WHIRL": "خولانەوە", - "LOOKS_EFFECT_PIXELATE": "وێنەخاڵکردن", - "LOOKS_EFFECT_MOSAIC": "موزایک", - "LOOKS_EFFECT_BRIGHTNESS": "ڕووناکی", - "LOOKS_EFFECT_GHOST": "خێو", - "LOOKS_CHANGEEFFECTBY": "گۆڕینی %1 کاریگەری بە %2", - "LOOKS_SETEFFECTTO": "دانانی %1 کاریگەری بۆ %2", - "LOOKS_CLEARGRAPHICEFFECTS": "سڕینەوەی کاریگەرییەکانی هێلکاری", - "LOOKS_CHANGESIZEBY": "گۆڕینی قەبارە بە %1", - "LOOKS_SETSIZETO": "دانانی قەبارە بە %1 ٪", - "LOOKS_SIZE": "قەبارە", - "LOOKS_CHANGESTRETCHBY": "گۆڕینی درێژبوونەوە بە %1", - "LOOKS_SETSTRETCHTO": "دانانی درێژبوونەوە بە %1 ٪", - "LOOKS_SWITCHCOSTUMETO": "گۆڕینی بەرگ بۆ %1", - "LOOKS_NEXTCOSTUME": "بەرگی دواتر", - "LOOKS_SWITCHBACKDROPTO": "گۆڕینی پاشبنەما بۆ %1", - "LOOKS_GOTOFRONTBACK": "بڕۆ بۆ %1 چین", - "LOOKS_GOTOFRONTBACK_FRONT": "پێشەوە", - "LOOKS_GOTOFRONTBACK_BACK": "دواوە", - "LOOKS_GOFORWARDBACKWARDLAYERS": "بڕۆ بۆ %1 %2 چین", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "بۆ پێشەوە", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "بۆ دواوە", - "LOOKS_BACKDROPNUMBERNAME": "پاشبنه‌ما %1", - "LOOKS_COSTUMENUMBERNAME": "بەرگ %1", - "LOOKS_NUMBERNAME_NUMBER": "ژمارە", - "LOOKS_NUMBERNAME_NAME": "ناو", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "گۆڕینی پاشبنەما بۆ %1 و چاوەڕێ بکە", - "LOOKS_NEXTBACKDROP_BLOCK": "پاشبنەمای دواتر", - "LOOKS_NEXTBACKDROP": "پاشبنەمای دواتر", - "LOOKS_PREVIOUSBACKDROP": "پاشبنەمای پێشتر", - "LOOKS_RANDOMBACKDROP": "پاشبنەمای هەڕەمەکی", - "MOTION_MOVESTEPS": "جوڵان %1 هەنگاو", - "MOTION_TURNLEFT": "بیسوڕێنەوە %1 %2 پلە", - "MOTION_TURNRIGHT": "بیسوڕێنەوە %1 %2 پلە", - "MOTION_POINTINDIRECTION": "خاڵ بە ئاڕاستەی %1", - "MOTION_POINTTOWARDS": "خاڵ بەرەو %1", - "MOTION_POINTTOWARDS_POINTER": "نیشاندەری ماوس", - "MOTION_POINTTOWARDS_RANDOM": "ئاڕاستەی هەڕەمەکی", - "MOTION_GOTO": "بڕۆ بۆ %1", - "MOTION_GOTO_POINTER": "نیشاندەری ماوس", - "MOTION_GOTO_RANDOM": "شوێنی هەڕەمەکی", - "MOTION_GOTOXY": "بڕۆ بۆ x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "خلیسکان %1 چرکە بۆ x %2 y %3", - "MOTION_GLIDETO": "خلیسکان %1 چرکە بۆ %2", - "MOTION_GLIDETO_POINTER": "نیشاندەری ماوس", - "MOTION_GLIDETO_RANDOM": "شوێنی هەڕەمەکی", - "MOTION_CHANGEXBY": "گۆڕینی x بە %1", - "MOTION_SETX": "دانانی x بە %1", - "MOTION_CHANGEYBY": "گۆڕینی y بە %1", - "MOTION_SETY": "دانانی y بە %1", - "MOTION_IFONEDGEBOUNCE": "ئەگەر لە لێواربوو، بگەڕێوە", - "MOTION_SETROTATIONSTYLE": "دانانی شێوازی سوڕانەوە %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "چەپ-ڕاست", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "مەیسوڕێنە", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "بەدەوری", - "MOTION_XPOSITION": "شوێنی x", - "MOTION_YPOSITION": "شوێنی y", - "MOTION_DIRECTION": "ئاڕاستە", - "MOTION_SCROLLRIGHT": "پێچۆکە بۆ ڕاست %1", - "MOTION_SCROLLUP": "پێچۆکه‌ هه‌ڵکێشان %1", - "MOTION_ALIGNSCENE": "لاگرتنی دیمەن %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ژێرەوە-چەپ", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ژێرەوە-ڕاست", - "MOTION_ALIGNSCENE_MIDDLE": "ناوەند", - "MOTION_ALIGNSCENE_TOPLEFT": "سەرەوە-چەپ", - "MOTION_ALIGNSCENE_TOPRIGHT": "سەرەوە-ڕاست", - "MOTION_XSCROLL": "پێچۆکەی x", - "MOTION_YSCROLL": "پێچۆکەی y", - "MOTION_STAGE_SELECTED": "سەکۆی دیاریکراو: هیچ بلۆکێکی جوڵاندن", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "هەڵبژاردنی هەڕەمەکی %1 بۆ %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 and %2", - "OPERATORS_OR": "%1 or %2", - "OPERATORS_NOT": "نا %1", - "OPERATORS_JOIN": "پەیوەندی %1 %2", - "OPERATORS_JOIN_APPLE": "سێو", - "OPERATORS_JOIN_BANANA": "مۆز", - "OPERATORS_LETTEROF": "پیت %1 لە %2", - "OPERATORS_LETTEROF_APPLE": "ێ", - "OPERATORS_LENGTH": "درێژی لە %1", - "OPERATORS_CONTAINS": "%1 تێیدایە %2؟", - "OPERATORS_MOD": "%1 ماوە %2", - "OPERATORS_ROUND": "نزیککردنەوە %1", - "OPERATORS_MATHOP": "%1 لە %2", - "OPERATORS_MATHOP_ABS": "ڕەگی دووجا", - "OPERATORS_MATHOP_FLOOR": "زەوی", - "OPERATORS_MATHOP_CEILING": "بنمیچ", - "OPERATORS_MATHOP_SQRT": "ڕەگی دووجا", - "OPERATORS_MATHOP_SIN": "تەژێ", - "OPERATORS_MATHOP_COS": "تەژێ تەواو", - "OPERATORS_MATHOP_TAN": "تانجێنت", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "لن", - "OPERATORS_MATHOP_LOG": "لۆگاریتم", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "پێناسەی %1", - "SENSING_TOUCHINGOBJECT": "بەرکەوتنی %1؟", - "SENSING_TOUCHINGOBJECT_POINTER": "نیشاندەری ماوس", - "SENSING_TOUCHINGOBJECT_EDGE": "لێوار", - "SENSING_TOUCHINGCOLOR": "بەرکەوتنی ڕەنگ %1؟", - "SENSING_COLORISTOUCHINGCOLOR": "ڕەنگ %1 بەردەکەوێت %2؟", - "SENSING_DISTANCETO": "دووری بۆ %1", - "SENSING_DISTANCETO_POINTER": "نیشاندەری ماوس", - "SENSING_ASKANDWAIT": "پرسیار بکە %1 و چاوەڕێ بکە", - "SENSING_ASK_TEXT": "ناوت چییە؟", - "SENSING_ANSWER": "وەڵام", - "SENSING_KEYPRESSED": "دوگمەی %1 داگیرا؟", - "SENSING_MOUSEDOWN": "ماوس بۆ خوارەوە؟", - "SENSING_MOUSEX": "ماوس x", - "SENSING_MOUSEY": "ماوس y", - "SENSING_SETDRAGMODE": "دانانی شێوازی ڕاکێشان %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ڕادەکێشترێت", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ڕاناکێشرێت", - "SENSING_LOUDNESS": "دەنگەدەنگ", - "SENSING_LOUD": "بەدەنگی بەرز؟", - "SENSING_TIMER": "کاتێنەر", - "SENSING_RESETTIMER": "ڕێکخستنەوەی کاتێنەر", - "SENSING_OF": "%1 لە %2", - "SENSING_OF_XPOSITION": "شوێنی x", - "SENSING_OF_YPOSITION": "شوێنی y", - "SENSING_OF_DIRECTION": "ئاڕاستە", - "SENSING_OF_COSTUMENUMBER": "بەرگ #", - "SENSING_OF_COSTUMENAME": "ناوی بەرگ", - "SENSING_OF_SIZE": "قەبارە", - "SENSING_OF_VOLUME": "قەبارە", - "SENSING_OF_BACKDROPNUMBER": "پاشبنه‌ما #", - "SENSING_OF_BACKDROPNAME": "ناوی پاشبنەما", - "SENSING_OF_STAGE": "سەکۆ", - "SENSING_CURRENT": "ئێستا %1", - "SENSING_CURRENT_YEAR": "ساڵ", - "SENSING_CURRENT_MONTH": "مانگ", - "SENSING_CURRENT_DATE": "بەروار", - "SENSING_CURRENT_DAYOFWEEK": "ڕۆژی هەفتە", - "SENSING_CURRENT_HOUR": "کاتژمێر", - "SENSING_CURRENT_MINUTE": "خولەک", - "SENSING_CURRENT_SECOND": "چرکە", - "SENSING_DAYSSINCE2000": "ڕۆژ لەوەتەی 2000", - "SENSING_USERNAME": "ناوی بەکارهێنەر", - "SENSING_USERID": "ژمارەی بەکارهێنەر", - "SOUND_PLAY": "دەستپێکردنی دەنگ %1", - "SOUND_PLAYUNTILDONE": "لێدانی دەنگی %1 تا تەواوبوون", - "SOUND_STOPALLSOUNDS": "هەموو دەنگەکان ڕاگرە", - "SOUND_SETEFFECTO": "دانانی %1 کاریگەری بۆ %2", - "SOUND_CHANGEEFFECTBY": "گۆڕینی %1 کاریگەری بە %2", - "SOUND_CLEAREFFECTS": "سڕینەوەی کاریگەرییەکانی دەنگ", - "SOUND_EFFECTS_PITCH": "بەرزی دەنگ", - "SOUND_EFFECTS_PAN": "سوڕانەوە چەپ/ڕاست", - "SOUND_CHANGEVOLUMEBY": "گۆڕینی دەنگ بە %1", - "SOUND_SETVOLUMETO": "دانانی دانگ بە %1%", - "SOUND_VOLUME": "قەبارە", - "SOUND_RECORD": "تۆمارکردن...", - "CATEGORY_MOTION": "جوڵان", - "CATEGORY_LOOKS": "ڕوانین", - "CATEGORY_SOUND": "دەنگ", - "CATEGORY_EVENTS": "چالاکییەکان", - "CATEGORY_CONTROL": "کۆنتڕۆڵ", - "CATEGORY_SENSING": "هەستکردن", - "CATEGORY_OPERATORS": "كرده‌هێماکان", - "CATEGORY_VARIABLES": "گۆڕاوەکان", - "CATEGORY_MYBLOCKS": "بلۆکەکانم", - "DUPLICATE": "هاوشێوەکردنەوە", - "DELETE": "سڕینەوە", - "ADD_COMMENT": "زیادکردنی لێدوان", - "REMOVE_COMMENT": "لابردنی لێدوان", - "DELETE_BLOCK": "سڕینەوەی بلۆک", - "DELETE_X_BLOCKS": "سڕینەوەی %1 بلۆک", - "DELETE_ALL_BLOCKS": "سڕینەوەی هەموو %1 بلۆکەکان؟", - "CLEAN_UP": "بەتاڵکردنەوەی بلۆکەکان", - "HELP": "یارمەتی", - "UNDO": "هه‌ڵوه‌شاندنه‌وه‌", - "REDO": "کردنەوە", - "EDIT_PROCEDURE": "دەستکاری", - "SHOW_PROCEDURE_DEFINITION": "بڕۆ بۆ پێناسە", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "شتێک بڵێ", - "COLOUR_HUE_LABEL": "ڕەنگ", - "COLOUR_SATURATION_LABEL": "تێری", - "COLOUR_BRIGHTNESS_LABEL": "ڕووناکی", - "CHANGE_VALUE_TITLE": "گۆڕینی نرخ:", - "RENAME_VARIABLE": "ناونانەوەی گۆڕاو", - "RENAME_VARIABLE_TITLE": "ناونانەوەی هەموو \"%1\" گۆڕاوەکان بۆ:", - "RENAME_VARIABLE_MODAL_TITLE": "ناونانەوەی گۆڕاو", - "NEW_VARIABLE": "دروستکردنی گۆڕاوێک", - "NEW_VARIABLE_TITLE": "ناوی نوێی گۆڕاو", - "VARIABLE_MODAL_TITLE": "گۆڕاوی نوێ", - "VARIABLE_ALREADY_EXISTS": "گۆڕاوی ناونراو \"%1\" هەیە.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "گۆڕاوی ناونراو \"%1\" هەیە بۆ گۆڕاوێکی تر لە جۆری \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "سڕینەوەی %1 بەکارهێنانی \"%2\" گۆڕاو؟", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "گۆڕاوەی \"%1\" ناسڕێتەوە چونکە بەشێکە لە پێناسەی فرمانی \"%2\"", - "DELETE_VARIABLE": "سڕینەوەی \"%1\" گۆڕاو", - "NEW_PROCEDURE": "دروستکردنی بلۆکێک", - "PROCEDURE_ALREADY_EXISTS": "کارایی ناونراو \"%1\" هەیە.", - "PROCEDURE_DEFAULT_NAME": "ناوی بلۆک", - "NEW_LIST": "دروستکردنی لیستێک", - "NEW_LIST_TITLE": "ناوی نوێی لیست", - "LIST_MODAL_TITLE": "لیستی نوێ", - "LIST_ALREADY_EXISTS": "لیستی ناونراو \"%1\" هەیە.", - "RENAME_LIST_TITLE": "ناونانەوەی هەموو \"%1\" لیستەکان بە:", - "RENAME_LIST_MODAL_TITLE": "ناونانەوەی لیست", - "DEFAULT_LIST_ITEM": "شت", - "DELETE_LIST": "سڕینەوەی \"%1\" لیست", - "RENAME_LIST": "ناونانەوەی لیست", - "NEW_BROADCAST_MESSAGE": "پەیامی نوێ", - "NEW_BROADCAST_MESSAGE_TITLE": "ناوی نامەی نوێی", - "BROADCAST_MODAL_TITLE": "پەیامی نوێ", - "DEFAULT_BROADCAST_MESSAGE_NAME": "نامەی1" -}; - -Blockly.ScratchMsgs.locales["lv"] = -{ - "CONTROL_FOREVER": "nepārtraukti", - "CONTROL_REPEAT": "atkārtot %1", - "CONTROL_IF": "ja %1 tad", - "CONTROL_ELSE": "citādi", - "CONTROL_STOP": "apturēt", - "CONTROL_STOP_ALL": "viss", - "CONTROL_STOP_THIS": "šis skripts", - "CONTROL_STOP_OTHER": "citi skripti gariņā", - "CONTROL_WAIT": "gaidīt %1 sekundes", - "CONTROL_WAITUNTIL": "gaidīt līdz %1", - "CONTROL_REPEATUNTIL": "atkārtot līdz %1", - "CONTROL_WHILE": "kamēr %1", - "CONTROL_FOREACH": "katram %1 %2", - "CONTROL_STARTASCLONE": "kad es parādos kā dublikāts", - "CONTROL_CREATECLONEOF": "izveidot %1 dublikātu", - "CONTROL_CREATECLONEOF_MYSELF": "savu", - "CONTROL_DELETETHISCLONE": "dzēst šo dublikātu", - "CONTROL_COUNTER": "skaitītājs", - "CONTROL_INCRCOUNTER": "pieauguma skaitītājs", - "CONTROL_CLEARCOUNTER": "nodzēst skaitītāju", - "CONTROL_ALLATONCE": "viss vienlaikus", - "DATA_SETVARIABLETO": "iestatīt %1 uz %2", - "DATA_CHANGEVARIABLEBY": "mainīt %1 par %2", - "DATA_SHOWVARIABLE": "rādīt mainīgo %1", - "DATA_HIDEVARIABLE": "slēpt mainīgo %1", - "DATA_ADDTOLIST": "pievienot %1 pie %2", - "DATA_DELETEOFLIST": "dzēst %1 no %2", - "DATA_DELETEALLOFLIST": "dzēst visu no %1", - "DATA_INSERTATLIST": "ievietot %1 kā %2 sarakstā %3", - "DATA_REPLACEITEMOFLIST": "aizvietot %1 vienumu sarakstā %2 ar %3", - "DATA_ITEMOFLIST": "vienums %1 sarakstā %2", - "DATA_ITEMNUMOFLIST": "vienuma %1 # sarakstā %2", - "DATA_LENGTHOFLIST": "%1 garums", - "DATA_LISTCONTAINSITEM": "%1 satur %2?", - "DATA_SHOWLIST": "rādīt sarakstu %1", - "DATA_HIDELIST": "slēpt sarakstu %1", - "DATA_INDEX_ALL": "viss", - "DATA_INDEX_LAST": "pēdējais", - "DATA_INDEX_RANDOM": "nejaušs", - "EVENT_WHENFLAGCLICKED": "kad %1 nospiests", - "EVENT_WHENTHISSPRITECLICKED": "kad noklikšķināts šis gariņš", - "EVENT_WHENSTAGECLICKED": "kad noklikšķināta skatuve", - "EVENT_WHENTOUCHINGOBJECT": "kad šis gariņš pieskaras %1", - "EVENT_WHENBROADCASTRECEIVED": "kad es saņemu %1", - "EVENT_WHENBACKDROPSWITCHESTO": "kad fons nomainās uz %1", - "EVENT_WHENGREATERTHAN": "kad %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "taimeris", - "EVENT_WHENGREATERTHAN_LOUDNESS": "skaļums", - "EVENT_BROADCAST": "pārraidīt %1", - "EVENT_BROADCASTANDWAIT": "pārraidīt %1 un gaidīt", - "EVENT_WHENKEYPRESSED": "kad nospiests taustiņš %1", - "EVENT_WHENKEYPRESSED_SPACE": "atstarpe", - "EVENT_WHENKEYPRESSED_LEFT": "kreisā bulta", - "EVENT_WHENKEYPRESSED_RIGHT": "labā bulta", - "EVENT_WHENKEYPRESSED_DOWN": "apakšējā bulta", - "EVENT_WHENKEYPRESSED_UP": "augšējā bulta", - "EVENT_WHENKEYPRESSED_ANY": "jebkāds", - "LOOKS_SAYFORSECS": "teikt %1 %2 sekundes", - "LOOKS_SAY": "teikt %1", - "LOOKS_HELLO": "Sveiki!", - "LOOKS_THINKFORSECS": "domāt %1 %2 sekundes", - "LOOKS_THINK": "domāt %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "rādīt", - "LOOKS_HIDE": "slēpt", - "LOOKS_HIDEALLSPRITES": "slēpt visus gariņus", - "LOOKS_EFFECT_COLOR": "krāsa", - "LOOKS_EFFECT_FISHEYE": "zivsacs", - "LOOKS_EFFECT_WHIRL": "virpuļi", - "LOOKS_EFFECT_PIXELATE": "pikseļi", - "LOOKS_EFFECT_MOSAIC": "mozaīka", - "LOOKS_EFFECT_BRIGHTNESS": "gaišums", - "LOOKS_EFFECT_GHOST": "spoks", - "LOOKS_CHANGEEFFECTBY": "mainīt efektu %1 par %2", - "LOOKS_SETEFFECTTO": "iestatīt efektu %1 par %2", - "LOOKS_CLEARGRAPHICEFFECTS": "notīrīt grafiskos efektus", - "LOOKS_CHANGESIZEBY": "mainīt izmēru par %1", - "LOOKS_SETSIZETO": "iestatīt izmēru uz %1 %", - "LOOKS_SIZE": "izmērs", - "LOOKS_CHANGESTRETCHBY": "manīt saspīlējumu par %1", - "LOOKS_SETSTRETCHTO": "iestatīt saspīlējumu uz %1", - "LOOKS_SWITCHCOSTUMETO": "mainīt tērpu uz %1", - "LOOKS_NEXTCOSTUME": "nākamais tērps", - "LOOKS_SWITCHBACKDROPTO": "mainīt fonu uz %1", - "LOOKS_GOTOFRONTBACK": "iet uz %1 slāni", - "LOOKS_GOTOFRONTBACK_FRONT": "priekšējo", - "LOOKS_GOTOFRONTBACK_BACK": "aizmugurējo", - "LOOKS_GOFORWARDBACKWARDLAYERS": "iet %1 %2 slāņus", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "uz priekšu", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "atpakaļ", - "LOOKS_BACKDROPNUMBERNAME": "fona %1", - "LOOKS_COSTUMENUMBERNAME": "tērpa %1", - "LOOKS_NUMBERNAME_NUMBER": "numurs", - "LOOKS_NUMBERNAME_NAME": "vārds", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "mainīt fonu uz %1 un gaidīt", - "LOOKS_NEXTBACKDROP_BLOCK": "nākamais fons", - "LOOKS_NEXTBACKDROP": "nākamais fons", - "LOOKS_PREVIOUSBACKDROP": "iepriekšējais fons", - "LOOKS_RANDOMBACKDROP": "nejaušs fons", - "MOTION_MOVESTEPS": "pārvietoties %1 soļus", - "MOTION_TURNLEFT": "pagriezties %1 par %2 grādiem", - "MOTION_TURNRIGHT": "pagriezties %1 par %2 grādiem", - "MOTION_POINTINDIRECTION": "pagriezt virzienā %1", - "MOTION_POINTTOWARDS": "pagriezt uz %1", - "MOTION_POINTTOWARDS_POINTER": "peles kursors", - "MOTION_POINTTOWARDS_RANDOM": "nejaušs virziens", - "MOTION_GOTO": "iet uz %1", - "MOTION_GOTO_POINTER": "peles kursors", - "MOTION_GOTO_RANDOM": "nejauša pozīcija", - "MOTION_GOTOXY": "iet uz x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "slīdēt %1 sekundes uz x: %2 y: %3", - "MOTION_GLIDETO": "slīdēt %1 sekundes uz %2", - "MOTION_GLIDETO_POINTER": "peles kursors", - "MOTION_GLIDETO_RANDOM": "nejauša pozīcija", - "MOTION_CHANGEXBY": "mainīt x par %1", - "MOTION_SETX": "iestatīt x uz %1", - "MOTION_CHANGEYBY": "mainīt y par %1", - "MOTION_SETY": "iestatīt y uz %1", - "MOTION_IFONEDGEBOUNCE": "ja uz malas, atlēkt", - "MOTION_SETROTATIONSTYLE": "iestatīt griešanās stilu uz %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "pa kreisi - pa labi", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "negriezties", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "jebkurā virzienā", - "MOTION_XPOSITION": "x pozīcija", - "MOTION_YPOSITION": "y pozīcija", - "MOTION_DIRECTION": "virziens", - "MOTION_SCROLLRIGHT": "ritināt pa labi %1", - "MOTION_SCROLLUP": "ritināt uz augšu %1", - "MOTION_ALIGNSCENE": "izlīdzināt ainu %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "apakšā-pa kreisi", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "apakšā-pa labi", - "MOTION_ALIGNSCENE_MIDDLE": " vidū", - "MOTION_ALIGNSCENE_TOPLEFT": "augšā-pa kreisi", - "MOTION_ALIGNSCENE_TOPRIGHT": "augšā-pa labi", - "MOTION_XSCROLL": "x ritināšana", - "MOTION_YSCROLL": "y ritināšana", - "MOTION_STAGE_SELECTED": "Izvēlēta skatuve: nav kustības bloku", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "izvēlēties nejauši no %1 līdz %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 un %2", - "OPERATORS_OR": "%1 vai %2", - "OPERATORS_NOT": "nav %1", - "OPERATORS_JOIN": "apvienot %1 %2", - "OPERATORS_JOIN_APPLE": "ābols", - "OPERATORS_JOIN_BANANA": "banāns", - "OPERATORS_LETTEROF": "burts %1 no %2", - "OPERATORS_LETTEROF_APPLE": "ā", - "OPERATORS_LENGTH": "%1 garums", - "OPERATORS_CONTAINS": "%1 satur %2?", - "OPERATORS_MOD": "%1 atlikums dalot ar %2", - "OPERATORS_ROUND": "noapaļot %1", - "OPERATORS_MATHOP": "%1 no %2", - "OPERATORS_MATHOP_ABS": "modulis (absolūtā vērtība)", - "OPERATORS_MATHOP_FLOOR": "apaļot uz leju", - "OPERATORS_MATHOP_CEILING": "apaļot uz augšu", - "OPERATORS_MATHOP_SQRT": "kvadrātsakne", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "In", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definēt %1", - "SENSING_TOUCHINGOBJECT": "pieskaras %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "peles kursors", - "SENSING_TOUCHINGOBJECT_EDGE": "mala", - "SENSING_TOUCHINGCOLOR": "pieskaras krāsai %1?", - "SENSING_COLORISTOUCHINGCOLOR": "krāsa %1 pieskaras %2?", - "SENSING_DISTANCETO": "attālums līdz %1", - "SENSING_DISTANCETO_POINTER": "peles kursors", - "SENSING_ASKANDWAIT": "jautāt %1 un gaidīt ", - "SENSING_ASK_TEXT": "Kā tevi sauc?", - "SENSING_ANSWER": "atbilde", - "SENSING_KEYPRESSED": "nospiests taustiņš %1?", - "SENSING_MOUSEDOWN": "peles taustiņš nospiests?", - "SENSING_MOUSEX": "peles x", - "SENSING_MOUSEY": "peles y", - "SENSING_SETDRAGMODE": "iestatīt vilkšanas režīmu uz %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "velkams", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nav velkams", - "SENSING_LOUDNESS": "skaļums", - "SENSING_LOUD": "skaļš?", - "SENSING_TIMER": "taimeris", - "SENSING_RESETTIMER": "atiestatīt taimeri", - "SENSING_OF": "%1 no %2", - "SENSING_OF_XPOSITION": "x pozīcija", - "SENSING_OF_YPOSITION": "y pozīcija", - "SENSING_OF_DIRECTION": "virziens", - "SENSING_OF_COSTUMENUMBER": "tērpa #", - "SENSING_OF_COSTUMENAME": "tērpa nosaukums", - "SENSING_OF_SIZE": "izmērs", - "SENSING_OF_VOLUME": "skaļums", - "SENSING_OF_BACKDROPNUMBER": "fona #", - "SENSING_OF_BACKDROPNAME": "fona nosaukums", - "SENSING_OF_STAGE": "Skatuve", - "SENSING_CURRENT": "pašreizējais %1", - "SENSING_CURRENT_YEAR": "gads", - "SENSING_CURRENT_MONTH": "mēnesis", - "SENSING_CURRENT_DATE": "datums", - "SENSING_CURRENT_DAYOFWEEK": "nedēļas diena", - "SENSING_CURRENT_HOUR": "stunda", - "SENSING_CURRENT_MINUTE": "minūte", - "SENSING_CURRENT_SECOND": "sekunde", - "SENSING_DAYSSINCE2000": "dienas kopš 2000", - "SENSING_USERNAME": "lietotājvārds", - "SENSING_USERID": "lietotāja id", - "SOUND_PLAY": "atskaņot skaņu %1", - "SOUND_PLAYUNTILDONE": "atskaņot skaņu %1 līdz galam", - "SOUND_STOPALLSOUNDS": "apturēt visas skaņas", - "SOUND_SETEFFECTO": "iestatīt efektu %1 uz %2", - "SOUND_CHANGEEFFECTBY": "mainīt efektu %1 par %2", - "SOUND_CLEAREFFECTS": "notīrīt skaņas efektus", - "SOUND_EFFECTS_PITCH": "augstums", - "SOUND_EFFECTS_PAN": "bīdīt pa labi/pa kreisi", - "SOUND_CHANGEVOLUMEBY": "mainīt skaļumu par %1", - "SOUND_SETVOLUMETO": "iestatīt skaļumu uz %1%", - "SOUND_VOLUME": "skaļums", - "SOUND_RECORD": "ierakstīt...", - "CATEGORY_MOTION": "Kustība", - "CATEGORY_LOOKS": "Izskats", - "CATEGORY_SOUND": "Skaņa", - "CATEGORY_EVENTS": "Notikumi", - "CATEGORY_CONTROL": "Vadība", - "CATEGORY_SENSING": "Uztveršana", - "CATEGORY_OPERATORS": "Operatori", - "CATEGORY_VARIABLES": "Mainīgie", - "CATEGORY_MYBLOCKS": "Mani bloki", - "DUPLICATE": "Dublēt", - "DELETE": "Dzēst", - "ADD_COMMENT": "Pievienot komentāru", - "REMOVE_COMMENT": "Noņemt komentāru", - "DELETE_BLOCK": "Dzēst bloku", - "DELETE_X_BLOCKS": "Dzēst %1 blokus", - "DELETE_ALL_BLOCKS": "Dzēst visus %1 blokus?", - "CLEAN_UP": "Satīrīt blokus", - "HELP": "Palīdzība", - "UNDO": "Atsaukt", - "REDO": "Atcelt atsaukšanu", - "EDIT_PROCEDURE": "Rediģēt", - "SHOW_PROCEDURE_DEFINITION": "Iet uz definīciju", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Saki kaut ko...", - "COLOUR_HUE_LABEL": "Krāsa", - "COLOUR_SATURATION_LABEL": "Piesātinājums", - "COLOUR_BRIGHTNESS_LABEL": "Gaišums", - "CHANGE_VALUE_TITLE": "Mainīt vērtību:", - "RENAME_VARIABLE": "Pārdēvēt mainīgo", - "RENAME_VARIABLE_TITLE": "Pārdēvēt visus \"%1\" mainīgos uz:", - "RENAME_VARIABLE_MODAL_TITLE": "Pārdēvēt Mainīgo", - "NEW_VARIABLE": "Izveidot Mainīgo", - "NEW_VARIABLE_TITLE": "Jauns mainīgā nosaukums:", - "VARIABLE_MODAL_TITLE": "Jauns Mainīgais", - "VARIABLE_ALREADY_EXISTS": "Mainīgais \"%1\" jau pastāv.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Mainīgais \"%1\" jau pastāv citam mainīgajam ar tipu ''%2''.", - "DELETE_VARIABLE_CONFIRMATION": "Dzēst %1 mainīgā %2 lietojumus?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nevar dzēst mainīgo \"%1\", jo tas ir daļa no funkcijas \"%2\" definīcijas", - "DELETE_VARIABLE": "Dzēst ''%1'' mainīgo", - "NEW_PROCEDURE": "Izveidot bloku", - "PROCEDURE_ALREADY_EXISTS": "Procedūra ar nosaukumu \"%1\" jau pastāv.", - "PROCEDURE_DEFAULT_NAME": "bloka nosaukums", - "NEW_LIST": "Izveidot sarakstu", - "NEW_LIST_TITLE": "Jauns saraksta nosaukums:", - "LIST_MODAL_TITLE": "Jauns saraksts", - "LIST_ALREADY_EXISTS": "Saraksts ar nosaukumu \"%1\" jau pastāv.", - "RENAME_LIST_TITLE": "Pārdēvēt visus \"%1\" sarakstus uz:", - "RENAME_LIST_MODAL_TITLE": "Pārdēvēt sarakstu", - "DEFAULT_LIST_ITEM": "lieta", - "DELETE_LIST": "Dzēst \"%1\" sarakstu", - "RENAME_LIST": "Pārdēvēt sarakstu", - "NEW_BROADCAST_MESSAGE": "Jauna ziņa", - "NEW_BROADCAST_MESSAGE_TITLE": "Jauns ziņas nosaukums:", - "BROADCAST_MODAL_TITLE": "Jauna ziņa", - "DEFAULT_BROADCAST_MESSAGE_NAME": "ziņa1" -}; - -Blockly.ScratchMsgs.locales["lt"] = -{ - "CONTROL_FOREVER": "kartok be galo", - "CONTROL_REPEAT": "kartok %1", - "CONTROL_IF": "jeigu %1", - "CONTROL_ELSE": "kitais atvejais", - "CONTROL_STOP": "sustok", - "CONTROL_STOP_ALL": "visiškai", - "CONTROL_STOP_THIS": "šį scenarijų", - "CONTROL_STOP_OTHER": "kitus veikėjo scenarijus", - "CONTROL_WAIT": "palauk %1 sek.", - "CONTROL_WAITUNTIL": "palauk, kol pasidarys %1", - "CONTROL_REPEATUNTIL": "kartok, kol pasidarys %1", - "CONTROL_WHILE": "kol %1", - "CONTROL_FOREACH": "su kiekvienu %1 iš %2", - "CONTROL_STARTASCLONE": "kai pradės veikti klonas", - "CONTROL_CREATECLONEOF": "sukurk %1 kloną", - "CONTROL_CREATECLONEOF_MYSELF": "savęs", - "CONTROL_DELETETHISCLONE": "ištrink šį kloną", - "CONTROL_COUNTER": "skaitiklis", - "CONTROL_INCRCOUNTER": "padidink skaitiklį vienetu", - "CONTROL_CLEARCOUNTER": "skaitiklis = 0", - "CONTROL_ALLATONCE": "viskas vienu metu", - "DATA_SETVARIABLETO": "%1 = %2", - "DATA_CHANGEVARIABLEBY": "%1 padidink %2", - "DATA_SHOWVARIABLE": "rodyk %1", - "DATA_HIDEVARIABLE": "slėpk %1", - "DATA_ADDTOLIST": "pridėk %1 į %2", - "DATA_DELETEOFLIST": "ištrinti %1 iš %2", - "DATA_DELETEALLOFLIST": "ištrinti visus iš %1", - "DATA_INSERTATLIST": "į sąrašo %3 %2 vietą įterpti %1", - "DATA_REPLACEITEMOFLIST": "sąrašo %2 %1 vietai priskirti %3", - "DATA_ITEMOFLIST": "%2 nr. %1", - "DATA_ITEMNUMOFLIST": "%1 vieta sąraše %2", - "DATA_LENGTHOFLIST": "%1 ilgis", - "DATA_LISTCONTAINSITEM": "%1 turi %2?", - "DATA_SHOWLIST": "rodyti sąrašą %1", - "DATA_HIDELIST": "slėpti sąrašą %1", - "DATA_INDEX_ALL": "viskas", - "DATA_INDEX_LAST": "paskutinis", - "DATA_INDEX_RANDOM": "atsitiktinis", - "EVENT_WHENFLAGCLICKED": "kai spusteli %1", - "EVENT_WHENTHISSPRITECLICKED": "kai spusteli ant šio veikėjo", - "EVENT_WHENSTAGECLICKED": "kai paspaudi scenoje", - "EVENT_WHENTOUCHINGOBJECT": "kai paliesi %1", - "EVENT_WHENBROADCASTRECEIVED": "kai gausi žinutę %1", - "EVENT_WHENBACKDROPSWITCHESTO": "kai fonas perjungiamas į %1", - "EVENT_WHENGREATERTHAN": "kai %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "laikmatis", - "EVENT_WHENGREATERTHAN_LOUDNESS": "garsumas", - "EVENT_BROADCAST": "skelbti %1", - "EVENT_BROADCASTANDWAIT": "skelbti %1 ir palaukti", - "EVENT_WHENKEYPRESSED": "kai paspaudi %1", - "EVENT_WHENKEYPRESSED_SPACE": "tarpą", - "EVENT_WHENKEYPRESSED_LEFT": "<--", - "EVENT_WHENKEYPRESSED_RIGHT": "-->", - "EVENT_WHENKEYPRESSED_DOWN": "⬇️", - "EVENT_WHENKEYPRESSED_UP": "⬆️", - "EVENT_WHENKEYPRESSED_ANY": "bet kurį", - "LOOKS_SAYFORSECS": "sakyk %1 %2 s.", - "LOOKS_SAY": "sakyk %1", - "LOOKS_HELLO": "Sveiki!", - "LOOKS_THINKFORSECS": "galvok %1 %2 s.", - "LOOKS_THINK": "galvok %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "rodyk", - "LOOKS_HIDE": "slėpk", - "LOOKS_HIDEALLSPRITES": "paslėpti visus veikėjus", - "LOOKS_EFFECT_COLOR": "spalva", - "LOOKS_EFFECT_FISHEYE": "lęšis", - "LOOKS_EFFECT_WHIRL": "susukimas", - "LOOKS_EFFECT_PIXELATE": "stambinti taškus", - "LOOKS_EFFECT_MOSAIC": "mozaika", - "LOOKS_EFFECT_BRIGHTNESS": "šviesumas", - "LOOKS_EFFECT_GHOST": "permatomumas", - "LOOKS_CHANGEEFFECTBY": "efektą %1 padidink %2", - "LOOKS_SETEFFECTTO": "efektas %1 = %2", - "LOOKS_CLEARGRAPHICEFFECTS": "panaikink išvaizdos efektus", - "LOOKS_CHANGESIZEBY": "dydį padidink %1 ", - "LOOKS_SETSIZETO": "dydis = %1 %", - "LOOKS_SIZE": "dydis", - "LOOKS_CHANGESTRETCHBY": "ruožą padidink %1", - "LOOKS_SETSTRETCHTO": "ruožas = %1 %", - "LOOKS_SWITCHCOSTUMETO": "kaukė = %1", - "LOOKS_NEXTCOSTUME": "kita kaukė", - "LOOKS_SWITCHBACKDROPTO": "fonas = %1", - "LOOKS_GOTOFRONTBACK": "perkelk į %1 sluoksnį", - "LOOKS_GOTOFRONTBACK_FRONT": "arčiausią", - "LOOKS_GOTOFRONTBACK_BACK": "tolimiausią", - "LOOKS_GOFORWARDBACKWARDLAYERS": "perkelti per %2 sluoksnius %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "arčiau", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "toliau", - "LOOKS_BACKDROPNUMBERNAME": "fonas %1", - "LOOKS_COSTUMENUMBERNAME": "kaukė %1", - "LOOKS_NUMBERNAME_NUMBER": "numeris", - "LOOKS_NUMBERNAME_NAME": "vardas", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "fonas = %1 (palauk, kol pasikeis)", - "LOOKS_NEXTBACKDROP_BLOCK": "kitas fonas", - "LOOKS_NEXTBACKDROP": "kitas fonas", - "LOOKS_PREVIOUSBACKDROP": "ankstesnis fonas", - "LOOKS_RANDOMBACKDROP": "atsitiktinis fonas", - "MOTION_MOVESTEPS": "eik %1", - "MOTION_TURNLEFT": "pasisuk %1 %2 laipsnių", - "MOTION_TURNRIGHT": "pasisuk %1 %2 laipsnių", - "MOTION_POINTINDIRECTION": "žiūrėk %1 laipsnių kryptimi", - "MOTION_POINTTOWARDS": "žiūrėk į %1", - "MOTION_POINTTOWARDS_POINTER": "pelės žymeklį", - "MOTION_POINTTOWARDS_RANDOM": "atsitiktinę kryptį", - "MOTION_GOTO": "eik ten, kur %1", - "MOTION_GOTO_POINTER": "pelės žymeklis", - "MOTION_GOTO_RANDOM": "atsitiktinė pozicija", - "MOTION_GOTOXY": "eik į x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "slink į x: %2 y: %3 per %1 s.", - "MOTION_GLIDETO": "slink ten, kur %2 per %1 s.", - "MOTION_GLIDETO_POINTER": "pelės žymeklis", - "MOTION_GLIDETO_RANDOM": "atsitiktinė pozicija", - "MOTION_CHANGEXBY": "x padidink %1", - "MOTION_SETX": "x = %1", - "MOTION_CHANGEYBY": "y padidink %1", - "MOTION_SETY": "y = %1", - "MOTION_IFONEDGEBOUNCE": "jei prie krašto, atšok", - "MOTION_SETROTATIONSTYLE": "sukimosi būdas = %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "kairėn-dešinėn", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "nesisukti", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "visomis kryptimis", - "MOTION_XPOSITION": "x vieta", - "MOTION_YPOSITION": "y vieta", - "MOTION_DIRECTION": "kryptis", - "MOTION_SCROLLRIGHT": "slinkti dešinėn %1", - "MOTION_SCROLLUP": "slinkti aukštyn %1", - "MOTION_ALIGNSCENE": "lygiuoti sceną %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "apačioj kairėj", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "apačioj dešinėj", - "MOTION_ALIGNSCENE_MIDDLE": "viduryje", - "MOTION_ALIGNSCENE_TOPLEFT": "kairėj viršuj", - "MOTION_ALIGNSCENE_TOPRIGHT": "dešinėj viršuj", - "MOTION_XSCROLL": "x slinktis", - "MOTION_YSCROLL": "y slinktis", - "MOTION_STAGE_SELECTED": "Pažymėta scena: jokių judesio blokų", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "atsitiktinis sk. tarp %1 ir %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 ir %2", - "OPERATORS_OR": "%1 arba %2", - "OPERATORS_NOT": "ne %1", - "OPERATORS_JOIN": "sujunk %1 ir %2", - "OPERATORS_JOIN_APPLE": "obuolys", - "OPERATORS_JOIN_BANANA": "bananas", - "OPERATORS_LETTEROF": "%2 raidė nr. %1", - "OPERATORS_LETTEROF_APPLE": "o", - "OPERATORS_LENGTH": "%1 ilgis", - "OPERATORS_CONTAINS": "ar %1 turi %2?", - "OPERATORS_MOD": "%1 / %2 liekana", - "OPERATORS_ROUND": "suapvalinta %1", - "OPERATORS_MATHOP": "%1 ( %2 )", - "OPERATORS_MATHOP_ABS": "teigiama reikšmė", - "OPERATORS_MATHOP_FLOOR": "apvalinimas žemyn", - "OPERATORS_MATHOP_CEILING": "apvalinimas aukštyn", - "OPERATORS_MATHOP_SQRT": "kvadratinė šaknis", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctg", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "komanda %1", - "SENSING_TOUCHINGOBJECT": "lieti %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "pelės žymeklį", - "SENSING_TOUCHINGOBJECT_EDGE": "kraštą", - "SENSING_TOUCHINGCOLOR": "lieti spalvą %1?", - "SENSING_COLORISTOUCHINGCOLOR": "spalva %1 liečia %2?", - "SENSING_DISTANCETO": "atstumas iki %1", - "SENSING_DISTANCETO_POINTER": "pelės žymeklio", - "SENSING_ASKANDWAIT": "paklausk %1 ir lauk", - "SENSING_ASK_TEXT": "Koks tavo vardas?", - "SENSING_ANSWER": "atsakas", - "SENSING_KEYPRESSED": "%1 paspausta?", - "SENSING_MOUSEDOWN": "pelė paspausta?", - "SENSING_MOUSEX": "pelės x", - "SENSING_MOUSEY": "pelės y", - "SENSING_SETDRAGMODE": "vilkimas pele = %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "velkamas", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nevelkamas", - "SENSING_LOUDNESS": "garsumas", - "SENSING_LOUD": "garsiai?", - "SENSING_TIMER": "laikmatis", - "SENSING_RESETTIMER": "laikmatis = 0", - "SENSING_OF": "%2 : %1", - "SENSING_OF_XPOSITION": "x koordinatė", - "SENSING_OF_YPOSITION": "y koordinatė", - "SENSING_OF_DIRECTION": "kryptis", - "SENSING_OF_COSTUMENUMBER": "kaukės nr.", - "SENSING_OF_COSTUMENAME": "kaukės pavadinimas", - "SENSING_OF_SIZE": "dydis", - "SENSING_OF_VOLUME": "garsas", - "SENSING_OF_BACKDROPNUMBER": "fono nr.", - "SENSING_OF_BACKDROPNAME": "fono pavadinimas", - "SENSING_OF_STAGE": "Scena", - "SENSING_CURRENT": "šio momento %1", - "SENSING_CURRENT_YEAR": "metai", - "SENSING_CURRENT_MONTH": "mėnuo", - "SENSING_CURRENT_DATE": "mėn. diena", - "SENSING_CURRENT_DAYOFWEEK": "savaitės diena", - "SENSING_CURRENT_HOUR": "valanda", - "SENSING_CURRENT_MINUTE": "minutė", - "SENSING_CURRENT_SECOND": "sekundė", - "SENSING_DAYSSINCE2000": "dienų skaičius nuo 2000-ųjų", - "SENSING_USERNAME": "vartotojo vardas", - "SENSING_USERID": "vartotojo ID", - "SOUND_PLAY": "grok %1", - "SOUND_PLAYUNTILDONE": "grok %1 kol pasibaigs", - "SOUND_STOPALLSOUNDS": "išjunk garsus", - "SOUND_SETEFFECTO": "efektas %1 = %2", - "SOUND_CHANGEEFFECTBY": "efektą %1 padidink %2", - "SOUND_CLEAREFFECTS": "pašalink garso efektus", - "SOUND_EFFECTS_PITCH": "garso aukštis", - "SOUND_EFFECTS_PAN": "kairiau/dešiniau", - "SOUND_CHANGEVOLUMEBY": "garsą padidink %1", - "SOUND_SETVOLUMETO": "garsumas = %1%", - "SOUND_VOLUME": "garsumas", - "SOUND_RECORD": "įrašyti garsą...", - "CATEGORY_MOTION": "Judėjimas", - "CATEGORY_LOOKS": "Išvaizda", - "CATEGORY_SOUND": "Garsas", - "CATEGORY_EVENTS": "Įvykiai", - "CATEGORY_CONTROL": "Valdymas", - "CATEGORY_SENSING": "Jutimas", - "CATEGORY_OPERATORS": "Matematika", - "CATEGORY_VARIABLES": "Kintamieji", - "CATEGORY_MYBLOCKS": "Mano Komandos", - "DUPLICATE": "Kurti kopiją", - "DELETE": "Ištrinti", - "ADD_COMMENT": "Pridėti komentarą", - "REMOVE_COMMENT": "Pašalinti komentarą", - "DELETE_BLOCK": "Ištrinti bloką", - "DELETE_X_BLOCKS": "Ištrinti %1 blokus", - "DELETE_ALL_BLOCKS": "Ištrinti visus %1 blokus?", - "CLEAN_UP": "Valyti blokus", - "HELP": "Pagalba", - "UNDO": "Atšaukti", - "REDO": "Grąžinti", - "EDIT_PROCEDURE": "Taisyti", - "SHOW_PROCEDURE_DEFINITION": "Eiti į apibrėžimą", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Pasakyk ką nors...", - "COLOUR_HUE_LABEL": "Spalva", - "COLOUR_SATURATION_LABEL": "Sodrumas", - "COLOUR_BRIGHTNESS_LABEL": "Šviesumas", - "CHANGE_VALUE_TITLE": "Pakeisti reikšmę:", - "RENAME_VARIABLE": "Pervadinti kintamąjį", - "RENAME_VARIABLE_TITLE": "Pervadinti visus \"%1\" kintamuosius į:", - "RENAME_VARIABLE_MODAL_TITLE": "Pervadinti kintamąjį", - "NEW_VARIABLE": "Sukurti kintamąjį", - "NEW_VARIABLE_TITLE": "Naujo kintamojo vardas:", - "VARIABLE_MODAL_TITLE": "Naujas kintamasis", - "VARIABLE_ALREADY_EXISTS": "Kintamasis vardu \"%1\" jau yra.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Vardas \"%1\" jau panaudotas kitam \"%2\" tipo kintamajam.", - "DELETE_VARIABLE_CONFIRMATION": "Ištrinti %1 atvejus su kintamuoju \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Negalima ištrinti \"%1\", nes jis yra funkcijos \"%2\" aprašymo dalis.", - "DELETE_VARIABLE": "Ištrinti kintamąjį \"%1\"", - "NEW_PROCEDURE": "Sukurti bloką", - "PROCEDURE_ALREADY_EXISTS": "Jau egzistuoja procedūra \"%1\".", - "PROCEDURE_DEFAULT_NAME": "bloko pavadinimas", - "NEW_LIST": "Sukurti sąrašą", - "NEW_LIST_TITLE": "Naujo sąrašo pavadinimas:", - "LIST_MODAL_TITLE": "Naujas sąrašas", - "LIST_ALREADY_EXISTS": "Jau egzistuoja sąrašas pavadintas \"%1\".", - "RENAME_LIST_TITLE": "Pervadinti visus \"%1\" sąrašus į:", - "RENAME_LIST_MODAL_TITLE": "Pervadinti sąrašą", - "DEFAULT_LIST_ITEM": "kažkas", - "DELETE_LIST": "Ištrinti \"%1\" sąrašą", - "RENAME_LIST": "Pervadinti sąrašą", - "NEW_BROADCAST_MESSAGE": "Nauja žinutė", - "NEW_BROADCAST_MESSAGE_TITLE": "Nauja žinutė pavadinimu:", - "BROADCAST_MODAL_TITLE": "Nauja žinutė", - "DEFAULT_BROADCAST_MESSAGE_NAME": "žinutė1" -}; - -Blockly.ScratchMsgs.locales["hu"] = -{ - "CONTROL_FOREVER": "mindig", - "CONTROL_REPEAT": "ismételd %1", - "CONTROL_IF": "ha %1 akkor", - "CONTROL_ELSE": "különben", - "CONTROL_STOP": "álljon le", - "CONTROL_STOP_ALL": "minden feladat", - "CONTROL_STOP_THIS": "ez a feladat", - "CONTROL_STOP_OTHER": "szereplő többi feladata", - "CONTROL_WAIT": "várj %1 mp-et", - "CONTROL_WAITUNTIL": "várj eddig: %1", - "CONTROL_REPEATUNTIL": "ismételd eddig: %1", - "CONTROL_WHILE": "amíg %1", - "CONTROL_FOREACH": "minden %1 elemet a %2 listában", - "CONTROL_STARTASCLONE": "másolatként kezdéskor", - "CONTROL_CREATECLONEOF": "készíts másolatot: %1", - "CONTROL_CREATECLONEOF_MYSELF": "magadról", - "CONTROL_DELETETHISCLONE": "töröld ezt a másolatot", - "CONTROL_COUNTER": "számláló", - "CONTROL_INCRCOUNTER": "növeld a számlálót", - "CONTROL_CLEARCOUNTER": "nullázd a számlálót", - "CONTROL_ALLATONCE": "mindent egyszerre", - "DATA_SETVARIABLETO": "%1 legyen %2", - "DATA_CHANGEVARIABLEBY": "%1 változzon %2", - "DATA_SHOWVARIABLE": "%1 változó jelenjen meg", - "DATA_HIDEVARIABLE": "%1 változó tűnjön el", - "DATA_ADDTOLIST": "add %1 elemet %2 listához", - "DATA_DELETEOFLIST": "töröld %1 elemet %2 listából", - "DATA_DELETEALLOFLIST": "töröld %1 lista minden elemét", - "DATA_INSERTATLIST": "szúrd be %1 elemet %2 helyre %3 listában", - "DATA_REPLACEITEMOFLIST": "cseréld le %1 elemet %2 listában %3 elemre", - "DATA_ITEMOFLIST": "%2 %1 eleme", - "DATA_ITEMNUMOFLIST": "%1 sorszáma %2 listában", - "DATA_LENGTHOFLIST": "%1 hossza", - "DATA_LISTCONTAINSITEM": "%1 tartalmazza %2?", - "DATA_SHOWLIST": "%1 lista jelenjen meg", - "DATA_HIDELIST": "%1 lista tűnjön el", - "DATA_INDEX_ALL": "minden", - "DATA_INDEX_LAST": "utolsó", - "DATA_INDEX_RANDOM": "véletlen", - "EVENT_WHENFLAGCLICKED": "%1 -ra kattintáskor", - "EVENT_WHENTHISSPRITECLICKED": "ezen szereplőre kattintáskor", - "EVENT_WHENSTAGECLICKED": "színpadra kattintáskor", - "EVENT_WHENTOUCHINGOBJECT": "%1 érintésekor", - "EVENT_WHENBROADCASTRECEIVED": "%1 üzenet érkezésekor", - "EVENT_WHENBACKDROPSWITCHESTO": "%1 háttér beállításakor", - "EVENT_WHENGREATERTHAN": "amikor %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "időmérő", - "EVENT_WHENGREATERTHAN_LOUDNESS": "hangerő", - "EVENT_BROADCAST": "küldj üzenetet: %1", - "EVENT_BROADCASTANDWAIT": "küldj üzenetet: %1 és várj", - "EVENT_WHENKEYPRESSED": "%1 gomb lenyomásakor", - "EVENT_WHENKEYPRESSED_SPACE": "szóköz", - "EVENT_WHENKEYPRESSED_LEFT": "balra nyíl", - "EVENT_WHENKEYPRESSED_RIGHT": "jobbra nyíl", - "EVENT_WHENKEYPRESSED_DOWN": "lefelé nyíl", - "EVENT_WHENKEYPRESSED_UP": "felfelé nyíl", - "EVENT_WHENKEYPRESSED_ANY": "bármelyik", - "LOOKS_SAYFORSECS": "mondd: %1 %2 másodpercig", - "LOOKS_SAY": "mondd: %1", - "LOOKS_HELLO": "Szia!", - "LOOKS_THINKFORSECS": "gondold: %1 %2 másodpercig", - "LOOKS_THINK": "gondold: %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "jelenj meg", - "LOOKS_HIDE": "tűnj el", - "LOOKS_HIDEALLSPRITES": "rejtsd el az összes szereplőt", - "LOOKS_EFFECT_COLOR": "szín", - "LOOKS_EFFECT_FISHEYE": "halszem", - "LOOKS_EFFECT_WHIRL": "örvény", - "LOOKS_EFFECT_PIXELATE": "pixeles", - "LOOKS_EFFECT_MOSAIC": "mozaik", - "LOOKS_EFFECT_BRIGHTNESS": "fényerő", - "LOOKS_EFFECT_GHOST": "szellem", - "LOOKS_CHANGEEFFECTBY": "%1 hatás változzon %2", - "LOOKS_SETEFFECTTO": "%1 hatás legyen %2", - "LOOKS_CLEARGRAPHICEFFECTS": "töröld a grafikus hatásokat", - "LOOKS_CHANGESIZEBY": "méret változzon %1", - "LOOKS_SETSIZETO": "méret legyen %1 %", - "LOOKS_SIZE": "méret", - "LOOKS_CHANGESTRETCHBY": "nyújtás változzon %1", - "LOOKS_SETSTRETCHTO": "nyújtás legyen %1", - "LOOKS_SWITCHCOSTUMETO": "jelmez legyen %1", - "LOOKS_NEXTCOSTUME": "következő jelmez", - "LOOKS_SWITCHBACKDROPTO": "háttér legyen %1", - "LOOKS_GOTOFRONTBACK": "kerülj %1", - "LOOKS_GOTOFRONTBACK_FRONT": "legelőre", - "LOOKS_GOTOFRONTBACK_BACK": "leghátra", - "LOOKS_GOFORWARDBACKWARDLAYERS": "kerülj %1 %2 szintet", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "előre", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "hátra", - "LOOKS_BACKDROPNUMBERNAME": "háttér %1", - "LOOKS_COSTUMENUMBERNAME": "jelmez %1", - "LOOKS_NUMBERNAME_NUMBER": "sorszáma", - "LOOKS_NUMBERNAME_NAME": "neve", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "háttér legyen %1 és várj", - "LOOKS_NEXTBACKDROP_BLOCK": "következő háttér", - "LOOKS_NEXTBACKDROP": "következő háttér", - "LOOKS_PREVIOUSBACKDROP": "előző háttér", - "LOOKS_RANDOMBACKDROP": "véletlen háttér", - "MOTION_MOVESTEPS": "menj %1 lépést", - "MOTION_TURNLEFT": "fordulj %1 %2 fokot", - "MOTION_TURNRIGHT": "fordulj %1 %2 fokot", - "MOTION_POINTINDIRECTION": "nézz %1 fokos irányba", - "MOTION_POINTTOWARDS": "nézz %1 felé", - "MOTION_POINTTOWARDS_POINTER": "egérmutató", - "MOTION_POINTTOWARDS_RANDOM": "véletlen irány", - "MOTION_GOTO": "ugorj %1 helyére", - "MOTION_GOTO_POINTER": "egérmutató", - "MOTION_GOTO_RANDOM": "véletlen hely", - "MOTION_GOTOXY": "ugorj ide: x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "csússz %1 mp-ig ide: x: %2 y: %3", - "MOTION_GLIDETO": "csússz %1 mp-ig ide: %2", - "MOTION_GLIDETO_POINTER": "egérmutató", - "MOTION_GLIDETO_RANDOM": "véletlen hely", - "MOTION_CHANGEXBY": "x változzon %1", - "MOTION_SETX": "x legyen %1", - "MOTION_CHANGEYBY": "y változzon %1", - "MOTION_SETY": "y legyen %1", - "MOTION_IFONEDGEBOUNCE": "ha szélen vagy, pattanj vissza", - "MOTION_SETROTATIONSTYLE": "jelmez %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "balra-jobbra nézhet", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "nem foroghat", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "foroghat", - "MOTION_XPOSITION": "x hely", - "MOTION_YPOSITION": "y hely", - "MOTION_DIRECTION": "irány", - "MOTION_SCROLLRIGHT": "görgess jobbra: %1", - "MOTION_SCROLLUP": "görgess fel: %1", - "MOTION_ALIGNSCENE": "%1 jelenet igazítása", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "lent balra", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "lent jobbra", - "MOTION_ALIGNSCENE_MIDDLE": "középen", - "MOTION_ALIGNSCENE_TOPLEFT": "fent balra", - "MOTION_ALIGNSCENE_TOPRIGHT": "fent jobbra", - "MOTION_XSCROLL": "x görgetés", - "MOTION_YSCROLL": "y görgetés", - "MOTION_STAGE_SELECTED": "A színpad nem mozgatható", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "véletlen %1 és %2 között", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 és %2", - "OPERATORS_OR": "%1 vagy %2", - "OPERATORS_NOT": "nem %1", - "OPERATORS_JOIN": "%1 %2 együtt", - "OPERATORS_JOIN_APPLE": "alma", - "OPERATORS_JOIN_BANANA": "banán", - "OPERATORS_LETTEROF": "%2 %1 betűje", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "%1 hossza", - "OPERATORS_CONTAINS": "%1 tartalmazza %2?", - "OPERATORS_MOD": "%1 / %2 maradéka", - "OPERATORS_ROUND": "%1 kerekítve", - "OPERATORS_MATHOP": "%2 %1 értéke", - "OPERATORS_MATHOP_ABS": "abszolut értéke", - "OPERATORS_MATHOP_FLOOR": "lefelé kerekítve", - "OPERATORS_MATHOP_CEILING": "felfelé kerekítve", - "OPERATORS_MATHOP_SQRT": "gyöke", - "OPERATORS_MATHOP_SIN": "szinusza", - "OPERATORS_MATHOP_COS": "koszinusza", - "OPERATORS_MATHOP_TAN": "tangense", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "logaritmusa", - "OPERATORS_MATHOP_EEXP": "e^", - "OPERATORS_MATHOP_10EXP": "10^", - "PROCEDURES_DEFINITION": "%1 meghatározása", - "SENSING_TOUCHINGOBJECT": "érinted: %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "egérmutató", - "SENSING_TOUCHINGOBJECT_EDGE": "színpad széle", - "SENSING_TOUCHINGCOLOR": "érintesz %1 színt?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 érint %2 színt?", - "SENSING_DISTANCETO": "%1 távolsága", - "SENSING_DISTANCETO_POINTER": "egérmutató", - "SENSING_ASKANDWAIT": "kérdezd meg: %1 és várj", - "SENSING_ASK_TEXT": "Hogy hívnak?", - "SENSING_ANSWER": "válasz", - "SENSING_KEYPRESSED": "%1 lenyomva?", - "SENSING_MOUSEDOWN": "egér lenyomva?", - "SENSING_MOUSEX": "egér x", - "SENSING_MOUSEY": "egér y", - "SENSING_SETDRAGMODE": "húzás módja legyen %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "húzható", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nem húzható", - "SENSING_LOUDNESS": "hangerő", - "SENSING_LOUD": "hangos?", - "SENSING_TIMER": "időmérő", - "SENSING_RESETTIMER": "időmérő visszaállítása", - "SENSING_OF": "%2 %1", - "SENSING_OF_XPOSITION": "x hely", - "SENSING_OF_YPOSITION": "y hely", - "SENSING_OF_DIRECTION": "irány", - "SENSING_OF_COSTUMENUMBER": "jelmez sorszáma", - "SENSING_OF_COSTUMENAME": "jelmez neve", - "SENSING_OF_SIZE": "mérete", - "SENSING_OF_VOLUME": "hangereje", - "SENSING_OF_BACKDROPNUMBER": "háttér sorszáma", - "SENSING_OF_BACKDROPNAME": "háttér neve", - "SENSING_OF_STAGE": "Színpad", - "SENSING_CURRENT": "jelenlegi %1", - "SENSING_CURRENT_YEAR": "év", - "SENSING_CURRENT_MONTH": "hónap", - "SENSING_CURRENT_DATE": "nap", - "SENSING_CURRENT_DAYOFWEEK": "hét napja", - "SENSING_CURRENT_HOUR": "óra", - "SENSING_CURRENT_MINUTE": "perc", - "SENSING_CURRENT_SECOND": "másodperc", - "SENSING_DAYSSINCE2000": "napok 2000 óta", - "SENSING_USERNAME": "felhasználó", - "SENSING_USERID": "felhasználóazonosító", - "SOUND_PLAY": "indítsd el %1 hangot", - "SOUND_PLAYUNTILDONE": "játszd végig %1 hangot", - "SOUND_STOPALLSOUNDS": "minden hang álljon le", - "SOUND_SETEFFECTO": "%1 hatás legyen %2", - "SOUND_CHANGEEFFECTBY": "%1 hatás változzon %2", - "SOUND_CLEAREFFECTS": "hanghatások törlése", - "SOUND_EFFECTS_PITCH": "hangmagasság", - "SOUND_EFFECTS_PAN": "pásztázás balra/jobbra", - "SOUND_CHANGEVOLUMEBY": "hangerő változzon %1", - "SOUND_SETVOLUMETO": "hangerő legyen %1%", - "SOUND_VOLUME": "hangerő", - "SOUND_RECORD": "felvétel...", - "CATEGORY_MOTION": "Mozgás", - "CATEGORY_LOOKS": "Kinézet", - "CATEGORY_SOUND": "Hang", - "CATEGORY_EVENTS": "Események", - "CATEGORY_CONTROL": "Vezérlés", - "CATEGORY_SENSING": "Érzékelés", - "CATEGORY_OPERATORS": "Műveletek", - "CATEGORY_VARIABLES": "Változók", - "CATEGORY_MYBLOCKS": "Blokkjaim", - "DUPLICATE": "Duplikálás", - "DELETE": "Törlés", - "ADD_COMMENT": "Megjegyzés", - "REMOVE_COMMENT": "Megjegyzés eltávolítása", - "DELETE_BLOCK": "Blokk törlése", - "DELETE_X_BLOCKS": "Törölj %1 blokkot", - "DELETE_ALL_BLOCKS": "Mind a %1 blokk törlése?", - "CLEAN_UP": "Rendrakás", - "HELP": "Súgó", - "UNDO": "Visszavonás", - "REDO": "Mégis", - "EDIT_PROCEDURE": "Szerkesztés", - "SHOW_PROCEDURE_DEFINITION": "Ugorj a meghatározáshoz", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Mondj valamit...", - "COLOUR_HUE_LABEL": "Szín", - "COLOUR_SATURATION_LABEL": "Telítettség", - "COLOUR_BRIGHTNESS_LABEL": "Fényerő", - "CHANGE_VALUE_TITLE": "Érték változtatása:", - "RENAME_VARIABLE": "Változó átnevezése", - "RENAME_VARIABLE_TITLE": "Minden „%1” változó átnevezése erre:", - "RENAME_VARIABLE_MODAL_TITLE": "Változó átnevezése", - "NEW_VARIABLE": "Változó létrehozása", - "NEW_VARIABLE_TITLE": "Új változó neve:", - "VARIABLE_MODAL_TITLE": "Új változó", - "VARIABLE_ALREADY_EXISTS": "„%1” nevű változó már létezik.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "„%1” nevű változó már létezik egy másik „%2” típusú változónál", - "DELETE_VARIABLE_CONFIRMATION": "Törlöd „%2” változót (%1 használat)?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "„%1” változó nem törölhető, mert „%2” függvény leírásának része", - "DELETE_VARIABLE": "Töröld „%1” változót", - "NEW_PROCEDURE": "Blokk létrehozása", - "PROCEDURE_ALREADY_EXISTS": "„%1” nevű blokk már létezik.", - "PROCEDURE_DEFAULT_NAME": "blokknév", - "NEW_LIST": "Lista létrehozása", - "NEW_LIST_TITLE": "Új lista neve:", - "LIST_MODAL_TITLE": "Új lista", - "LIST_ALREADY_EXISTS": "„%1” nevű lista már létezik.", - "RENAME_LIST_TITLE": "Nevezd át az összes „%1” listát erre:", - "RENAME_LIST_MODAL_TITLE": "Lista átnevezése", - "DEFAULT_LIST_ITEM": "valami", - "DELETE_LIST": "Töröld „%1” listát", - "RENAME_LIST": "Lista átnevezése", - "NEW_BROADCAST_MESSAGE": "Új üzenet", - "NEW_BROADCAST_MESSAGE_TITLE": "Új üzenet neve:", - "BROADCAST_MODAL_TITLE": "Új üzenet", - "DEFAULT_BROADCAST_MESSAGE_NAME": "üzenet1" -}; - -Blockly.ScratchMsgs.locales["mi"] = -{ - "CONTROL_FOREVER": "mō ake, ake mahia", - "CONTROL_REPEAT": "tōaitia %1", - "CONTROL_IF": "mēnā %1 mahia", - "CONTROL_ELSE": "kē atu", - "CONTROL_STOP": "katia", - "CONTROL_STOP_ALL": "katoa", - "CONTROL_STOP_THIS": "tēnei hōtuhi", - "CONTROL_STOP_OTHER": "hōtuhi kē i roto i te parehe", - "CONTROL_WAIT": "tatari kia %1 hēkona", - "CONTROL_WAITUNTIL": "tatari kia %1", - "CONTROL_REPEATUNTIL": "tōaitia tonutia kia %1", - "CONTROL_WHILE": "tōaitia tonutia mēnā %1", - "CONTROL_FOREACH": "mō ia %1 o roto i te %2", - "CONTROL_STARTASCLONE": "ina ka tīmata mai ahau hei tārua", - "CONTROL_CREATECLONEOF": "whakapūruatia %1", - "CONTROL_CREATECLONEOF_MYSELF": "ahau anō", - "CONTROL_DELETETHISCLONE": "mukua tēnei tāruarua", - "CONTROL_COUNTER": "pūtatau", - "CONTROL_INCRCOUNTER": "tāpiri tahi ki te pūtatau", - "CONTROL_CLEARCOUNTER": "ūkui pūtatau", - "CONTROL_ALLATONCE": "te katoa i te wā kotahi", - "DATA_SETVARIABLETO": "tautuhia %1 ki te %2", - "DATA_CHANGEVARIABLEBY": "panonitia %1 mā te %2", - "DATA_SHOWVARIABLE": "whakaaturia te taurangi %1", - "DATA_HIDEVARIABLE": "hunaia te taurangi %1", - "DATA_ADDTOLIST": "tāpiritia te %1 ki te %2", - "DATA_DELETEOFLIST": "mukua %1 i a %2", - "DATA_DELETEALLOFLIST": "mukua te katoa o %1", - "DATA_INSERTATLIST": "whakaurua te %1 hei %2 o %3", - "DATA_REPLACEITEMOFLIST": "whakakapia te tūemi %1 o %2, ki %3", - "DATA_ITEMOFLIST": "te tūemi %1 o %2", - "DATA_ITEMNUMOFLIST": "te tūemi # %1 o %2", - "DATA_LENGTHOFLIST": "te roanga o te %1", - "DATA_LISTCONTAINSITEM": "kei roto i %1 te %2?", - "DATA_SHOWLIST": "whakaaturia te rārangi %1", - "DATA_HIDELIST": "hunāia te rārangi %1", - "DATA_INDEX_ALL": "katoa", - "DATA_INDEX_LAST": "whakamutunga", - "DATA_INDEX_RANDOM": "matapōkere", - "EVENT_WHENFLAGCLICKED": "ina pāwhiria te %1", - "EVENT_WHENTHISSPRITECLICKED": "ina pāwhiria tēnei parehe", - "EVENT_WHENSTAGECLICKED": "ina pāwhiria te Atamira", - "EVENT_WHENTOUCHINGOBJECT": "ka pā tēnei parehe i te %1", - "EVENT_WHENBROADCASTRECEIVED": "ina ka riro mai te %1", - "EVENT_WHENBACKDROPSWITCHESTO": "ina hurihia te ārai tuarongo kia %1", - "EVENT_WHENGREATERTHAN": "mēnā %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "taima", - "EVENT_WHENGREATERTHAN_LOUDNESS": "hoihoi", - "EVENT_BROADCAST": "whakapaoho %1", - "EVENT_BROADCASTANDWAIT": "whakapaoho %1, kātahi tatari", - "EVENT_WHENKEYPRESSED": "ina pēhia te pātuhi %1", - "EVENT_WHENKEYPRESSED_SPACE": "mokowā", - "EVENT_WHENKEYPRESSED_LEFT": "pere mauī", - "EVENT_WHENKEYPRESSED_RIGHT": "pere katau", - "EVENT_WHENKEYPRESSED_DOWN": "pere whakararo", - "EVENT_WHENKEYPRESSED_UP": "pere whakarunga", - "EVENT_WHENKEYPRESSED_ANY": "noa", - "LOOKS_SAYFORSECS": "kīia %1 mō ngā hēkona %2", - "LOOKS_SAY": "kīia %1", - "LOOKS_HELLO": "Kia ora!", - "LOOKS_THINKFORSECS": "whakaarohia te %1 mō ngā hēkona %2", - "LOOKS_THINK": "whakaarohia te %1", - "LOOKS_HMM": "Āa...", - "LOOKS_SHOW": "whakaatu", - "LOOKS_HIDE": "huna", - "LOOKS_HIDEALLSPRITES": "hunaia ngā parehe katoa", - "LOOKS_EFFECT_COLOR": "tae", - "LOOKS_EFFECT_FISHEYE": "karu ika", - "LOOKS_EFFECT_WHIRL": "kōriporipo", - "LOOKS_EFFECT_PIXELATE": "whakatongitongi", - "LOOKS_EFFECT_MOSAIC": "toi rōpinepine", - "LOOKS_EFFECT_BRIGHTNESS": "pīataata", - "LOOKS_EFFECT_GHOST": "kēhua", - "LOOKS_CHANGEEFFECTBY": "panonitia te rākeitanga %1 mā te %2", - "LOOKS_SETEFFECTTO": "panonitia te rākeitanga %1 ki te %2", - "LOOKS_CLEARGRAPHICEFFECTS": "ūkui rākeitanga whakairoiro", - "LOOKS_CHANGESIZEBY": "panonitia te rahi mā te %1", - "LOOKS_SETSIZETO": "tautuhia te rahi kia %1 %", - "LOOKS_SIZE": "rahi", - "LOOKS_CHANGESTRETCHBY": "panonitia te toronga mā te %1", - "LOOKS_SETSTRETCHTO": "tautuhia te toronga kia %1 %", - "LOOKS_SWITCHCOSTUMETO": "panonitia te kākahu kia %1", - "LOOKS_NEXTCOSTUME": "kākahu panuku", - "LOOKS_SWITCHBACKDROPTO": "panonitia te ārai tuarongo kia %1", - "LOOKS_GOTOFRONTBACK": "haere ki te apa %1", - "LOOKS_GOTOFRONTBACK_FRONT": "mua", - "LOOKS_GOTOFRONTBACK_BACK": "muri", - "LOOKS_GOFORWARDBACKWARDLAYERS": "nekehia %1, kia %2 ngā apaapa", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ki mua", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ki muri", - "LOOKS_BACKDROPNUMBERNAME": "ārai tuarongo %1", - "LOOKS_COSTUMENUMBERNAME": "kākahu %1", - "LOOKS_NUMBERNAME_NUMBER": "nama", - "LOOKS_NUMBERNAME_NAME": "ingoa", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "panonitia te ārai tuarongo kia %1, kātahi, tatari", - "LOOKS_NEXTBACKDROP_BLOCK": "ārai tuarongo panuku", - "LOOKS_NEXTBACKDROP": "ārai tuarongo panuku", - "LOOKS_PREVIOUSBACKDROP": "ārai tuarongo o mua", - "LOOKS_RANDOMBACKDROP": "ārai tuarongo matapōkere", - "MOTION_MOVESTEPS": "nekehia kia %1 ngā takahanga", - "MOTION_TURNLEFT": "hurihia %1, kia %2 putu", - "MOTION_TURNRIGHT": "hurihia %1, kia %2 putu", - "MOTION_POINTINDIRECTION": "atatohua ki %1", - "MOTION_POINTTOWARDS": "atatohua ki %1", - "MOTION_POINTTOWARDS_POINTER": "atatohu-kiore", - "MOTION_POINTTOWARDS_RANDOM": "ahunga matapōkere", - "MOTION_GOTO": "neke ki %1", - "MOTION_GOTO_POINTER": "atatohu-kiore", - "MOTION_GOTO_RANDOM": "tūnga matapōkere", - "MOTION_GOTOXY": "neke ki x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "wania kia %1 hēkona ki x: %2 y: %3", - "MOTION_GLIDETO": "wania kia %1 hēkona ki %2", - "MOTION_GLIDETO_POINTER": "atatohu-kiore", - "MOTION_GLIDETO_RANDOM": "tūnga matapōkere", - "MOTION_CHANGEXBY": "panonitia x mā te %1", - "MOTION_SETX": "tautuhia te x kia %1", - "MOTION_CHANGEYBY": "panonitia y mā te %1", - "MOTION_SETY": "tautuhia te y kia %1", - "MOTION_IFONEDGEBOUNCE": "mēnā kei te taitapa, tupanatia", - "MOTION_SETROTATIONSTYLE": "tautuhia te momo huringa kia %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "mauī-ki-katau", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "kaua e takahuri", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "huri noa", - "MOTION_XPOSITION": "tūnga x", - "MOTION_YPOSITION": "tūnga y", - "MOTION_DIRECTION": "ahunga", - "MOTION_SCROLLRIGHT": "panuku whakatekatau %1", - "MOTION_SCROLLUP": "panuku whakarunga %1", - "MOTION_ALIGNSCENE": "tīaro kāpeka %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "taha mauī o raro", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "taha katau o raro", - "MOTION_ALIGNSCENE_MIDDLE": "waenga", - "MOTION_ALIGNSCENE_TOPLEFT": "taha mauī o runga", - "MOTION_ALIGNSCENE_TOPRIGHT": "taha katau o runga", - "MOTION_XSCROLL": "panuku x", - "MOTION_YSCROLL": "panuku y", - "MOTION_STAGE_SELECTED": "Kua tīpakongia te atamira: kāore he paraka nekeneke", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "kōwhiria matapōkere %1 ki te %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 me %2", - "OPERATORS_OR": "%1, %2 rānei", - "OPERATORS_NOT": "ehara ko te %1", - "OPERATORS_JOIN": "tāpiritia te %1, %2", - "OPERATORS_JOIN_APPLE": "āporo", - "OPERATORS_JOIN_BANANA": "panana", - "OPERATORS_LETTEROF": "te pū %1 o te %2", - "OPERATORS_LETTEROF_APPLE": "he", - "OPERATORS_LENGTH": "te roanga o te %1", - "OPERATORS_CONTAINS": "kei roto i a %1 : %2?", - "OPERATORS_MOD": "%1 % %2", - "OPERATORS_ROUND": "whakaawhiwhi %1", - "OPERATORS_MATHOP": "%1 o te %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "papa", - "OPERATORS_MATHOP_CEILING": "tuanui", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "tautuhia %1", - "SENSING_TOUCHINGOBJECT": "kei te pā ki te %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "atatohu-kiore", - "SENSING_TOUCHINGOBJECT_EDGE": "taitapa", - "SENSING_TOUCHINGCOLOR": "kei te pā ki te tae %1?", - "SENSING_COLORISTOUCHINGCOLOR": "ka pā te tae %1 i te %2?", - "SENSING_DISTANCETO": "tawhiti ki %1", - "SENSING_DISTANCETO_POINTER": "atatohu-kiore", - "SENSING_ASKANDWAIT": "pātai %1, kātahi, tatari", - "SENSING_ASK_TEXT": "Ko wai tō ingoa?", - "SENSING_ANSWER": "whakautu", - "SENSING_KEYPRESSED": "kua pēhia te pātuhi %1?", - "SENSING_MOUSEDOWN": "pāwhiri kiore?", - "SENSING_MOUSEX": "x kiore", - "SENSING_MOUSEY": "y kiore", - "SENSING_SETDRAGMODE": "tautuhia te aratau tō kia %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ka taea te tō", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "kāore e taea te tō", - "SENSING_LOUDNESS": "hoihoi", - "SENSING_LOUD": "hoihoi?", - "SENSING_TIMER": "taima", - "SENSING_RESETTIMER": "tautuhia anōtia te taima", - "SENSING_OF": "%1 o %2", - "SENSING_OF_XPOSITION": "tūnga x", - "SENSING_OF_YPOSITION": "tūnga y", - "SENSING_OF_DIRECTION": "ahunga", - "SENSING_OF_COSTUMENUMBER": "kākahu #", - "SENSING_OF_COSTUMENAME": "ingoa kākahu", - "SENSING_OF_SIZE": "rahi", - "SENSING_OF_VOLUME": "kahaoro", - "SENSING_OF_BACKDROPNUMBER": "ārai tuarongo #", - "SENSING_OF_BACKDROPNAME": "ingoa ārai tuarongo", - "SENSING_OF_STAGE": "Atamira", - "SENSING_CURRENT": "%1 o nāianei", - "SENSING_CURRENT_YEAR": "tau", - "SENSING_CURRENT_MONTH": "marama", - "SENSING_CURRENT_DATE": "te rā", - "SENSING_CURRENT_DAYOFWEEK": "te rangi o te wiki", - "SENSING_CURRENT_HOUR": "haora", - "SENSING_CURRENT_MINUTE": "miniti", - "SENSING_CURRENT_SECOND": "hēkona", - "SENSING_DAYSSINCE2000": "ngā rā mai i 2000", - "SENSING_USERNAME": "ingoa kaiwhakamahi", - "SENSING_USERID": "tohu tuakiri", - "SOUND_PLAY": "tīmatahia te whakatangi i te oro %1", - "SOUND_PLAYUNTILDONE": "whakatangihia te oro %1 kia mutu rawa", - "SOUND_STOPALLSOUNDS": "katia ngā oro katoa", - "SOUND_SETEFFECTO": "tautuhia te rākeitanga %1 kia %2", - "SOUND_CHANGEEFFECTBY": "panonitia te rākeitanga %1 mā te %2", - "SOUND_CLEAREFFECTS": "ūkui rākeitanga orotaunaki", - "SOUND_EFFECTS_PITCH": "hauoro", - "SOUND_EFFECTS_PAN": "huri whakatemauī/whakatekatau", - "SOUND_CHANGEVOLUMEBY": "panonitia te kahaoro mā te %1", - "SOUND_SETVOLUMETO": "tautuhia te kahaoro kia %1%", - "SOUND_VOLUME": "kahaoro", - "SOUND_RECORD": "hopukina...", - "CATEGORY_MOTION": "Nekehanga", - "CATEGORY_LOOKS": "Āhua", - "CATEGORY_SOUND": "Oro", - "CATEGORY_EVENTS": "Takahanga", - "CATEGORY_CONTROL": "Whakatina", - "CATEGORY_SENSING": "Paerongo", - "CATEGORY_OPERATORS": "Tohutūmahi", - "CATEGORY_VARIABLES": "Ngā Taurangi", - "CATEGORY_MYBLOCKS": "Aku Paraka", - "DUPLICATE": "Tāruatia", - "DELETE": "Mukua", - "ADD_COMMENT": "Tāpiri Tākupu", - "REMOVE_COMMENT": "Mukua te Tākupu", - "DELETE_BLOCK": "Mukua te Paraka", - "DELETE_X_BLOCKS": "Mukua %1 Paraka", - "DELETE_ALL_BLOCKS": "Mukua te katoa o ngā paraka e %1 ?", - "CLEAN_UP": "Whakatikatika i ngā Paraka", - "HELP": "Āwhina", - "UNDO": "Wetekia", - "REDO": "Mahia anōtia", - "EDIT_PROCEDURE": "Whakatikaina", - "SHOW_PROCEDURE_DEFINITION": "Haere ki te tautuhinga", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Kīia tētahi mea...", - "COLOUR_HUE_LABEL": "Tae", - "COLOUR_SATURATION_LABEL": "Waiwai", - "COLOUR_BRIGHTNESS_LABEL": "Pīataata", - "CHANGE_VALUE_TITLE": "Panonitia te uara:", - "RENAME_VARIABLE": "Tapaina anōtia te taurangi", - "RENAME_VARIABLE_TITLE": "Tapaina anōtia te katoa o ngā taurangi \"%1\" ki:", - "RENAME_VARIABLE_MODAL_TITLE": "Tapaina anōtia te Taurangi", - "NEW_VARIABLE": "Hangaia tētahi taurangi", - "NEW_VARIABLE_TITLE": "Ingoa taurangi hou:", - "VARIABLE_MODAL_TITLE": "Taurangi Hou", - "VARIABLE_ALREADY_EXISTS": "Kua hangaia kētia tētahi taurangi, ko \"%1\" te ingoa.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Kua hangaia kētia tētahi taurangi, ko \"%1\" te ingoa, engari he momo \"%2\" tērā.", - "DELETE_VARIABLE_CONFIRMATION": "Mukua hoki %1 ngā mahinga o te taurangi \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kāore e taea te muku i te taurangi \"%1\", nā te mea he wāhanga taua taurangi o te tautuhinga mō te hātepe \"%2\"", - "DELETE_VARIABLE": "Mukua te taurangi \"%1\"", - "NEW_PROCEDURE": "Hangaia tētahi Paraka", - "PROCEDURE_ALREADY_EXISTS": "Kua hangaia kētia tētahi hātepe ko \"%1\" te ingoa.", - "PROCEDURE_DEFAULT_NAME": "ingoa paraka", - "NEW_LIST": "Hangaia tētahi Rārangi", - "NEW_LIST_TITLE": "Ingoa rārangi hou:", - "LIST_MODAL_TITLE": "Rārangi Hou", - "LIST_ALREADY_EXISTS": "Kua hangaia kētia tētahi rārangi ko \"%1\" te ingoa.", - "RENAME_LIST_TITLE": "Tapaina anōtia te katoa o ngā rārangi \"%1\" ki:", - "RENAME_LIST_MODAL_TITLE": "Tapaina te Rārangi", - "DEFAULT_LIST_ITEM": "mea", - "DELETE_LIST": "Mukua te rārangi \"%1\"", - "RENAME_LIST": "Tapaina anōtia te Rārangi", - "NEW_BROADCAST_MESSAGE": "Karere hou", - "NEW_BROADCAST_MESSAGE_TITLE": "Ingoa karere hou:", - "BROADCAST_MODAL_TITLE": "Karere Hou", - "DEFAULT_BROADCAST_MESSAGE_NAME": "karere1" -}; - -Blockly.ScratchMsgs.locales["nl"] = -{ - "CONTROL_FOREVER": "herhaal", - "CONTROL_REPEAT": "herhaal %1", - "CONTROL_IF": "als %1 dan", - "CONTROL_ELSE": "anders", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "alle", - "CONTROL_STOP_THIS": "dit script", - "CONTROL_STOP_OTHER": "andere scripts in sprite", - "CONTROL_WAIT": "wacht %1 sec.", - "CONTROL_WAITUNTIL": "wacht tot %1", - "CONTROL_REPEATUNTIL": "herhaal tot %1", - "CONTROL_WHILE": "zolang %1", - "CONTROL_FOREACH": "voor elke %1 in %2", - "CONTROL_STARTASCLONE": "wanneer ik als kloon start", - "CONTROL_CREATECLONEOF": "maak een kloon van %1", - "CONTROL_CREATECLONEOF_MYSELF": "mijzelf", - "CONTROL_DELETETHISCLONE": "verwijder deze kloon", - "CONTROL_COUNTER": "teller", - "CONTROL_INCRCOUNTER": "verhoog teller", - "CONTROL_CLEARCOUNTER": "zet teller op 0", - "CONTROL_ALLATONCE": "alles in een keer", - "DATA_SETVARIABLETO": "maak %1 %2", - "DATA_CHANGEVARIABLEBY": "verander %1 met %2", - "DATA_SHOWVARIABLE": "toon variabele %1", - "DATA_HIDEVARIABLE": "verberg variabele %1", - "DATA_ADDTOLIST": "voeg %1 toe aan %2", - "DATA_DELETEOFLIST": "verwijder %1 van %2", - "DATA_DELETEALLOFLIST": "verwijder alle van %1", - "DATA_INSERTATLIST": "voeg %1 toe op %2 van %3", - "DATA_REPLACEITEMOFLIST": "vervang item %1 van %2 door %3", - "DATA_ITEMOFLIST": "item %1 van %2", - "DATA_ITEMNUMOFLIST": "item # van %1 in %2", - "DATA_LENGTHOFLIST": "lengte van %1", - "DATA_LISTCONTAINSITEM": "%1 bevat %2?", - "DATA_SHOWLIST": "toon lijst %1", - "DATA_HIDELIST": "verberg lijst %1", - "DATA_INDEX_ALL": "alle", - "DATA_INDEX_LAST": "laatste", - "DATA_INDEX_RANDOM": "willekeurig", - "EVENT_WHENFLAGCLICKED": "wanneer op %1 wordt geklikt", - "EVENT_WHENTHISSPRITECLICKED": "wanneer op deze sprite wordt geklikt", - "EVENT_WHENSTAGECLICKED": "wanneer op het speelveld wordt geklikt", - "EVENT_WHENTOUCHINGOBJECT": "wanneer deze sprite %1 raakt", - "EVENT_WHENBROADCASTRECEIVED": "wanneer ik signaal %1 ontvang", - "EVENT_WHENBACKDROPSWITCHESTO": "wanneer achtergrond verandert naar %1", - "EVENT_WHENGREATERTHAN": "wanneer %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "klok", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volume", - "EVENT_BROADCAST": "zend signaal %1", - "EVENT_BROADCASTANDWAIT": "zend signaal %1 en wacht", - "EVENT_WHENKEYPRESSED": "wanneer %1 is ingedrukt", - "EVENT_WHENKEYPRESSED_SPACE": "spatiebalk", - "EVENT_WHENKEYPRESSED_LEFT": "pijltje links", - "EVENT_WHENKEYPRESSED_RIGHT": "pijltje rechts", - "EVENT_WHENKEYPRESSED_DOWN": "pijltje omlaag", - "EVENT_WHENKEYPRESSED_UP": "pijltje omhoog", - "EVENT_WHENKEYPRESSED_ANY": "willekeurig", - "LOOKS_SAYFORSECS": "zeg %1 %2 sec.", - "LOOKS_SAY": "zeg %1", - "LOOKS_HELLO": "Hallo!", - "LOOKS_THINKFORSECS": "denk %1 %2 sec.", - "LOOKS_THINK": "denk %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "verschijn", - "LOOKS_HIDE": "verdwijn", - "LOOKS_HIDEALLSPRITES": "verberg alle sprites", - "LOOKS_EFFECT_COLOR": "kleur", - "LOOKS_EFFECT_FISHEYE": "vissenoog", - "LOOKS_EFFECT_WHIRL": "draaikolk", - "LOOKS_EFFECT_PIXELATE": "pixeleren", - "LOOKS_EFFECT_MOSAIC": "mozaïek", - "LOOKS_EFFECT_BRIGHTNESS": "helderheid", - "LOOKS_EFFECT_GHOST": "transparant", - "LOOKS_CHANGEEFFECTBY": "verander %1 effect met %2", - "LOOKS_SETEFFECTTO": "zet %1 effect op %2", - "LOOKS_CLEARGRAPHICEFFECTS": "zet alle effecten uit", - "LOOKS_CHANGESIZEBY": "verander grootte met %1", - "LOOKS_SETSIZETO": "maak grootte %1 %", - "LOOKS_SIZE": "grootte", - "LOOKS_CHANGESTRETCHBY": "verander stretch met %1", - "LOOKS_SETSTRETCHTO": "maak stretch %1 %", - "LOOKS_SWITCHCOSTUMETO": "verander uiterlijk naar %1", - "LOOKS_NEXTCOSTUME": "volgend uiterlijk", - "LOOKS_SWITCHBACKDROPTO": "verander achtergrond naar %1", - "LOOKS_GOTOFRONTBACK": "ga naar laag %1", - "LOOKS_GOTOFRONTBACK_FRONT": "voorgrond", - "LOOKS_GOTOFRONTBACK_BACK": "achtergrond", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ga %1 %2 lagen", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "naar voren", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "naar achteren", - "LOOKS_BACKDROPNUMBERNAME": "achtergrond %1", - "LOOKS_COSTUMENUMBERNAME": "uiterlijk %1", - "LOOKS_NUMBERNAME_NUMBER": "nummer", - "LOOKS_NUMBERNAME_NAME": "naam", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "verander achtergrond naar %1 en wacht", - "LOOKS_NEXTBACKDROP_BLOCK": "volgende achtergrond", - "LOOKS_NEXTBACKDROP": "volgende achtergrond", - "LOOKS_PREVIOUSBACKDROP": "vorige achtergrond", - "LOOKS_RANDOMBACKDROP": "willekeurige achtergrond", - "MOTION_MOVESTEPS": "neem %1 stappen", - "MOTION_TURNLEFT": "draai %1 %2 graden", - "MOTION_TURNRIGHT": "draai %1 %2 graden", - "MOTION_POINTINDIRECTION": "richt naar %1 graden", - "MOTION_POINTTOWARDS": "richt naar %1", - "MOTION_POINTTOWARDS_POINTER": "muisaanwijzer", - "MOTION_POINTTOWARDS_RANDOM": "willekeurige richting", - "MOTION_GOTO": "ga naar %1", - "MOTION_GOTO_POINTER": "muisaanwijzer", - "MOTION_GOTO_RANDOM": "willekeurige positie", - "MOTION_GOTOXY": "ga naar x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "schuif in %1 sec. naar x: %2 y: %3", - "MOTION_GLIDETO": "schuif in %1 sec. naar %2", - "MOTION_GLIDETO_POINTER": "muisaanwijzer", - "MOTION_GLIDETO_RANDOM": "willekeurige positie", - "MOTION_CHANGEXBY": "verander x met %1", - "MOTION_SETX": "maak x %1", - "MOTION_CHANGEYBY": "verander y met %1", - "MOTION_SETY": "maak y %1", - "MOTION_IFONEDGEBOUNCE": "keer om aan de rand", - "MOTION_SETROTATIONSTYLE": "maak draaistijl %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "links-rechts", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "niet draaien", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "helemaal rond", - "MOTION_XPOSITION": "x-positie", - "MOTION_YPOSITION": "y-positie", - "MOTION_DIRECTION": "richting", - "MOTION_SCROLLRIGHT": "rechts scrollen %1", - "MOTION_SCROLLUP": "omhoog scrollen %1", - "MOTION_ALIGNSCENE": "scène uitlijnen %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "linksonder", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "rechtsonder", - "MOTION_ALIGNSCENE_MIDDLE": "midden", - "MOTION_ALIGNSCENE_TOPLEFT": "linksboven", - "MOTION_ALIGNSCENE_TOPRIGHT": "rechtsboven", - "MOTION_XSCROLL": "x scroll", - "MOTION_YSCROLL": "y scroll", - "MOTION_STAGE_SELECTED": "Speelveld geselecteerd: geen bewegingsblokken", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "willekeurig getal tussen %1 en %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 en %2", - "OPERATORS_OR": "%1 of %2", - "OPERATORS_NOT": "niet %1", - "OPERATORS_JOIN": "voeg %1 en %2 samen", - "OPERATORS_JOIN_APPLE": "appel", - "OPERATORS_JOIN_BANANA": "banaan", - "OPERATORS_LETTEROF": "letter %1 van %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "lengte van %1", - "OPERATORS_CONTAINS": "%1 bevat %2?", - "OPERATORS_MOD": "%1 modulo %2", - "OPERATORS_ROUND": "afgerond %1", - "OPERATORS_MATHOP": "%1 van %2", - "OPERATORS_MATHOP_ABS": "absoluut", - "OPERATORS_MATHOP_FLOOR": "beneden", - "OPERATORS_MATHOP_CEILING": "boven", - "OPERATORS_MATHOP_SQRT": "wortel", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definieer %1", - "SENSING_TOUCHINGOBJECT": "raak ik %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "muisaanwijzer", - "SENSING_TOUCHINGOBJECT_EDGE": "rand", - "SENSING_TOUCHINGCOLOR": "raak ik kleur %1?", - "SENSING_COLORISTOUCHINGCOLOR": "raakt kleur %1 kleur %2?", - "SENSING_DISTANCETO": "afstand tot %1", - "SENSING_DISTANCETO_POINTER": "muisaanwijzer", - "SENSING_ASKANDWAIT": "vraag %1 en wacht", - "SENSING_ASK_TEXT": "Hoe heet je?", - "SENSING_ANSWER": "antwoord", - "SENSING_KEYPRESSED": "toets %1 ingedrukt?", - "SENSING_MOUSEDOWN": "muis ingedrukt?", - "SENSING_MOUSEX": "muis x", - "SENSING_MOUSEY": "muis y", - "SENSING_SETDRAGMODE": "zet sleepbaar op %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "sleepbaar", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "niet sleepbaar", - "SENSING_LOUDNESS": "volume", - "SENSING_LOUD": "luid?", - "SENSING_TIMER": "klok", - "SENSING_RESETTIMER": "zet klok op 0", - "SENSING_OF": "%1 van %2", - "SENSING_OF_XPOSITION": "x-positie", - "SENSING_OF_YPOSITION": "y-positie", - "SENSING_OF_DIRECTION": "richting", - "SENSING_OF_COSTUMENUMBER": "uiterlijk #", - "SENSING_OF_COSTUMENAME": "naam uiterlijk", - "SENSING_OF_SIZE": "grootte", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "achtergrond #", - "SENSING_OF_BACKDROPNAME": "achtergrond naam", - "SENSING_OF_STAGE": "Speelveld", - "SENSING_CURRENT": "huidige %1", - "SENSING_CURRENT_YEAR": "jaar", - "SENSING_CURRENT_MONTH": "maand", - "SENSING_CURRENT_DATE": "datum", - "SENSING_CURRENT_DAYOFWEEK": "dag van de week", - "SENSING_CURRENT_HOUR": "uur", - "SENSING_CURRENT_MINUTE": "minuut", - "SENSING_CURRENT_SECOND": "seconde", - "SENSING_DAYSSINCE2000": "dagen sinds 2000", - "SENSING_USERNAME": "gebruikersnaam", - "SENSING_USERID": "gebruiker id", - "SOUND_PLAY": "start geluid %1", - "SOUND_PLAYUNTILDONE": "start geluid %1 en wacht", - "SOUND_STOPALLSOUNDS": "stop alle geluiden", - "SOUND_SETEFFECTO": "zet effect %1 op %2", - "SOUND_CHANGEEFFECTBY": "verander %1-effect met %2", - "SOUND_CLEAREFFECTS": "zet alle effecten uit", - "SOUND_EFFECTS_PITCH": "toonhoogte", - "SOUND_EFFECTS_PAN": "kanaal links/rechts", - "SOUND_CHANGEVOLUMEBY": "verander volume met %1", - "SOUND_SETVOLUMETO": "zet volume op %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "opnemen...", - "CATEGORY_MOTION": "Beweging", - "CATEGORY_LOOKS": "Uiterlijken", - "CATEGORY_SOUND": "Geluid", - "CATEGORY_EVENTS": "Gebeurtenissen", - "CATEGORY_CONTROL": "Besturen", - "CATEGORY_SENSING": "Waarnemen", - "CATEGORY_OPERATORS": "Functies", - "CATEGORY_VARIABLES": "Variabelen", - "CATEGORY_MYBLOCKS": "Mijn blokken", - "DUPLICATE": "Kopie maken", - "DELETE": "Verwijderen", - "ADD_COMMENT": "Commentaar toevoegen", - "REMOVE_COMMENT": "Commentaar verwijderen", - "DELETE_BLOCK": "Blok verwijderen", - "DELETE_X_BLOCKS": "Verwijder %1 blokken", - "DELETE_ALL_BLOCKS": "Verwijder alle %1 blokken?", - "CLEAN_UP": "Blokken opruimen", - "HELP": "Help", - "UNDO": "Ongedaan maken", - "REDO": "Opnieuw", - "EDIT_PROCEDURE": "Bewerk", - "SHOW_PROCEDURE_DEFINITION": "Ga naar definitie", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Zeg iets...", - "COLOUR_HUE_LABEL": "Kleur", - "COLOUR_SATURATION_LABEL": "Verzadiging", - "COLOUR_BRIGHTNESS_LABEL": "Helderheid", - "CHANGE_VALUE_TITLE": "Verander waarde:", - "RENAME_VARIABLE": "Variabele hernoemen", - "RENAME_VARIABLE_TITLE": "Hernoem alle '%1' variabelen naar:", - "RENAME_VARIABLE_MODAL_TITLE": "Variabele hernoemen", - "NEW_VARIABLE": "Maak een variabele", - "NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:", - "VARIABLE_MODAL_TITLE": "Nieuwe variabele", - "VARIABLE_ALREADY_EXISTS": "Er bestaat al een variabele met de naam '%1'.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Er bestaat al een variabele met de naam '%1' voor een andere variabele van het type '%2'", - "DELETE_VARIABLE_CONFIRMATION": "Verwijder de %1 toepassingen van de variabele '%2'?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan de variabele '%1' niet verwijderen, omdat die deel uitmaakt van de definitie van de functie '%2'", - "DELETE_VARIABLE": "Verwijder de variabele '%1'", - "NEW_PROCEDURE": "Maak een blok", - "PROCEDURE_ALREADY_EXISTS": "Er bestaat al een procedure met de naam '%1'.", - "PROCEDURE_DEFAULT_NAME": "bloknaam", - "NEW_LIST": "Maak een lijst", - "NEW_LIST_TITLE": "Nieuwe lijstnaam:", - "LIST_MODAL_TITLE": "Nieuwe lijst", - "LIST_ALREADY_EXISTS": "Er bestaat al een lijst met de naam '%1'.", - "RENAME_LIST_TITLE": "Hernoem alle '%1' lijsten naar:", - "RENAME_LIST_MODAL_TITLE": "Lijst hernoemen", - "DEFAULT_LIST_ITEM": "ding", - "DELETE_LIST": "Verwijder de \"%1\" lijst", - "RENAME_LIST": "Hernoem lijst", - "NEW_BROADCAST_MESSAGE": "Nieuw bericht", - "NEW_BROADCAST_MESSAGE_TITLE": "Nieuwe berichtnaam:", - "BROADCAST_MODAL_TITLE": "Nieuw bericht", - "DEFAULT_BROADCAST_MESSAGE_NAME": "bericht1" -}; - -Blockly.ScratchMsgs.locales["ja"] = -{ - "CONTROL_FOREVER": "ずっと", - "CONTROL_REPEAT": "%1 回繰り返す", - "CONTROL_IF": "もし %1 なら", - "CONTROL_ELSE": "でなければ", - "CONTROL_STOP": " ", - "CONTROL_STOP_ALL": "すべてを止める", - "CONTROL_STOP_THIS": "このスクリプトを止める", - "CONTROL_STOP_OTHER": "スプライトの他のスクリプトを止める", - "CONTROL_WAIT": "%1 秒待つ", - "CONTROL_WAITUNTIL": "%1 まで待つ", - "CONTROL_REPEATUNTIL": "%1 まで繰り返す", - "CONTROL_WHILE": "%1 の間繰り返す", - "CONTROL_FOREACH": "%2 の要素を %1 に入れて繰り返す", - "CONTROL_STARTASCLONE": "クローンされたとき", - "CONTROL_CREATECLONEOF": "%1 のクローンを作る", - "CONTROL_CREATECLONEOF_MYSELF": "自分自身", - "CONTROL_DELETETHISCLONE": "このクローンを削除する", - "CONTROL_COUNTER": "カウンター", - "CONTROL_INCRCOUNTER": "カウンターに足す", - "CONTROL_CLEARCOUNTER": "カウンターをクリアする", - "CONTROL_ALLATONCE": "一斉に", - "DATA_SETVARIABLETO": "%1 を %2 にする", - "DATA_CHANGEVARIABLEBY": "%1 を %2 ずつ変える", - "DATA_SHOWVARIABLE": "変数 %1 を表示する", - "DATA_HIDEVARIABLE": "変数 %1 を隠す", - "DATA_ADDTOLIST": "%1 を %2 に追加する", - "DATA_DELETEOFLIST": "%2 の %1 番目を削除する", - "DATA_DELETEALLOFLIST": "%1のすべてを削除する", - "DATA_INSERTATLIST": "%3 の %2 番目に %1 を挿入する", - "DATA_REPLACEITEMOFLIST": "%2 の %1 番目を %3 で置き換える", - "DATA_ITEMOFLIST": "%2 の %1 番目", - "DATA_ITEMNUMOFLIST": "%2中の%1の場所", - "DATA_LENGTHOFLIST": "%1 の長さ", - "DATA_LISTCONTAINSITEM": "%1 に %2 が含まれる", - "DATA_SHOWLIST": "リスト %1 を表示する", - "DATA_HIDELIST": "リスト %1 を隠す", - "DATA_INDEX_ALL": "すべて", - "DATA_INDEX_LAST": "最後", - "DATA_INDEX_RANDOM": "乱数", - "EVENT_WHENFLAGCLICKED": "%1 が押されたとき", - "EVENT_WHENTHISSPRITECLICKED": "このスプライトが押されたとき", - "EVENT_WHENSTAGECLICKED": "ステージが押されたとき", - "EVENT_WHENTOUCHINGOBJECT": "このスプライトが %1 に触れたとき", - "EVENT_WHENBROADCASTRECEIVED": "%1 を受け取ったとき", - "EVENT_WHENBACKDROPSWITCHESTO": "背景が %1 になったとき", - "EVENT_WHENGREATERTHAN": "%1 > %2 のとき", - "EVENT_WHENGREATERTHAN_TIMER": "タイマー", - "EVENT_WHENGREATERTHAN_LOUDNESS": "音量", - "EVENT_BROADCAST": "%1 を送る", - "EVENT_BROADCASTANDWAIT": "%1 を送って待つ", - "EVENT_WHENKEYPRESSED": "%1 キーが押されたとき", - "EVENT_WHENKEYPRESSED_SPACE": "スペース", - "EVENT_WHENKEYPRESSED_LEFT": "左向き矢印", - "EVENT_WHENKEYPRESSED_RIGHT": "右向き矢印", - "EVENT_WHENKEYPRESSED_DOWN": "下向き矢印", - "EVENT_WHENKEYPRESSED_UP": "上向き矢印", - "EVENT_WHENKEYPRESSED_ANY": "どれかの", - "LOOKS_SAYFORSECS": "%1 と %2 秒言う", - "LOOKS_SAY": "%1 と言う", - "LOOKS_HELLO": "こんにちは!", - "LOOKS_THINKFORSECS": "%1 と %2 秒考える", - "LOOKS_THINK": "%1 と考える", - "LOOKS_HMM": "うーん...", - "LOOKS_SHOW": "表示する", - "LOOKS_HIDE": "隠す", - "LOOKS_HIDEALLSPRITES": "すべてのスプライトを隠す", - "LOOKS_EFFECT_COLOR": "色", - "LOOKS_EFFECT_FISHEYE": "魚眼レンズ", - "LOOKS_EFFECT_WHIRL": "渦巻き", - "LOOKS_EFFECT_PIXELATE": "ピクセル化", - "LOOKS_EFFECT_MOSAIC": "モザイク", - "LOOKS_EFFECT_BRIGHTNESS": "明るさ", - "LOOKS_EFFECT_GHOST": "幽霊", - "LOOKS_CHANGEEFFECTBY": "%1 の効果を %2 ずつ変える", - "LOOKS_SETEFFECTTO": "%1 の効果を %2 にする", - "LOOKS_CLEARGRAPHICEFFECTS": "画像効果をなくす", - "LOOKS_CHANGESIZEBY": "大きさを %1 ずつ変える", - "LOOKS_SETSIZETO": "大きさを %1 %にする", - "LOOKS_SIZE": "大きさ", - "LOOKS_CHANGESTRETCHBY": "伸びを %1 ずつ変える", - "LOOKS_SETSTRETCHTO": "伸びを %1 %にする", - "LOOKS_SWITCHCOSTUMETO": "コスチュームを %1 にする", - "LOOKS_NEXTCOSTUME": "次のコスチュームにする", - "LOOKS_SWITCHBACKDROPTO": "背景を %1 にする", - "LOOKS_GOTOFRONTBACK": "%1 へ移動する", - "LOOKS_GOTOFRONTBACK_FRONT": "最前面", - "LOOKS_GOTOFRONTBACK_BACK": "最背面", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%2 層 %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "手前に出す", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "奥に下げる", - "LOOKS_BACKDROPNUMBERNAME": "背景の %1", - "LOOKS_COSTUMENUMBERNAME": "コスチュームの %1", - "LOOKS_NUMBERNAME_NUMBER": "番号", - "LOOKS_NUMBERNAME_NAME": "名前", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "背景を %1 にして待つ", - "LOOKS_NEXTBACKDROP_BLOCK": "次の背景にする", - "LOOKS_NEXTBACKDROP": "次の背景", - "LOOKS_PREVIOUSBACKDROP": "前の背景", - "LOOKS_RANDOMBACKDROP": "どれかの背景", - "MOTION_MOVESTEPS": "%1 歩動かす", - "MOTION_TURNLEFT": "%1 %2 度回す", - "MOTION_TURNRIGHT": "%1 %2 度回す", - "MOTION_POINTINDIRECTION": "%1 度に向ける", - "MOTION_POINTTOWARDS": "%1 へ向ける", - "MOTION_POINTTOWARDS_POINTER": "マウスのポインター", - "MOTION_POINTTOWARDS_RANDOM": "どれかの向き", - "MOTION_GOTO": "%1 へ行く", - "MOTION_GOTO_POINTER": "マウスのポインター", - "MOTION_GOTO_RANDOM": "どこかの場所", - "MOTION_GOTOXY": "x座標を %1 、y座標を %2 にする", - "MOTION_GLIDESECSTOXY": "%1 秒でx座標を %2 に、y座標を %3 に変える", - "MOTION_GLIDETO": "%1 秒で %2 へ行く", - "MOTION_GLIDETO_POINTER": "マウスのポインター", - "MOTION_GLIDETO_RANDOM": "どこかの場所", - "MOTION_CHANGEXBY": "x座標を %1 ずつ変える", - "MOTION_SETX": "x座標を %1 にする", - "MOTION_CHANGEYBY": "y座標を %1 ずつ変える", - "MOTION_SETY": "y座標を %1 にする", - "MOTION_IFONEDGEBOUNCE": "もし端に着いたら、跳ね返る", - "MOTION_SETROTATIONSTYLE": "回転方法を %1 にする", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "左右のみ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "回転しない", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "自由に回転", - "MOTION_XPOSITION": "x座標", - "MOTION_YPOSITION": "y座標", - "MOTION_DIRECTION": "向き", - "MOTION_SCROLLRIGHT": "右に %1 スクロールする", - "MOTION_SCROLLUP": "上に %1 スクロールする", - "MOTION_ALIGNSCENE": "スクロール位置を %1 にする", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "左下", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "右下", - "MOTION_ALIGNSCENE_MIDDLE": "中央", - "MOTION_ALIGNSCENE_TOPLEFT": "左上", - "MOTION_ALIGNSCENE_TOPRIGHT": "右上", - "MOTION_XSCROLL": "x方向のスクロール量", - "MOTION_YSCROLL": "y方向のスクロール方向", - "MOTION_STAGE_SELECTED": "ステージが選択されました: 動きブロックはありません", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 から %2 までの乱数", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 かつ %2", - "OPERATORS_OR": "%1 または %2", - "OPERATORS_NOT": "%1 ではない", - "OPERATORS_JOIN": "%1 と %2", - "OPERATORS_JOIN_APPLE": "りんご", - "OPERATORS_JOIN_BANANA": "バナナ", - "OPERATORS_LETTEROF": "%2 の %1 番目の文字", - "OPERATORS_LETTEROF_APPLE": "り", - "OPERATORS_LENGTH": "%1 の長さ", - "OPERATORS_CONTAINS": "%1 に %2 が含まれる", - "OPERATORS_MOD": "%1 を %2 で割った余り", - "OPERATORS_ROUND": "%1 を四捨五入", - "OPERATORS_MATHOP": "%2 の %1", - "OPERATORS_MATHOP_ABS": "絶対値", - "OPERATORS_MATHOP_FLOOR": "切り下げ", - "OPERATORS_MATHOP_CEILING": "切り上げ", - "OPERATORS_MATHOP_SQRT": "平方根", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "定義 %1", - "SENSING_TOUCHINGOBJECT": "%1 に触れた", - "SENSING_TOUCHINGOBJECT_POINTER": "マウスのポインター", - "SENSING_TOUCHINGOBJECT_EDGE": "端", - "SENSING_TOUCHINGCOLOR": "%1 色に触れた", - "SENSING_COLORISTOUCHINGCOLOR": "%1 色が %2 色に触れた", - "SENSING_DISTANCETO": "%1 までの距離", - "SENSING_DISTANCETO_POINTER": "マウスのポインター", - "SENSING_ASKANDWAIT": "%1 と聞いて待つ", - "SENSING_ASK_TEXT": "あなたの名前は何ですか?", - "SENSING_ANSWER": "答え", - "SENSING_KEYPRESSED": "%1 キーが押された", - "SENSING_MOUSEDOWN": "マウスが押された", - "SENSING_MOUSEX": "マウスのx座標", - "SENSING_MOUSEY": "マウスのy座標", - "SENSING_SETDRAGMODE": "ドラッグ %1 ようにする", - "SENSING_SETDRAGMODE_DRAGGABLE": "できる", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "できない", - "SENSING_LOUDNESS": "音量", - "SENSING_LOUD": "うるさい", - "SENSING_TIMER": "タイマー", - "SENSING_RESETTIMER": "タイマーをリセット", - "SENSING_OF": "%2 の %1", - "SENSING_OF_XPOSITION": "x座標", - "SENSING_OF_YPOSITION": "y座標", - "SENSING_OF_DIRECTION": "向き", - "SENSING_OF_COSTUMENUMBER": "コスチューム #", - "SENSING_OF_COSTUMENAME": "コスチューム名", - "SENSING_OF_SIZE": "大きさ", - "SENSING_OF_VOLUME": "音量", - "SENSING_OF_BACKDROPNUMBER": "背景 #", - "SENSING_OF_BACKDROPNAME": "背景の名前", - "SENSING_OF_STAGE": "ステージ", - "SENSING_CURRENT": "現在の %1", - "SENSING_CURRENT_YEAR": "年", - "SENSING_CURRENT_MONTH": "月", - "SENSING_CURRENT_DATE": "日", - "SENSING_CURRENT_DAYOFWEEK": "曜日", - "SENSING_CURRENT_HOUR": "時", - "SENSING_CURRENT_MINUTE": "分", - "SENSING_CURRENT_SECOND": "秒", - "SENSING_DAYSSINCE2000": "2000年からの日数", - "SENSING_USERNAME": "ユーザー名", - "SENSING_USERID": "ユーザーID", - "SOUND_PLAY": "%1 の音を鳴らす", - "SOUND_PLAYUNTILDONE": "終わるまで %1 の音を鳴らす", - "SOUND_STOPALLSOUNDS": "すべての音を止める", - "SOUND_SETEFFECTO": "%1 の効果を %2 にする", - "SOUND_CHANGEEFFECTBY": "%1 の効果を %2 ずつ変える", - "SOUND_CLEAREFFECTS": "音の効果をなくす", - "SOUND_EFFECTS_PITCH": "ピッチ", - "SOUND_EFFECTS_PAN": "左右にパン", - "SOUND_CHANGEVOLUMEBY": "音量を %1 ずつ変える", - "SOUND_SETVOLUMETO": "音量を %1 %にする", - "SOUND_VOLUME": "音量", - "SOUND_RECORD": "録音...", - "CATEGORY_MOTION": "動き", - "CATEGORY_LOOKS": "見た目", - "CATEGORY_SOUND": "音", - "CATEGORY_EVENTS": "イベント", - "CATEGORY_CONTROL": "制御", - "CATEGORY_SENSING": "調べる", - "CATEGORY_OPERATORS": "演算", - "CATEGORY_VARIABLES": "変数", - "CATEGORY_MYBLOCKS": "ブロック定義", - "DUPLICATE": "複製", - "DELETE": "削除", - "ADD_COMMENT": "コメントを追加", - "REMOVE_COMMENT": "コメントを削除", - "DELETE_BLOCK": "ブロックを削除", - "DELETE_X_BLOCKS": "%1 個のブロックを削除", - "DELETE_ALL_BLOCKS": "%1 個のブロックをすべて削除しますか?", - "CLEAN_UP": "きれいにする", - "HELP": "ヘルプ", - "UNDO": "取り消し", - "REDO": "やり直し", - "EDIT_PROCEDURE": "編集", - "SHOW_PROCEDURE_DEFINITION": "定義へ行く", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "コメントを書く...", - "COLOUR_HUE_LABEL": "色", - "COLOUR_SATURATION_LABEL": "鮮やかさ", - "COLOUR_BRIGHTNESS_LABEL": "明るさ", - "CHANGE_VALUE_TITLE": "値を変える:", - "RENAME_VARIABLE": "変数名を変更", - "RENAME_VARIABLE_TITLE": "変数\"%1\"をすべて以下の名前に変える:", - "RENAME_VARIABLE_MODAL_TITLE": "変数名を変更", - "NEW_VARIABLE": "変数を作る", - "NEW_VARIABLE_TITLE": "新しい変数名:", - "VARIABLE_MODAL_TITLE": "新しい変数", - "VARIABLE_ALREADY_EXISTS": "変数\"%1\"はすでに存在します。", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "変数\"%1\"は\"%2\"型の変数としてすでに存在します。", - "DELETE_VARIABLE_CONFIRMATION": "変数\"%2\"が使われている\"%1\"箇所も削除しますか?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "変数\"%1\"は定義\"%2\"で使われているため削除できません", - "DELETE_VARIABLE": "変数\"%1\"を削除", - "NEW_PROCEDURE": "ブロックを作る", - "PROCEDURE_ALREADY_EXISTS": "定義\"%1\"はすでに存在します。", - "PROCEDURE_DEFAULT_NAME": "ブロック名", - "NEW_LIST": "リストを作る", - "NEW_LIST_TITLE": "新しいリスト名:", - "LIST_MODAL_TITLE": "新しいリスト", - "LIST_ALREADY_EXISTS": "リスト\"%1\"はすでに存在します。", - "RENAME_LIST_TITLE": "リスト\"%1\"をすべて以下の名前に変える:", - "RENAME_LIST_MODAL_TITLE": "リスト名を変更", - "DEFAULT_LIST_ITEM": "なにか", - "DELETE_LIST": "リスト「%1」を削除する", - "RENAME_LIST": "リスト名を変更", - "NEW_BROADCAST_MESSAGE": "新しいメッセージ", - "NEW_BROADCAST_MESSAGE_TITLE": "新しいメッセージ名:", - "BROADCAST_MODAL_TITLE": "新しいメッセージ", - "DEFAULT_BROADCAST_MESSAGE_NAME": "メッセージ1" -}; - -Blockly.ScratchMsgs.locales["ja-Hira"] = -{ - "CONTROL_FOREVER": "ずっと", - "CONTROL_REPEAT": "%1 かいくりかえす", - "CONTROL_IF": "もし %1 なら", - "CONTROL_ELSE": "でなければ", - "CONTROL_STOP": " ", - "CONTROL_STOP_ALL": "すべてをとめる", - "CONTROL_STOP_THIS": "このスクリプトをとめる", - "CONTROL_STOP_OTHER": "スプライトのほかのスクリプトをとめる", - "CONTROL_WAIT": "%1 びょうまつ", - "CONTROL_WAITUNTIL": "%1 までまつ", - "CONTROL_REPEATUNTIL": "%1 までくりかえす", - "CONTROL_WHILE": "%1 のあいだくりかえす", - "CONTROL_FOREACH": "%2 のようそを %1 にいれてくりかえす", - "CONTROL_STARTASCLONE": "クローンされたとき", - "CONTROL_CREATECLONEOF": "%1 のクローンをつくる", - "CONTROL_CREATECLONEOF_MYSELF": "じぶんじしん", - "CONTROL_DELETETHISCLONE": "このクローンをさくじょする", - "CONTROL_COUNTER": "カウンター", - "CONTROL_INCRCOUNTER": "カウンターにたす", - "CONTROL_CLEARCOUNTER": "カウンターをクリアする", - "CONTROL_ALLATONCE": "いっせいに", - "DATA_SETVARIABLETO": "%1 を %2 にする", - "DATA_CHANGEVARIABLEBY": "%1 を %2 ずつかえる", - "DATA_SHOWVARIABLE": "へんすう %1 をひょうじする", - "DATA_HIDEVARIABLE": "へんすう %1 をかくす", - "DATA_ADDTOLIST": "%1 を %2 についかする", - "DATA_DELETEOFLIST": "%2 の %1 ばんめをさくじょする", - "DATA_DELETEALLOFLIST": "%1のすべてをさくじょする", - "DATA_INSERTATLIST": "%3 の %2 ばんめに %1 をそうにゅうする", - "DATA_REPLACEITEMOFLIST": "%2 の %1 ばんめを %3 でおきかえる", - "DATA_ITEMOFLIST": "%2 の %1 ばんめ", - "DATA_ITEMNUMOFLIST": "%2なかの%1のばしょ", - "DATA_LENGTHOFLIST": "%1 のながさ", - "DATA_LISTCONTAINSITEM": "%1 に %2 がふくまれる", - "DATA_SHOWLIST": "リスト %1 をひょうじする", - "DATA_HIDELIST": "リスト %1 をかくす", - "DATA_INDEX_ALL": "すべて", - "DATA_INDEX_LAST": "さいご", - "DATA_INDEX_RANDOM": "らんすう", - "EVENT_WHENFLAGCLICKED": "%1 がおされたとき", - "EVENT_WHENTHISSPRITECLICKED": "このスプライトがおされたとき", - "EVENT_WHENSTAGECLICKED": "ステージがおされたとき", - "EVENT_WHENTOUCHINGOBJECT": "このスプライトが %1 にふれたとき", - "EVENT_WHENBROADCASTRECEIVED": "%1 をうけとったとき", - "EVENT_WHENBACKDROPSWITCHESTO": "はいけいが %1 になったとき", - "EVENT_WHENGREATERTHAN": "%1 > %2 のとき", - "EVENT_WHENGREATERTHAN_TIMER": "タイマー", - "EVENT_WHENGREATERTHAN_LOUDNESS": "おんりょう", - "EVENT_BROADCAST": "%1 をおくる", - "EVENT_BROADCASTANDWAIT": "%1 をおくってまつ", - "EVENT_WHENKEYPRESSED": "%1 キーがおされたとき", - "EVENT_WHENKEYPRESSED_SPACE": "スペース", - "EVENT_WHENKEYPRESSED_LEFT": "ひだりむきやじるし", - "EVENT_WHENKEYPRESSED_RIGHT": "みぎむきやじるし", - "EVENT_WHENKEYPRESSED_DOWN": "したむきやじるし", - "EVENT_WHENKEYPRESSED_UP": "うわむきやじるし", - "EVENT_WHENKEYPRESSED_ANY": "どれかの", - "LOOKS_SAYFORSECS": "%1 と %2 びょういう", - "LOOKS_SAY": "%1 という", - "LOOKS_HELLO": "こんにちは!", - "LOOKS_THINKFORSECS": "%1 と %2 びょうかんがえる", - "LOOKS_THINK": "%1 とかんがえる", - "LOOKS_HMM": "うーん...", - "LOOKS_SHOW": "ひょうじする", - "LOOKS_HIDE": "かくす", - "LOOKS_HIDEALLSPRITES": "すべてのスプライトをかくす", - "LOOKS_EFFECT_COLOR": "いろ", - "LOOKS_EFFECT_FISHEYE": "ぎょがんレンズ", - "LOOKS_EFFECT_WHIRL": "うずまき", - "LOOKS_EFFECT_PIXELATE": "ピクセルか", - "LOOKS_EFFECT_MOSAIC": "モザイク", - "LOOKS_EFFECT_BRIGHTNESS": "あかるさ", - "LOOKS_EFFECT_GHOST": "ゆうれい", - "LOOKS_CHANGEEFFECTBY": "%1 のこうかを %2 ずつかえる", - "LOOKS_SETEFFECTTO": "%1 のこうかを %2 にする", - "LOOKS_CLEARGRAPHICEFFECTS": "がぞうこうかをなくす", - "LOOKS_CHANGESIZEBY": "おおきさを %1 ずつかえる", - "LOOKS_SETSIZETO": "おおきさを %1 %にする", - "LOOKS_SIZE": "おおきさ", - "LOOKS_CHANGESTRETCHBY": "のびを %1 ずつかえる", - "LOOKS_SETSTRETCHTO": "のびを %1 %にする", - "LOOKS_SWITCHCOSTUMETO": "コスチュームを %1 にする", - "LOOKS_NEXTCOSTUME": "つぎのコスチュームにする", - "LOOKS_SWITCHBACKDROPTO": "はいけいを %1 にする", - "LOOKS_GOTOFRONTBACK": "%1 へいどうする", - "LOOKS_GOTOFRONTBACK_FRONT": "さいぜんめん", - "LOOKS_GOTOFRONTBACK_BACK": "さいはいめん", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%2 そう %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "てまえにだす", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "おくにさげる", - "LOOKS_BACKDROPNUMBERNAME": "はいけいの %1", - "LOOKS_COSTUMENUMBERNAME": "コスチュームの %1", - "LOOKS_NUMBERNAME_NUMBER": "ばんごう", - "LOOKS_NUMBERNAME_NAME": "なまえ", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "はいけいを %1 にしてまつ", - "LOOKS_NEXTBACKDROP_BLOCK": "つぎのはいけいにする", - "LOOKS_NEXTBACKDROP": "つぎのはいけい", - "LOOKS_PREVIOUSBACKDROP": "まえのはいけい", - "LOOKS_RANDOMBACKDROP": "どれかのはいけい", - "MOTION_MOVESTEPS": "%1 ほうごかす", - "MOTION_TURNLEFT": "%1 %2 どまわす", - "MOTION_TURNRIGHT": "%1 %2 どまわす", - "MOTION_POINTINDIRECTION": "%1 どにむける", - "MOTION_POINTTOWARDS": "%1 へむける", - "MOTION_POINTTOWARDS_POINTER": "マウスのポインター", - "MOTION_POINTTOWARDS_RANDOM": "どれかのむき", - "MOTION_GOTO": "%1 へいく", - "MOTION_GOTO_POINTER": "マウスのポインター", - "MOTION_GOTO_RANDOM": "どこかのばしょ", - "MOTION_GOTOXY": "xざひょうを %1 、yざひょうを %2 にする", - "MOTION_GLIDESECSTOXY": "%1 びょうでxざひょうを %2 に、yざひょうを %3 にかえる", - "MOTION_GLIDETO": "%1 びょうで %2 へいく", - "MOTION_GLIDETO_POINTER": "マウスのポインター", - "MOTION_GLIDETO_RANDOM": "どこかのばしょ", - "MOTION_CHANGEXBY": "xざひょうを %1 ずつかえる", - "MOTION_SETX": "xざひょうを %1 にする", - "MOTION_CHANGEYBY": "yざひょうを %1 ずつかえる", - "MOTION_SETY": "yざひょうを %1 にする", - "MOTION_IFONEDGEBOUNCE": "もしはしについたら、はねかえる", - "MOTION_SETROTATIONSTYLE": "かいてんほうほうを %1 にする", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "さゆうのみ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "かいてんしない", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "じゆうにかいてん", - "MOTION_XPOSITION": "xざひょう", - "MOTION_YPOSITION": "yざひょう", - "MOTION_DIRECTION": "むき", - "MOTION_SCROLLRIGHT": "みぎに %1 スクロールする", - "MOTION_SCROLLUP": "うえに %1 スクロールする", - "MOTION_ALIGNSCENE": "スクロールいちを %1 にする", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ひだりした", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "みぎした", - "MOTION_ALIGNSCENE_MIDDLE": "ちゅうおう", - "MOTION_ALIGNSCENE_TOPLEFT": "ひだりうえ", - "MOTION_ALIGNSCENE_TOPRIGHT": "みぎうえ", - "MOTION_XSCROLL": "xほうこうのスクロールりょう", - "MOTION_YSCROLL": "yほうこうのスクロールほうこう", - "MOTION_STAGE_SELECTED": "ステージがせんたくされました: うごきブロックはありません", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 から %2 までのらんすう", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 かつ %2", - "OPERATORS_OR": "%1 または %2", - "OPERATORS_NOT": "%1 ではない", - "OPERATORS_JOIN": "%1 と %2", - "OPERATORS_JOIN_APPLE": "りんご", - "OPERATORS_JOIN_BANANA": "バナナ", - "OPERATORS_LETTEROF": "%2 の %1 ばんめのもじ", - "OPERATORS_LETTEROF_APPLE": "り", - "OPERATORS_LENGTH": "%1 のながさ", - "OPERATORS_CONTAINS": "%1 に %2 がふくまれる", - "OPERATORS_MOD": "%1 を %2 でわったあまり", - "OPERATORS_ROUND": "%1 をししゃごにゅう", - "OPERATORS_MATHOP": "%2 の %1", - "OPERATORS_MATHOP_ABS": "ぜったいち", - "OPERATORS_MATHOP_FLOOR": "きりさげ", - "OPERATORS_MATHOP_CEILING": "きりあげ", - "OPERATORS_MATHOP_SQRT": "へいほうこん", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "ていぎ %1", - "SENSING_TOUCHINGOBJECT": "%1 にふれた", - "SENSING_TOUCHINGOBJECT_POINTER": "マウスのポインター", - "SENSING_TOUCHINGOBJECT_EDGE": "はし", - "SENSING_TOUCHINGCOLOR": "%1 いろにふれた", - "SENSING_COLORISTOUCHINGCOLOR": "%1 いろが %2 いろにふれた", - "SENSING_DISTANCETO": "%1 までのきょり", - "SENSING_DISTANCETO_POINTER": "マウスのポインター", - "SENSING_ASKANDWAIT": "%1 ときいてまつ", - "SENSING_ASK_TEXT": "あなたのなまえはなんですか?", - "SENSING_ANSWER": "こたえ", - "SENSING_KEYPRESSED": "%1 キーがおされた", - "SENSING_MOUSEDOWN": "マウスがおされた", - "SENSING_MOUSEX": "マウスのxざひょう", - "SENSING_MOUSEY": "マウスのyざひょう", - "SENSING_SETDRAGMODE": "ドラッグ %1 ようにする", - "SENSING_SETDRAGMODE_DRAGGABLE": "できる", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "できない", - "SENSING_LOUDNESS": "おんりょう", - "SENSING_LOUD": "うるさい", - "SENSING_TIMER": "タイマー", - "SENSING_RESETTIMER": "タイマーをリセット", - "SENSING_OF": "%2 の %1", - "SENSING_OF_XPOSITION": "xざひょう", - "SENSING_OF_YPOSITION": "yざひょう", - "SENSING_OF_DIRECTION": "むき", - "SENSING_OF_COSTUMENUMBER": "コスチューム #", - "SENSING_OF_COSTUMENAME": "コスチュームめい", - "SENSING_OF_SIZE": "おおきさ", - "SENSING_OF_VOLUME": "おんりょう", - "SENSING_OF_BACKDROPNUMBER": "はいけい #", - "SENSING_OF_BACKDROPNAME": "はいけいのなまえ", - "SENSING_OF_STAGE": "ステージ", - "SENSING_CURRENT": "げんざいの %1", - "SENSING_CURRENT_YEAR": "とし", - "SENSING_CURRENT_MONTH": "つき", - "SENSING_CURRENT_DATE": "ひ", - "SENSING_CURRENT_DAYOFWEEK": "ようび", - "SENSING_CURRENT_HOUR": "とき", - "SENSING_CURRENT_MINUTE": "ぶん", - "SENSING_CURRENT_SECOND": "びょう", - "SENSING_DAYSSINCE2000": "2000ねんからのにっすう", - "SENSING_USERNAME": "ユーザーめい", - "SENSING_USERID": "ユーザーID", - "SOUND_PLAY": "%1 のおとをならす", - "SOUND_PLAYUNTILDONE": "おわるまで %1 のおとをならす", - "SOUND_STOPALLSOUNDS": "すべてのおとをとめる", - "SOUND_SETEFFECTO": "%1 のこうかを %2 にする", - "SOUND_CHANGEEFFECTBY": "%1 のこうかを %2 ずつかえる", - "SOUND_CLEAREFFECTS": "おとのこうかをなくす", - "SOUND_EFFECTS_PITCH": "ピッチ", - "SOUND_EFFECTS_PAN": "さゆうにパン", - "SOUND_CHANGEVOLUMEBY": "おんりょうを %1 ずつかえる", - "SOUND_SETVOLUMETO": "おんりょうを %1 %にする", - "SOUND_VOLUME": "おんりょう", - "SOUND_RECORD": "ろくおん...", - "CATEGORY_MOTION": "うごき", - "CATEGORY_LOOKS": "みため", - "CATEGORY_SOUND": "おと", - "CATEGORY_EVENTS": "イベント", - "CATEGORY_CONTROL": "せいぎょ", - "CATEGORY_SENSING": "しらべる", - "CATEGORY_OPERATORS": "えんざん", - "CATEGORY_VARIABLES": "へんすう", - "CATEGORY_MYBLOCKS": "ブロックていぎ", - "DUPLICATE": "ふくせい", - "DELETE": "さくじょ", - "ADD_COMMENT": "コメントをついか", - "REMOVE_COMMENT": "コメントをさくじょ", - "DELETE_BLOCK": "ブロックをさくじょ", - "DELETE_X_BLOCKS": "%1 このブロックをさくじょ", - "DELETE_ALL_BLOCKS": "%1 このブロックをすべてさくじょしますか?", - "CLEAN_UP": "きれいにする", - "HELP": "ヘルプ", - "UNDO": "とりけし", - "REDO": "やりなおし", - "EDIT_PROCEDURE": "へんしゅう", - "SHOW_PROCEDURE_DEFINITION": "ていぎへいく", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "コメントをかく...", - "COLOUR_HUE_LABEL": "いろ", - "COLOUR_SATURATION_LABEL": "あざやかさ", - "COLOUR_BRIGHTNESS_LABEL": "あかるさ", - "CHANGE_VALUE_TITLE": "あたいをかえる:", - "RENAME_VARIABLE": "へんすうめいをへんこう", - "RENAME_VARIABLE_TITLE": "へんすう\"%1\"をすべていかのなまえにかえる:", - "RENAME_VARIABLE_MODAL_TITLE": "へんすうめいをへんこう", - "NEW_VARIABLE": "へんすうをつくる", - "NEW_VARIABLE_TITLE": "あたらしいへんすうめい:", - "VARIABLE_MODAL_TITLE": "あたらしいへんすう", - "VARIABLE_ALREADY_EXISTS": "へんすう\"%1\"はすでにそんざいします。", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "へんすう\"%1\"は\"%2\"かたのへんすうとしてすでにそんざいします。", - "DELETE_VARIABLE_CONFIRMATION": "へんすう\"%2\"がつかわれている\"%1\"かしょもさくじょしますか?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "へんすう\"%1\"はていぎ\"%2\"でつかわれているためさくじょできません", - "DELETE_VARIABLE": "へんすう\"%1\"をさくじょ", - "NEW_PROCEDURE": "ブロックをつくる", - "PROCEDURE_ALREADY_EXISTS": "ていぎ\"%1\"はすでにそんざいします。", - "PROCEDURE_DEFAULT_NAME": "ブロックめい", - "NEW_LIST": "リストをつくる", - "NEW_LIST_TITLE": "あたらしいリストめい:", - "LIST_MODAL_TITLE": "あたらしいリスト", - "LIST_ALREADY_EXISTS": "リスト\"%1\"はすでにそんざいします。", - "RENAME_LIST_TITLE": "リスト\"%1\"をすべていかのなまえにかえる:", - "RENAME_LIST_MODAL_TITLE": "リストめいをへんこう", - "DEFAULT_LIST_ITEM": "なにか", - "DELETE_LIST": "リスト「%1」をさくじょする", - "RENAME_LIST": "リストめいをへんこう", - "NEW_BROADCAST_MESSAGE": "あたらしいメッセージ", - "NEW_BROADCAST_MESSAGE_TITLE": "あたらしいメッセージめい:", - "BROADCAST_MODAL_TITLE": "あたらしいメッセージ", - "DEFAULT_BROADCAST_MESSAGE_NAME": "メッセージ1" -}; - -Blockly.ScratchMsgs.locales["nb"] = -{ - "CONTROL_FOREVER": "gjenta for alltid", - "CONTROL_REPEAT": "gjenta %1 ganger", - "CONTROL_IF": "hvis %1", - "CONTROL_ELSE": "ellers", - "CONTROL_STOP": "stopp", - "CONTROL_STOP_ALL": "alle", - "CONTROL_STOP_THIS": "dette skriptet", - "CONTROL_STOP_OTHER": "andre skript i figuren", - "CONTROL_WAIT": "vent %1 sekunder", - "CONTROL_WAITUNTIL": "vent til %1", - "CONTROL_REPEATUNTIL": "gjenta til %1", - "CONTROL_WHILE": "gjenta hvis %1", - "CONTROL_FOREACH": "for hver %1 i %2", - "CONTROL_STARTASCLONE": "når jeg starter som klon", - "CONTROL_CREATECLONEOF": "lag klon av %1", - "CONTROL_CREATECLONEOF_MYSELF": "meg", - "CONTROL_DELETETHISCLONE": "slett denne klonen", - "CONTROL_COUNTER": "teller", - "CONTROL_INCRCOUNTER": "tell opp med 1", - "CONTROL_CLEARCOUNTER": "nullstill telleren", - "CONTROL_ALLATONCE": "kjør fort", - "DATA_SETVARIABLETO": "sett %1 til %2", - "DATA_CHANGEVARIABLEBY": "endre %1 med %2", - "DATA_SHOWVARIABLE": "vis variabel %1", - "DATA_HIDEVARIABLE": "skjul variabel %1", - "DATA_ADDTOLIST": "legg til %1 i %2", - "DATA_DELETEOFLIST": "slett element %1 i %2", - "DATA_DELETEALLOFLIST": "slett alt i %1", - "DATA_INSERTATLIST": "sett inn %1 på plass %2 i %3", - "DATA_REPLACEITEMOFLIST": "erstatt element %1 i %2 med %3", - "DATA_ITEMOFLIST": "element %1 i %2", - "DATA_ITEMNUMOFLIST": "posisjon av %1 i %2", - "DATA_LENGTHOFLIST": "lengden av %1", - "DATA_LISTCONTAINSITEM": "%1 inneholder %2?", - "DATA_SHOWLIST": "vis liste %1", - "DATA_HIDELIST": "skjul liste %1", - "DATA_INDEX_ALL": "alle", - "DATA_INDEX_LAST": "siste", - "DATA_INDEX_RANDOM": "tilfeldig", - "EVENT_WHENFLAGCLICKED": "når %1 klikkes", - "EVENT_WHENTHISSPRITECLICKED": "når denne figuren klikkes", - "EVENT_WHENSTAGECLICKED": "når scenen klikkes", - "EVENT_WHENTOUCHINGOBJECT": "når denne figuren berører %1", - "EVENT_WHENBROADCASTRECEIVED": "når jeg mottar %1", - "EVENT_WHENBACKDROPSWITCHESTO": "når bakgrunn bytter til %1", - "EVENT_WHENGREATERTHAN": "når %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "sekundklokke", - "EVENT_WHENGREATERTHAN_LOUDNESS": "lydnivå", - "EVENT_BROADCAST": "send melding %1", - "EVENT_BROADCASTANDWAIT": "send melding %1 og vent", - "EVENT_WHENKEYPRESSED": "når %1 trykkes", - "EVENT_WHENKEYPRESSED_SPACE": "mellomrom", - "EVENT_WHENKEYPRESSED_LEFT": "pil venstre", - "EVENT_WHENKEYPRESSED_RIGHT": "pil høyre", - "EVENT_WHENKEYPRESSED_DOWN": "pil ned", - "EVENT_WHENKEYPRESSED_UP": "pil opp", - "EVENT_WHENKEYPRESSED_ANY": "hvilken som helst", - "LOOKS_SAYFORSECS": "si %1 i %2 sekunder", - "LOOKS_SAY": "si %1", - "LOOKS_HELLO": "Hei!", - "LOOKS_THINKFORSECS": "tenk %1 i %2 sekunder", - "LOOKS_THINK": "tenk %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "vis", - "LOOKS_HIDE": "skjul", - "LOOKS_HIDEALLSPRITES": "skjul alle figurer", - "LOOKS_EFFECT_COLOR": "farge", - "LOOKS_EFFECT_FISHEYE": "fiskeøye", - "LOOKS_EFFECT_WHIRL": "virvel", - "LOOKS_EFFECT_PIXELATE": "piksel", - "LOOKS_EFFECT_MOSAIC": "mosaikk", - "LOOKS_EFFECT_BRIGHTNESS": "lysstyrke", - "LOOKS_EFFECT_GHOST": "gjennomsiktig", - "LOOKS_CHANGEEFFECTBY": "endre %1 effekt med %2", - "LOOKS_SETEFFECTTO": "sett %1 effekt til %2", - "LOOKS_CLEARGRAPHICEFFECTS": "fjern grafiske effekter", - "LOOKS_CHANGESIZEBY": "endre størrelse med %1", - "LOOKS_SETSIZETO": "sett størrelse til %1 %", - "LOOKS_SIZE": "størrelse", - "LOOKS_CHANGESTRETCHBY": "endre strekk med %1", - "LOOKS_SETSTRETCHTO": "sett strekk til %1 %", - "LOOKS_SWITCHCOSTUMETO": "bytt drakt til %1", - "LOOKS_NEXTCOSTUME": "neste drakt", - "LOOKS_SWITCHBACKDROPTO": "bytt bakgrunn til %1", - "LOOKS_GOTOFRONTBACK": "legg %1", - "LOOKS_GOTOFRONTBACK_FRONT": "foran alt", - "LOOKS_GOTOFRONTBACK_BACK": "bakerst", - "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %1 %2 lag", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "forover", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "bakover", - "LOOKS_BACKDROPNUMBERNAME": "bakgrunn %1", - "LOOKS_COSTUMENUMBERNAME": "drakt %1", - "LOOKS_NUMBERNAME_NUMBER": "nummer", - "LOOKS_NUMBERNAME_NAME": "navn", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "bytt bakgrunn til %1 og vent", - "LOOKS_NEXTBACKDROP_BLOCK": "neste bakgrunn", - "LOOKS_NEXTBACKDROP": "neste bakgrunn", - "LOOKS_PREVIOUSBACKDROP": "forrige bakgrunn", - "LOOKS_RANDOMBACKDROP": "tilfeldig bakgrunn", - "MOTION_MOVESTEPS": "gå %1 steg", - "MOTION_TURNLEFT": "snu %1 %2 grader", - "MOTION_TURNRIGHT": "snu %1 %2 grader", - "MOTION_POINTINDIRECTION": "pek i retning %1", - "MOTION_POINTTOWARDS": "pek mot %1", - "MOTION_POINTTOWARDS_POINTER": "musepeker", - "MOTION_POINTTOWARDS_RANDOM": "tilfeldig retning", - "MOTION_GOTO": "gå til %1", - "MOTION_GOTO_POINTER": "musepeker", - "MOTION_GOTO_RANDOM": "tilfeldig sted", - "MOTION_GOTOXY": "gå til x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "gli %1 sekunder til x: %2 y: %3", - "MOTION_GLIDETO": "gli %1 sekunder til %2", - "MOTION_GLIDETO_POINTER": "musepeker", - "MOTION_GLIDETO_RANDOM": "tilfeldig sted", - "MOTION_CHANGEXBY": "endre x med %1", - "MOTION_SETX": "sett x til %1", - "MOTION_CHANGEYBY": "endre y med %1", - "MOTION_SETY": "sett y til %1", - "MOTION_IFONEDGEBOUNCE": "sprett tilbake ved kanten", - "MOTION_SETROTATIONSTYLE": "begrens rotasjon %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vend sideveis", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ikke roter", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "fri rotasjon", - "MOTION_XPOSITION": "x-posisjon", - "MOTION_YPOSITION": "y-posisjon", - "MOTION_DIRECTION": "retning", - "MOTION_SCROLLRIGHT": "rull høyre %1", - "MOTION_SCROLLUP": "rull opp %1", - "MOTION_ALIGNSCENE": "flytt bakgrunn %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "nederst til venstre", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nederst til høyre", - "MOTION_ALIGNSCENE_MIDDLE": "i midten", - "MOTION_ALIGNSCENE_TOPLEFT": "øverst til venstre", - "MOTION_ALIGNSCENE_TOPRIGHT": "øverst til høyre", - "MOTION_XSCROLL": "rull x", - "MOTION_YSCROLL": "rull y", - "MOTION_STAGE_SELECTED": "Scenen er valgt: den har ingen bevegelsesklosser", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "tilfeldig tall fra %1 til %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 og %2", - "OPERATORS_OR": "%1 eller %2", - "OPERATORS_NOT": "ikke %1", - "OPERATORS_JOIN": "sett sammen %1 %2", - "OPERATORS_JOIN_APPLE": "eple", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "bokstav %1 i %2", - "OPERATORS_LETTEROF_APPLE": "p", - "OPERATORS_LENGTH": "lengden av %1", - "OPERATORS_CONTAINS": "%1 inneholder %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "avrund %1", - "OPERATORS_MATHOP": "%1 av %2", - "OPERATORS_MATHOP_ABS": "absoluttverdi", - "OPERATORS_MATHOP_FLOOR": "avrund ned", - "OPERATORS_MATHOP_CEILING": "avrund opp", - "OPERATORS_MATHOP_SQRT": "kvadratrot", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definer %1", - "SENSING_TOUCHINGOBJECT": "berører %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "musepeker", - "SENSING_TOUCHINGOBJECT_EDGE": "kant", - "SENSING_TOUCHINGCOLOR": "berører fargen %1?", - "SENSING_COLORISTOUCHINGCOLOR": "farge %1 berører %2?", - "SENSING_DISTANCETO": "avstand til %1", - "SENSING_DISTANCETO_POINTER": "musepeker", - "SENSING_ASKANDWAIT": "spør %1 og vent", - "SENSING_ASK_TEXT": "Hva heter du?", - "SENSING_ANSWER": "svar", - "SENSING_KEYPRESSED": "tast %1 trykket?", - "SENSING_MOUSEDOWN": "museknappen er trykket?", - "SENSING_MOUSEX": "mus x", - "SENSING_MOUSEY": "mus y", - "SENSING_SETDRAGMODE": "%1 å dra med musen", - "SENSING_SETDRAGMODE_DRAGGABLE": "tillat", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ikke tillat", - "SENSING_LOUDNESS": "lydnivå", - "SENSING_LOUD": "høy lyd?", - "SENSING_TIMER": "sekundklokke", - "SENSING_RESETTIMER": "nullstill klokken", - "SENSING_OF": "%1 av %2", - "SENSING_OF_XPOSITION": "x-posisjon", - "SENSING_OF_YPOSITION": "y-posisjon", - "SENSING_OF_DIRECTION": "retning", - "SENSING_OF_COSTUMENUMBER": "drakt nr.", - "SENSING_OF_COSTUMENAME": "draktnavn", - "SENSING_OF_SIZE": "størrelse", - "SENSING_OF_VOLUME": "volum", - "SENSING_OF_BACKDROPNUMBER": "bakgrunn nr.", - "SENSING_OF_BACKDROPNAME": "navn på bakgrunn", - "SENSING_OF_STAGE": "Scene", - "SENSING_CURRENT": "%1 nå", - "SENSING_CURRENT_YEAR": "år", - "SENSING_CURRENT_MONTH": "måned", - "SENSING_CURRENT_DATE": "dato", - "SENSING_CURRENT_DAYOFWEEK": "ukedag", - "SENSING_CURRENT_HOUR": "time", - "SENSING_CURRENT_MINUTE": "minutt", - "SENSING_CURRENT_SECOND": "sekund", - "SENSING_DAYSSINCE2000": "dager siden 2000", - "SENSING_USERNAME": "brukernavn", - "SENSING_USERID": "brukernavn", - "SOUND_PLAY": "start lyden %1", - "SOUND_PLAYUNTILDONE": "spill lyden %1 til den er ferdig", - "SOUND_STOPALLSOUNDS": "stopp alle lyder", - "SOUND_SETEFFECTO": "sett %1 effekt til %2", - "SOUND_CHANGEEFFECTBY": "endre %1 effekt med %2", - "SOUND_CLEAREFFECTS": "fjern lydeffekter", - "SOUND_EFFECTS_PITCH": "tonehøyde", - "SOUND_EFFECTS_PAN": "retning", - "SOUND_CHANGEVOLUMEBY": "endre volum med %1", - "SOUND_SETVOLUMETO": "sett volum %1%", - "SOUND_VOLUME": "volum", - "SOUND_RECORD": "spill inn...", - "CATEGORY_MOTION": "Bevegelse", - "CATEGORY_LOOKS": "Utseende", - "CATEGORY_SOUND": "Lyd", - "CATEGORY_EVENTS": "Hendelser", - "CATEGORY_CONTROL": "Styring", - "CATEGORY_SENSING": "Sansing", - "CATEGORY_OPERATORS": "Operatorer", - "CATEGORY_VARIABLES": "Variabler", - "CATEGORY_MYBLOCKS": "Mine klosser", - "DUPLICATE": "Lag en kopi", - "DELETE": "Slett", - "ADD_COMMENT": "Skriv en kommentar", - "REMOVE_COMMENT": "Fjern kommentar", - "DELETE_BLOCK": "Slett kloss", - "DELETE_X_BLOCKS": "Slett %1 klosser", - "DELETE_ALL_BLOCKS": "Slette disse %1 klossene?", - "CLEAN_UP": "Rydd opp klossene", - "HELP": "Hjelp", - "UNDO": "Angre", - "REDO": "Gjør igjen", - "EDIT_PROCEDURE": "Rediger", - "SHOW_PROCEDURE_DEFINITION": "Gå til definisjonen", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Si noe...", - "COLOUR_HUE_LABEL": "Farge", - "COLOUR_SATURATION_LABEL": "Fargemetning", - "COLOUR_BRIGHTNESS_LABEL": "Lysstyrke", - "CHANGE_VALUE_TITLE": "Endre verdi:", - "RENAME_VARIABLE": "Endre navn på variabel", - "RENAME_VARIABLE_TITLE": "Endre variabelnavn \"%1\" til:", - "RENAME_VARIABLE_MODAL_TITLE": "Endre navn på variabel", - "NEW_VARIABLE": "Lag en variabel", - "NEW_VARIABLE_TITLE": "Nytt variabelnavn:", - "VARIABLE_MODAL_TITLE": "Ny variabel", - "VARIABLE_ALREADY_EXISTS": "Det finnes allerede en variabel som heter \"%1\".", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Det finnes allerede en %2-variabel som heter \"%1\"", - "DELETE_VARIABLE_CONFIRMATION": "Slette variabelen \"%2\" som er brukt %1 ganger?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan ikke slette variabelen \"%1\" fordi den brukes i definisjonen av funksjonen \"%2\"", - "DELETE_VARIABLE": "Slett variabelen \"%1\"", - "NEW_PROCEDURE": "Lag en kloss", - "PROCEDURE_ALREADY_EXISTS": "Det finnes allerede en prosedyre som heter \"%1\".", - "PROCEDURE_DEFAULT_NAME": "klossnavn", - "NEW_LIST": "Lag en Liste", - "NEW_LIST_TITLE": "Nytt navn på listen:", - "LIST_MODAL_TITLE": "Ny liste", - "LIST_ALREADY_EXISTS": "Det finnes allerede en liste som heter \"%1\".", - "RENAME_LIST_TITLE": "Endre listenavnet \"%1\" til:", - "RENAME_LIST_MODAL_TITLE": "Gi listen et annet navn", - "DEFAULT_LIST_ITEM": "ting", - "DELETE_LIST": "Slett listen \"%1\"", - "RENAME_LIST": "Endre listenavn", - "NEW_BROADCAST_MESSAGE": "Ny melding", - "NEW_BROADCAST_MESSAGE_TITLE": "Skriv ny melding:", - "BROADCAST_MODAL_TITLE": "Ny melding", - "DEFAULT_BROADCAST_MESSAGE_NAME": "melding1" -}; - -Blockly.ScratchMsgs.locales["nn"] = -{ - "CONTROL_FOREVER": "for alltid", - "CONTROL_REPEAT": "gjenta %1 gongar", - "CONTROL_IF": "viss %1", - "CONTROL_ELSE": "elles", - "CONTROL_STOP": "stopp", - "CONTROL_STOP_ALL": "alle", - "CONTROL_STOP_THIS": "dette skriptet", - "CONTROL_STOP_OTHER": "andre skript i figuren", - "CONTROL_WAIT": "vent %1 sekund", - "CONTROL_WAITUNTIL": "vent til %1", - "CONTROL_REPEATUNTIL": "gjenta til %1", - "CONTROL_WHILE": "gjenta viss %1", - "CONTROL_FOREACH": "for kvar %1 i %2", - "CONTROL_STARTASCLONE": "når eg startar som klon", - "CONTROL_CREATECLONEOF": "lag klon av %1", - "CONTROL_CREATECLONEOF_MYSELF": "meg", - "CONTROL_DELETETHISCLONE": "slett denne klonen", - "CONTROL_COUNTER": "teljar", - "CONTROL_INCRCOUNTER": "auk teljar", - "CONTROL_CLEARCOUNTER": "tøm teljar", - "CONTROL_ALLATONCE": "alle på éin gong", - "DATA_SETVARIABLETO": "set %1 til %2", - "DATA_CHANGEVARIABLEBY": "endra %1 med %2", - "DATA_SHOWVARIABLE": "vis variabelen %1", - "DATA_HIDEVARIABLE": "gøym variabelen %1", - "DATA_ADDTOLIST": "legg %1 til %2", - "DATA_DELETEOFLIST": "slett element %1 i %2", - "DATA_DELETEALLOFLIST": "slett alt i %1", - "DATA_INSERTATLIST": "set inn %1 på plass %2 i %3", - "DATA_REPLACEITEMOFLIST": "byt ut element %1 i %2 med %3", - "DATA_ITEMOFLIST": "element %1 i %2", - "DATA_ITEMNUMOFLIST": "posisjon til %1 i %2", - "DATA_LENGTHOFLIST": "lengda til %1", - "DATA_LISTCONTAINSITEM": "%1 inneheld %2?", - "DATA_SHOWLIST": "vis lista %1", - "DATA_HIDELIST": "gøym lista %1", - "DATA_INDEX_ALL": "alle", - "DATA_INDEX_LAST": "siste", - "DATA_INDEX_RANDOM": "tilfeldig", - "EVENT_WHENFLAGCLICKED": "når %1 vert trykt på", - "EVENT_WHENTHISSPRITECLICKED": "når denne figuren vert trykt på", - "EVENT_WHENSTAGECLICKED": "når scena vert trykt på", - "EVENT_WHENTOUCHINGOBJECT": "når figuren rører %1", - "EVENT_WHENBROADCASTRECEIVED": "når eg får meldinga %1", - "EVENT_WHENBACKDROPSWITCHESTO": "når bakgrunnen byter til %1", - "EVENT_WHENGREATERTHAN": "når %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "klokke", - "EVENT_WHENGREATERTHAN_LOUDNESS": "lydstyrke", - "EVENT_BROADCAST": "send meldinga %1", - "EVENT_BROADCASTANDWAIT": "send meldinga %1 og vent", - "EVENT_WHENKEYPRESSED": "når %1 vert trykt", - "EVENT_WHENKEYPRESSED_SPACE": "mellomrom", - "EVENT_WHENKEYPRESSED_LEFT": "pil venstre", - "EVENT_WHENKEYPRESSED_RIGHT": "pil høgre", - "EVENT_WHENKEYPRESSED_DOWN": "pil ned", - "EVENT_WHENKEYPRESSED_UP": "pil opp", - "EVENT_WHENKEYPRESSED_ANY": "vilkårleg", - "LOOKS_SAYFORSECS": "sei %1 i %2 sekund", - "LOOKS_SAY": "sei %1", - "LOOKS_HELLO": "Hei!", - "LOOKS_THINKFORSECS": "tenk %1 i %2 sekund", - "LOOKS_THINK": "tenk %1", - "LOOKS_HMM": "Hm …", - "LOOKS_SHOW": "vis", - "LOOKS_HIDE": "gøym", - "LOOKS_HIDEALLSPRITES": "gøym alle figurar", - "LOOKS_EFFECT_COLOR": "farge", - "LOOKS_EFFECT_FISHEYE": "fiskeauge", - "LOOKS_EFFECT_WHIRL": "kvervel", - "LOOKS_EFFECT_PIXELATE": "pikselering", - "LOOKS_EFFECT_MOSAIC": "mosaikk", - "LOOKS_EFFECT_BRIGHTNESS": "lysstyrke", - "LOOKS_EFFECT_GHOST": "gjennomsiktig", - "LOOKS_CHANGEEFFECTBY": "endra %1-effekten med %2", - "LOOKS_SETEFFECTTO": "set %1-effekten til %2", - "LOOKS_CLEARGRAPHICEFFECTS": "ta vekk grafiske effektar", - "LOOKS_CHANGESIZEBY": "endra storleik med %1", - "LOOKS_SETSIZETO": "set storleik til %1 %", - "LOOKS_SIZE": "storleik", - "LOOKS_CHANGESTRETCHBY": "endra strekking med %1", - "LOOKS_SETSTRETCHTO": "set strekking til %1 %", - "LOOKS_SWITCHCOSTUMETO": "byt drakt til %1", - "LOOKS_NEXTCOSTUME": "neste drakt", - "LOOKS_SWITCHBACKDROPTO": "byt bakgrunn til %1", - "LOOKS_GOTOFRONTBACK": "legg %1", - "LOOKS_GOTOFRONTBACK_FRONT": "framfor alt", - "LOOKS_GOTOFRONTBACK_BACK": "bak alt", - "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %1 %2 lag", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "framover", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "bakover", - "LOOKS_BACKDROPNUMBERNAME": "bakgrunn %1", - "LOOKS_COSTUMENUMBERNAME": "drakt %1", - "LOOKS_NUMBERNAME_NUMBER": "tal", - "LOOKS_NUMBERNAME_NAME": "namn", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "byt bakgrunn til %1 og vent", - "LOOKS_NEXTBACKDROP_BLOCK": "neste bakgrunn", - "LOOKS_NEXTBACKDROP": "neste bakgrunn", - "LOOKS_PREVIOUSBACKDROP": "førre bakgrunn", - "LOOKS_RANDOMBACKDROP": "tilfeldig bakgrunn", - "MOTION_MOVESTEPS": "gå %1 steg", - "MOTION_TURNLEFT": "snu %1 %2 gradar", - "MOTION_TURNRIGHT": "snu %1 %2 gradar", - "MOTION_POINTINDIRECTION": "peik i retning %1", - "MOTION_POINTTOWARDS": "peik mot %1", - "MOTION_POINTTOWARDS_POINTER": "musepeikar", - "MOTION_POINTTOWARDS_RANDOM": "tilfeldig retning", - "MOTION_GOTO": "gå til %1", - "MOTION_GOTO_POINTER": "musepeikar", - "MOTION_GOTO_RANDOM": "tilfeldig plassering", - "MOTION_GOTOXY": "gå til x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "gli %1 sekund til x: %2 y: %3", - "MOTION_GLIDETO": "gli %1 sekund til %2", - "MOTION_GLIDETO_POINTER": "musepeikar", - "MOTION_GLIDETO_RANDOM": "tilfeldig plassering", - "MOTION_CHANGEXBY": "endra x med %1", - "MOTION_SETX": "set x til %1", - "MOTION_CHANGEYBY": "endra y med %1", - "MOTION_SETY": "set y til %1", - "MOTION_IFONEDGEBOUNCE": "viss ved kant, sprett", - "MOTION_SETROTATIONSTYLE": "avgrens rotering til %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "venstre–høgre", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ikkje roter", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "roter fritt", - "MOTION_XPOSITION": "x-posisjon", - "MOTION_YPOSITION": "y-posisjon", - "MOTION_DIRECTION": "retning", - "MOTION_SCROLLRIGHT": "rull til høgre %1", - "MOTION_SCROLLUP": "rull opp %1", - "MOTION_ALIGNSCENE": "flytt bakgrunn %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "nede til venstre", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nede til høgre", - "MOTION_ALIGNSCENE_MIDDLE": "i midten", - "MOTION_ALIGNSCENE_TOPLEFT": "oppe til venstre", - "MOTION_ALIGNSCENE_TOPRIGHT": "oppe til høgre", - "MOTION_XSCROLL": "rull x", - "MOTION_YSCROLL": "rull y", - "MOTION_STAGE_SELECTED": "Scene vald: ingen rørsleklossar", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 − %2", - "OPERATORS_MULTIPLY": "%1 × %2", - "OPERATORS_DIVIDE": "%1 : %2", - "OPERATORS_RANDOM": "tilfeldig tal frå %1 til %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 og %2", - "OPERATORS_OR": "%1 eller %2", - "OPERATORS_NOT": "ikkje %1", - "OPERATORS_JOIN": "set saman %1 %2", - "OPERATORS_JOIN_APPLE": "eple", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "bokstav %1 i %2", - "OPERATORS_LETTEROF_APPLE": "e", - "OPERATORS_LENGTH": "lengda til %1", - "OPERATORS_CONTAINS": "%1 inneheld %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "rund av %1", - "OPERATORS_MATHOP": "%1 av %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "golv", - "OPERATORS_MATHOP_CEILING": "tak", - "OPERATORS_MATHOP_SQRT": "kvadratrot", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e^", - "OPERATORS_MATHOP_10EXP": "10^", - "PROCEDURES_DEFINITION": "definer %1", - "SENSING_TOUCHINGOBJECT": "rører %1", - "SENSING_TOUCHINGOBJECT_POINTER": "musepeikar", - "SENSING_TOUCHINGOBJECT_EDGE": "kant", - "SENSING_TOUCHINGCOLOR": "rører fargen %1?", - "SENSING_COLORISTOUCHINGCOLOR": "fargen %1 rører %2?", - "SENSING_DISTANCETO": "avstand til %1", - "SENSING_DISTANCETO_POINTER": "musepeikar", - "SENSING_ASKANDWAIT": "spør %1 og vent", - "SENSING_ASK_TEXT": "Kva heiter du?", - "SENSING_ANSWER": "svar", - "SENSING_KEYPRESSED": "tasten %1 er trykt?", - "SENSING_MOUSEDOWN": "museknappen er trykt?", - "SENSING_MOUSEX": "mus x", - "SENSING_MOUSEY": "mus y", - "SENSING_SETDRAGMODE": "%1 å dra med musa", - "SENSING_SETDRAGMODE_DRAGGABLE": "tillate", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ikkje tillate", - "SENSING_LOUDNESS": "lydstyrke", - "SENSING_LOUD": "høg lyd?", - "SENSING_TIMER": "sekundklokke", - "SENSING_RESETTIMER": "nullstill klokka", - "SENSING_OF": "%1 av %2", - "SENSING_OF_XPOSITION": "x-posisjon", - "SENSING_OF_YPOSITION": "y-posisjon", - "SENSING_OF_DIRECTION": "retning", - "SENSING_OF_COSTUMENUMBER": "drakt nr.", - "SENSING_OF_COSTUMENAME": "draktnamn", - "SENSING_OF_SIZE": "storleik", - "SENSING_OF_VOLUME": "lydstyrke", - "SENSING_OF_BACKDROPNUMBER": "bakgrunn nr.", - "SENSING_OF_BACKDROPNAME": "bakgrunnsnamn", - "SENSING_OF_STAGE": "Scene", - "SENSING_CURRENT": "%1 nett no", - "SENSING_CURRENT_YEAR": "året", - "SENSING_CURRENT_MONTH": "månaden", - "SENSING_CURRENT_DATE": "datoen", - "SENSING_CURRENT_DAYOFWEEK": "vekedagen", - "SENSING_CURRENT_HOUR": "timen", - "SENSING_CURRENT_MINUTE": "minuttet", - "SENSING_CURRENT_SECOND": "sekundet", - "SENSING_DAYSSINCE2000": "dagar sidan år 2000", - "SENSING_USERNAME": "brukarnamn", - "SENSING_USERID": "brukar-id", - "SOUND_PLAY": "start lyden %1", - "SOUND_PLAYUNTILDONE": "spel lyden %1 til han er ferdig", - "SOUND_STOPALLSOUNDS": "stopp alle lydar", - "SOUND_SETEFFECTO": "set %1-effekt til %2", - "SOUND_CHANGEEFFECTBY": "endra %1-effekt med %2", - "SOUND_CLEAREFFECTS": "fjern lydeffektar", - "SOUND_EFFECTS_PITCH": "tonehøgd", - "SOUND_EFFECTS_PAN": "venstre–høgre-panorering", - "SOUND_CHANGEVOLUMEBY": "endra lydstyrken med %1", - "SOUND_SETVOLUMETO": "set lydstyrken til %1 %", - "SOUND_VOLUME": "lydstyrke", - "SOUND_RECORD": "spel inn …", - "CATEGORY_MOTION": "Rørsle", - "CATEGORY_LOOKS": "Utsjånad", - "CATEGORY_SOUND": "Lyd", - "CATEGORY_EVENTS": "Hendingar", - "CATEGORY_CONTROL": "Styring", - "CATEGORY_SENSING": "Sansing", - "CATEGORY_OPERATORS": "Operatorar", - "CATEGORY_VARIABLES": "Variablar", - "CATEGORY_MYBLOCKS": "Mine klossar", - "DUPLICATE": "Lag ein kopi", - "DELETE": "Slett", - "ADD_COMMENT": "Skriv kommentar", - "REMOVE_COMMENT": "Fjern kommentar", - "DELETE_BLOCK": "Slett kloss", - "DELETE_X_BLOCKS": "Slett %1 klossar", - "DELETE_ALL_BLOCKS": "Vil du sletta alle %1 klossane?", - "CLEAN_UP": "Rydd opp i klossar", - "HELP": "Hjelp", - "UNDO": "Angra", - "REDO": "Gjer om", - "EDIT_PROCEDURE": "Rediger", - "SHOW_PROCEDURE_DEFINITION": "Gå til definisjonen", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sei noko …", - "COLOUR_HUE_LABEL": "Farge", - "COLOUR_SATURATION_LABEL": "Fargemetting", - "COLOUR_BRIGHTNESS_LABEL": "Lysstyrke", - "CHANGE_VALUE_TITLE": "Endra verdi:", - "RENAME_VARIABLE": "Gje nytt namn", - "RENAME_VARIABLE_TITLE": "Endra namnet på alle «%1»-variablane til:", - "RENAME_VARIABLE_MODAL_TITLE": "Gje nytt namn", - "NEW_VARIABLE": "Lag ein variabel", - "NEW_VARIABLE_TITLE": "Namn på ny variabel:", - "VARIABLE_MODAL_TITLE": "Ny variabel", - "VARIABLE_ALREADY_EXISTS": "Det finst alt ein variabel som heiter «%1».", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Det finst alt ein variabel som heiter «%1», for ein annan variabel av type «%2».", - "DELETE_VARIABLE_CONFIRMATION": "Vil du sletta %1 bruk av variabelen «%2»?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan ikkje sletta variabelen «%1», då han er del av definisjonen til funksjonen «%2».", - "DELETE_VARIABLE": "Slett variabelen «%1»", - "NEW_PROCEDURE": "Lag ein kloss", - "PROCEDURE_ALREADY_EXISTS": "Det finst alt ein prosedyre som heiter «%1».", - "PROCEDURE_DEFAULT_NAME": "klossnamn", - "NEW_LIST": "Lag ei liste", - "NEW_LIST_TITLE": "Namn på ny liste:", - "LIST_MODAL_TITLE": "Ny liste", - "LIST_ALREADY_EXISTS": "Det finst alt ei liste som heiter «%1».", - "RENAME_LIST_TITLE": "Endra namnet på alle «%1»-listene til:", - "RENAME_LIST_MODAL_TITLE": "Gje nytt namn", - "DEFAULT_LIST_ITEM": "ting", - "DELETE_LIST": "Slett lista «%1»", - "RENAME_LIST": "Gje nytt namn", - "NEW_BROADCAST_MESSAGE": "Ny melding", - "NEW_BROADCAST_MESSAGE_TITLE": "Namn på ny melding:", - "BROADCAST_MODAL_TITLE": "Ny melding", - "DEFAULT_BROADCAST_MESSAGE_NAME": "melding1" -}; - -Blockly.ScratchMsgs.locales["uz"] = -{ - "CONTROL_FOREVER": "har doim", - "CONTROL_REPEAT": "%1 marta takrorlash", - "CONTROL_IF": "agar %1 bo'lsa", - "CONTROL_ELSE": "aks holda", - "CONTROL_STOP": "to'xtatish", - "CONTROL_STOP_ALL": "hammasini", - "CONTROL_STOP_THIS": "bu skript", - "CONTROL_STOP_OTHER": "boshqa spraytlardagi skriptlar", - "CONTROL_WAIT": "%1 soniya kutish", - "CONTROL_WAITUNTIL": "%1 gacha kutish", - "CONTROL_REPEATUNTIL": "%1 gacha takrorlash", - "CONTROL_WHILE": "%1 davomida", - "CONTROL_FOREACH": "%2 dagi har bir %1 uchun ", - "CONTROL_STARTASCLONE": "nusxani qabul qilganda", - "CONTROL_CREATECLONEOF": "%1 o'zidan nusxa yaratish", - "CONTROL_CREATECLONEOF_MYSELF": "o'zini", - "CONTROL_DELETETHISCLONE": "bu nusxani o'chirish", - "CONTROL_COUNTER": "hisoblagich", - "CONTROL_INCRCOUNTER": "hisoblagichni orttirish", - "CONTROL_CLEARCOUNTER": "hisoblagichni yangilash", - "CONTROL_ALLATONCE": "bir vaqtning o'zida", - "DATA_SETVARIABLETO": "%1 ni %2 ga sozlash", - "DATA_CHANGEVARIABLEBY": "%1 ni %2 ga o'zgartirish", - "DATA_SHOWVARIABLE": "%1 o'zgaruvchini ko'rsatish", - "DATA_HIDEVARIABLE": "%1 o'zgaruvchini yashirish", - "DATA_ADDTOLIST": "%1 ni %2 ga qo'shish", - "DATA_DELETEOFLIST": "%1 ni %2 dan o'chirish", - "DATA_DELETEALLOFLIST": "%1 hammasini o'chirish", - "DATA_INSERTATLIST": "%1 ni %2 dan %3 ga qo'shish", - "DATA_REPLACEITEMOFLIST": "%2 ro'yxatning %1 chi mavzusini %3 ga o'zgartirish", - "DATA_ITEMOFLIST": "%2 ro'yxatning %1 chi mavzusi", - "DATA_ITEMNUMOFLIST": "%2 ro'yxatda %1 mavzuning joylashuvi", - "DATA_LENGTHOFLIST": "uzunligidan %1", - "DATA_LISTCONTAINSITEM": "%1 %2 ni ichiga oladimi?", - "DATA_SHOWLIST": "%1 ro'yxatni ko'rsatish", - "DATA_HIDELIST": "%1 ro'yxatni yashirish", - "DATA_INDEX_ALL": "hammasi", - "DATA_INDEX_LAST": "oxirgisi", - "DATA_INDEX_RANDOM": "tasodifiy", - "EVENT_WHENFLAGCLICKED": " %1 bosilganda", - "EVENT_WHENTHISSPRITECLICKED": "shu sprayt bosilganda", - "EVENT_WHENSTAGECLICKED": "sahna bosilganda", - "EVENT_WHENTOUCHINGOBJECT": "shu sprayt %1 ga teginganda", - "EVENT_WHENBROADCASTRECEIVED": "%1 ga teginganda", - "EVENT_WHENBACKDROPSWITCHESTO": "%1 fon o'zgarganda", - "EVENT_WHENGREATERTHAN": "%1 > %2 bo'lganda", - "EVENT_WHENGREATERTHAN_TIMER": "taymer", - "EVENT_WHENGREATERTHAN_LOUDNESS": "tovush", - "EVENT_BROADCAST": "%1 ni tarqatish", - "EVENT_BROADCASTANDWAIT": "%1 ni tarqatib kutish", - "EVENT_WHENKEYPRESSED": "%1 bosilganda", - "EVENT_WHENKEYPRESSED_SPACE": "bo'sh joy", - "EVENT_WHENKEYPRESSED_LEFT": "chap ko'rsatgich", - "EVENT_WHENKEYPRESSED_RIGHT": "o'ng ko'rsatgich", - "EVENT_WHENKEYPRESSED_DOWN": "past ko'rsatgich", - "EVENT_WHENKEYPRESSED_UP": "yuqori ko'rsatgich", - "EVENT_WHENKEYPRESSED_ANY": "ixtiyoriy boshqa", - "LOOKS_SAYFORSECS": "%1 ni %2 soniya aytish", - "LOOKS_SAY": "%1 aytish", - "LOOKS_HELLO": "Salom!", - "LOOKS_THINKFORSECS": "%1 ni %2 soniya o'ylash", - "LOOKS_THINK": "%1 o'ylash", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "ko'rsatish", - "LOOKS_HIDE": "yashirish", - "LOOKS_HIDEALLSPRITES": "hamma spraytlarni yashirish", - "LOOKS_EFFECT_COLOR": "rang", - "LOOKS_EFFECT_FISHEYE": "baliq ko'zi", - "LOOKS_EFFECT_WHIRL": "aylanish", - "LOOKS_EFFECT_PIXELATE": "piksellashtirish", - "LOOKS_EFFECT_MOSAIC": "mozayka", - "LOOKS_EFFECT_BRIGHTNESS": "yorqinlik", - "LOOKS_EFFECT_GHOST": "sharpa", - "LOOKS_CHANGEEFFECTBY": "%1 effektni %2 ga o'zgartir", - "LOOKS_SETEFFECTTO": "%1 effektni %2 ga sozlash", - "LOOKS_CLEARGRAPHICEFFECTS": "grafik effektlarni tozalsh", - "LOOKS_CHANGESIZEBY": "o'lchamni %1 ga o'zgartir", - "LOOKS_SETSIZETO": "o'lchamni %1 ga sozlash", - "LOOKS_SIZE": "o'lcham", - "LOOKS_CHANGESTRETCHBY": "uzunlikni %1 ga o'zgartir", - "LOOKS_SETSTRETCHTO": "uzunlikni %1 ga sozlash", - "LOOKS_SWITCHCOSTUMETO": "ko'rinishni %1 ga o'zgartir", - "LOOKS_NEXTCOSTUME": "keyingi ko'rinish", - "LOOKS_SWITCHBACKDROPTO": "fonni %1 ga o'zgartir", - "LOOKS_GOTOFRONTBACK": "eng %1 ga o'tkazish", - "LOOKS_GOTOFRONTBACK_FRONT": "oldinga", - "LOOKS_GOTOFRONTBACK_BACK": "orqaga", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 ga %2 qatlam o'tkazish", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "oldinga", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "orqaga", - "LOOKS_BACKDROPNUMBERNAME": "fon %1", - "LOOKS_COSTUMENUMBERNAME": "ko'rinish %1", - "LOOKS_NUMBERNAME_NUMBER": "raqam", - "LOOKS_NUMBERNAME_NAME": "nomi", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "%1 fonga o'zgartirib kutish", - "LOOKS_NEXTBACKDROP_BLOCK": "keyingi fon", - "LOOKS_NEXTBACKDROP": "keyingi fon", - "LOOKS_PREVIOUSBACKDROP": "oldingi fon", - "LOOKS_RANDOMBACKDROP": "tasodifiy fon", - "MOTION_MOVESTEPS": "%1 qadam yurish", - "MOTION_TURNLEFT": "%1 %2 darajaga burilish", - "MOTION_TURNRIGHT": "%1 %2 darajaga burilish", - "MOTION_POINTINDIRECTION": "%1 harakat yo'nalishi ", - "MOTION_POINTTOWARDS": "%1 tomonga qarash", - "MOTION_POINTTOWARDS_POINTER": "sichqon-ko'rsatkichi", - "MOTION_POINTTOWARDS_RANDOM": "tasodifiy yo'nalish", - "MOTION_GOTO": "%1 ga borish", - "MOTION_GOTO_POINTER": "sichqon-ko'rsatkichi", - "MOTION_GOTO_RANDOM": "tasodifiy joyi", - "MOTION_GOTOXY": "x: %1 y: %2 ga borish", - "MOTION_GLIDESECSTOXY": "%1 soniyada x: %2 y: %3 ga borish", - "MOTION_GLIDETO": "%1 soniyada %2 ga borish", - "MOTION_GLIDETO_POINTER": "sichqon-ko'rsatkichi", - "MOTION_GLIDETO_RANDOM": "tasodifiy joy", - "MOTION_CHANGEXBY": "X o'qini %1 ga o'zgartirish", - "MOTION_SETX": "X o'qini %1 ga sozlash", - "MOTION_CHANGEYBY": "Y o'qini %1 ga o'zgartirish", - "MOTION_SETY": "Y o'qini %1 ga sozlash", - "MOTION_IFONEDGEBOUNCE": "agar devorga urilsa qaytish", - "MOTION_SETROTATIONSTYLE": "burilishni %1 ga sozlash", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "chapga-o'ngga ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "aylanishni taqiqlash", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "aylanish", - "MOTION_XPOSITION": "x koordinatasi", - "MOTION_YPOSITION": "y koordinatasi", - "MOTION_DIRECTION": "yo'nalish", - "MOTION_SCROLLRIGHT": "%1 ni o'ngga olib kelish ", - "MOTION_SCROLLUP": "%1 yuqoriga olib kelish ", - "MOTION_ALIGNSCENE": "%1 ko'rinishni o'zgartirish", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "pastga-chapga", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "pastga-o'ngga ", - "MOTION_ALIGNSCENE_MIDDLE": "o'rta", - "MOTION_ALIGNSCENE_TOPLEFT": "yuqori-chap", - "MOTION_ALIGNSCENE_TOPRIGHT": "yuqori-o'ng", - "MOTION_XSCROLL": "X yurguzish", - "MOTION_YSCROLL": "Y yurguzish", - "MOTION_STAGE_SELECTED": "Amallar bloklari", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 dan %2 gacha taxminiy", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 va %2", - "OPERATORS_OR": "%1 yoki %2", - "OPERATORS_NOT": "%1 bo'lmasa", - "OPERATORS_JOIN": "%1 va %2 ni qo'shish", - "OPERATORS_JOIN_APPLE": "olma", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "%1 %2 xat", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "uzunligi %1", - "OPERATORS_CONTAINS": "%1 tarkibida %2 mavjudmi?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "%1 atrofida", - "OPERATORS_MATHOP": "%1 dan %2", - "OPERATORS_MATHOP_ABS": "modul", - "OPERATORS_MATHOP_FLOOR": "pol", - "OPERATORS_MATHOP_CEILING": "ship", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sinus qiymati", - "OPERATORS_MATHOP_COS": "kosinus qiymati", - "OPERATORS_MATHOP_TAN": "tan qiymati", - "OPERATORS_MATHOP_ASIN": "asinus qiymati", - "OPERATORS_MATHOP_ACOS": "akosinus qiymati", - "OPERATORS_MATHOP_ATAN": "atan qiymati", - "OPERATORS_MATHOP_LN": "Ichida", - "OPERATORS_MATHOP_LOG": "logarifm", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "%1 ni belgilash", - "SENSING_TOUCHINGOBJECT": "%1 ga teginganda", - "SENSING_TOUCHINGOBJECT_POINTER": "sichqon-ko'rsatkichi", - "SENSING_TOUCHINGOBJECT_EDGE": "qirra", - "SENSING_TOUCHINGCOLOR": "%1 ga teginganda", - "SENSING_COLORISTOUCHINGCOLOR": "%1 rang %2 rangga tegdimi?", - "SENSING_DISTANCETO": "%1 gacha masofa", - "SENSING_DISTANCETO_POINTER": "sichqon-ko'rsatkichi", - "SENSING_ASKANDWAIT": "%1 ni so'rab kutish", - "SENSING_ASK_TEXT": "Ismingiz nima?", - "SENSING_ANSWER": "javob", - "SENSING_KEYPRESSED": "%1 tugmasini bosdingizmi?", - "SENSING_MOUSEDOWN": "Sichqonchani bosdingizmi?", - "SENSING_MOUSEX": "sichiqoncha X koordinatasi", - "SENSING_MOUSEY": "sichiqoncha Y koordinatasi", - "SENSING_SETDRAGMODE": "Drag rejimni sudrab %1 ga sozlash", - "SENSING_SETDRAGMODE_DRAGGABLE": "oladigan holat", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "bo'lmaydigan holat", - "SENSING_LOUDNESS": "tovush", - "SENSING_LOUD": "baland ovoz?", - "SENSING_TIMER": "taymer", - "SENSING_RESETTIMER": "taymerni qaytarish", - "SENSING_OF": "%1 dan %2", - "SENSING_OF_XPOSITION": "X koordinatasi", - "SENSING_OF_YPOSITION": "Y koordinatasi", - "SENSING_OF_DIRECTION": "yo'nalish", - "SENSING_OF_COSTUMENUMBER": "kostyum #", - "SENSING_OF_COSTUMENAME": "kostyum nomi", - "SENSING_OF_SIZE": "o'lcham", - "SENSING_OF_VOLUME": "ovoz", - "SENSING_OF_BACKDROPNUMBER": "fonning soni", - "SENSING_OF_BACKDROPNAME": "fonning nomi", - "SENSING_OF_STAGE": "Sahna", - "SENSING_CURRENT": "hozirgi %1", - "SENSING_CURRENT_YEAR": "yil", - "SENSING_CURRENT_MONTH": "oy", - "SENSING_CURRENT_DATE": "sana", - "SENSING_CURRENT_DAYOFWEEK": "hafta kuni", - "SENSING_CURRENT_HOUR": "soat", - "SENSING_CURRENT_MINUTE": "daqiqa", - "SENSING_CURRENT_SECOND": "soniya", - "SENSING_DAYSSINCE2000": "2000-yildan keyingi kunlar", - "SENSING_USERNAME": "foydalanuvchi ismi", - "SENSING_USERID": "foydalanuvchi ID", - "SOUND_PLAY": " %1 ni ijro etish", - "SOUND_PLAYUNTILDONE": "%1 ni tugaguncha ijro etish", - "SOUND_STOPALLSOUNDS": "hamma ovozlarni to'xtat", - "SOUND_SETEFFECTO": "%1 effektni %2 ga sozlash", - "SOUND_CHANGEEFFECTBY": "%1 effektni %2 ga o'zgartir", - "SOUND_CLEAREFFECTS": "ovos effektini o'chirish", - "SOUND_EFFECTS_PITCH": "ovoz balandligi", - "SOUND_EFFECTS_PAN": "ovoz manzili o'ng-chap", - "SOUND_CHANGEVOLUMEBY": "ovozni %1 ga o'zgartirish", - "SOUND_SETVOLUMETO": "ovozni %1% ga sozlash", - "SOUND_VOLUME": "ovoz", - "SOUND_RECORD": "ovoz yozish", - "CATEGORY_MOTION": "Harakatlar", - "CATEGORY_LOOKS": "Ko'rinishlar", - "CATEGORY_SOUND": "Ovozlar", - "CATEGORY_EVENTS": "Hodisalar", - "CATEGORY_CONTROL": "Boshqaruvchi", - "CATEGORY_SENSING": "Sezgirlik", - "CATEGORY_OPERATORS": "Amallar", - "CATEGORY_VARIABLES": "O'zgaruvchi", - "CATEGORY_MYBLOCKS": "Mening bloklarim", - "DUPLICATE": "Nusxalash", - "DELETE": "O'chirish", - "ADD_COMMENT": "Izoh qo'shish", - "REMOVE_COMMENT": "Izohni o'chirish", - "DELETE_BLOCK": "Blokni o'chirish", - "DELETE_X_BLOCKS": "%1 blokni o'chirish", - "DELETE_ALL_BLOCKS": "%1 hamma bloklar o'chirilsinmi?", - "CLEAN_UP": "Bloklarni tozalash", - "HELP": "Yordam", - "UNDO": "Bekor qilish", - "REDO": "Qaytarish", - "EDIT_PROCEDURE": "Oʻzgartirish", - "SHOW_PROCEDURE_DEFINITION": "Ta'rifga o'ting", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "biron nima aytish", - "COLOUR_HUE_LABEL": "Rang", - "COLOUR_SATURATION_LABEL": "To'yinganlik", - "COLOUR_BRIGHTNESS_LABEL": "Yorqinlik ", - "CHANGE_VALUE_TITLE": "Qiymatni o'zgartirish:", - "RENAME_VARIABLE": "O'zgaruvchini nomlash:", - "RENAME_VARIABLE_TITLE": "%1 o'zgaruvchini qayta nomlash", - "RENAME_VARIABLE_MODAL_TITLE": "O'zgaruvchini nomlash", - "NEW_VARIABLE": "O'zgaruvchi yaratish", - "NEW_VARIABLE_TITLE": "Yangi o'zgaruvchining nomi:", - "VARIABLE_MODAL_TITLE": "Yangi o'zgaruvchi", - "VARIABLE_ALREADY_EXISTS": "%1 nomli o'zgaruvchi mavjud", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "\"%2\" ko'rinish boshqa o'zgaruvchida \"%1\" o'zgaruvchida allaqachon mavjud", - "DELETE_VARIABLE_CONFIRMATION": "\"%2\" o'zgaruvchisi uchun \"%1\" ni o'chirmoqchimisiz?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "\"%1\" o'zgaruvchisini o'chirib bo'lmaydi, chunki u \"%2\" funksiyasining bir qismi", - "DELETE_VARIABLE": "%1 o'zgaruvchini o'chirish", - "NEW_PROCEDURE": "blok yaratish", - "PROCEDURE_ALREADY_EXISTS": "\"%1\" usuli allaqachon mavjud", - "PROCEDURE_DEFAULT_NAME": "blok nomi", - "NEW_LIST": "Ro‘yxat tuzing", - "NEW_LIST_TITLE": "Yangi ro'yxat nomi:", - "LIST_MODAL_TITLE": "Yangi roʻyxat", - "LIST_ALREADY_EXISTS": "\"%1\" ro'yxat nomi allaqachon mavjud", - "RENAME_LIST_TITLE": "Barcha \"%1\" ro'yxatini qayta nomlash", - "RENAME_LIST_MODAL_TITLE": "Ro'yxatni nomlash", - "DEFAULT_LIST_ITEM": "narsa", - "DELETE_LIST": "%1 ro'yxatni o'chirish", - "RENAME_LIST": "ro'yxatni nomlash", - "NEW_BROADCAST_MESSAGE": "Yangi xabar", - "NEW_BROADCAST_MESSAGE_TITLE": "Yangi xabar nomi:", - "BROADCAST_MODAL_TITLE": "Yangi xabar", - "DEFAULT_BROADCAST_MESSAGE_NAME": "xabar1" -}; - -Blockly.ScratchMsgs.locales["th"] = -{ - "CONTROL_FOREVER": "วนซ้ำตลอด", - "CONTROL_REPEAT": "ทำซ้ำ %1", - "CONTROL_IF": "ถ้า %1 แล้ว", - "CONTROL_ELSE": "มิฉะนั้น", - "CONTROL_STOP": "หยุด", - "CONTROL_STOP_ALL": "ทั้งหมด", - "CONTROL_STOP_THIS": "สคริปต์นี้", - "CONTROL_STOP_OTHER": "สริปต์อื่นในตัวละคร", - "CONTROL_WAIT": "รอ %1 วินาที", - "CONTROL_WAITUNTIL": "รอจนกระทั่ง %1", - "CONTROL_REPEATUNTIL": "ทำซ้ำจน %1", - "CONTROL_WHILE": "ขณะที่ %1", - "CONTROL_FOREACH": "สำหรับแต่ละ %1 ใน %2", - "CONTROL_STARTASCLONE": "เมื่อฉันเริ่มในฐานะโคลน", - "CONTROL_CREATECLONEOF": "สร้าง โคลน ของ %1", - "CONTROL_CREATECLONEOF_MYSELF": "ตัวฉันเอง", - "CONTROL_DELETETHISCLONE": "ลบโคลนตัวนี้", - "CONTROL_COUNTER": "ตัวนับ", - "CONTROL_INCRCOUNTER": "ตัวนับเพิ่ม", - "CONTROL_CLEARCOUNTER": "ล้างตัวนับ", - "CONTROL_ALLATONCE": "ทั้งหมดในครั้งเดียว", - "DATA_SETVARIABLETO": "ตั้งค่า %1 เป็น %2", - "DATA_CHANGEVARIABLEBY": "เปลี่ยน %1 ทีละ %2", - "DATA_SHOWVARIABLE": "แสดงตัวแปร %1", - "DATA_HIDEVARIABLE": "ซ่อนตัวแปร %1", - "DATA_ADDTOLIST": "เพิ่ม %1 ไปยัง %2", - "DATA_DELETEOFLIST": "ลบรายการที่ %1 ออกจาก %2", - "DATA_DELETEALLOFLIST": "ลบทั้งหมดจาก %1", - "DATA_INSERTATLIST": "แทรก %1 ที่ลำดับ %2 ของ %3", - "DATA_REPLACEITEMOFLIST": "แทนที่รายการที่ %1 ของ %2 ด้วย %3", - "DATA_ITEMOFLIST": "รายการที่ %1 ของ %2", - "DATA_ITEMNUMOFLIST": " รายการ # ของ %1 จาก %2", - "DATA_LENGTHOFLIST": "ความยาวของ %1", - "DATA_LISTCONTAINSITEM": "%1 มี %2?", - "DATA_SHOWLIST": "แสดงรายการ %1", - "DATA_HIDELIST": "ซ่อนรายการ %1", - "DATA_INDEX_ALL": "ทั้งหมด", - "DATA_INDEX_LAST": "สุดท้าย", - "DATA_INDEX_RANDOM": "สุ่ม", - "EVENT_WHENFLAGCLICKED": "เมื่อคลิก %1", - "EVENT_WHENTHISSPRITECLICKED": "เมื่อตัวละครนี้ถูกคลิก", - "EVENT_WHENSTAGECLICKED": "เมื่อคลิกเวที", - "EVENT_WHENTOUCHINGOBJECT": "เมื่อสไปรต์นี้แตะ %1", - "EVENT_WHENBROADCASTRECEIVED": "เมื่อฉันได้รับ %1", - "EVENT_WHENBACKDROPSWITCHESTO": "เมื่อฉากหลังเปลี่ยนเป็น %1", - "EVENT_WHENGREATERTHAN": "เมื่อ %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "ตัวจับเวลา", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ระดับความดัง", - "EVENT_BROADCAST": "กระจาย %1", - "EVENT_BROADCASTANDWAIT": "กระจาย %1 และรอ", - "EVENT_WHENKEYPRESSED": "เมื่อกดปุ่ม %1", - "EVENT_WHENKEYPRESSED_SPACE": "สเปซบาร์", - "EVENT_WHENKEYPRESSED_LEFT": "ลูกศรชี้ทางซ้าย", - "EVENT_WHENKEYPRESSED_RIGHT": "ลูกศรชี้ขวา", - "EVENT_WHENKEYPRESSED_DOWN": "ลูกศรชี้ลง", - "EVENT_WHENKEYPRESSED_UP": "ลูกศรขึ้น", - "EVENT_WHENKEYPRESSED_ANY": "อะไรก็ได้", - "LOOKS_SAYFORSECS": "พูด %1 %2 วินาที", - "LOOKS_SAY": "พูด %1", - "LOOKS_HELLO": "สวัสดี!", - "LOOKS_THINKFORSECS": "คิด %1 %2 วินาที", - "LOOKS_THINK": "คิด %1", - "LOOKS_HMM": "อืมม...", - "LOOKS_SHOW": "แสดง", - "LOOKS_HIDE": "ซ่อน", - "LOOKS_HIDEALLSPRITES": "ซ่อนสไปรต์ทั้งหมด", - "LOOKS_EFFECT_COLOR": "สี", - "LOOKS_EFFECT_FISHEYE": "ตาปลา", - "LOOKS_EFFECT_WHIRL": "หมุนวน", - "LOOKS_EFFECT_PIXELATE": "แยกพิกเซล", - "LOOKS_EFFECT_MOSAIC": "โมเสก", - "LOOKS_EFFECT_BRIGHTNESS": "ความสว่าง", - "LOOKS_EFFECT_GHOST": "ล่องหน", - "LOOKS_CHANGEEFFECTBY": "เปลี่ยนเอฟเฟกต์ %1 ทีละ %2", - "LOOKS_SETEFFECTTO": "ตั้งค่าเอฟเฟกต์ %1 เป็น %2", - "LOOKS_CLEARGRAPHICEFFECTS": "ล้างเอฟเฟคภาพ", - "LOOKS_CHANGESIZEBY": "เปลี่ยนขนาดทีละ %1", - "LOOKS_SETSIZETO": "กำหนดขนาดเป็น %1 %", - "LOOKS_SIZE": "ขนาด", - "LOOKS_CHANGESTRETCHBY": "เปลี่ยนความยืดทีละ %1", - "LOOKS_SETSTRETCHTO": "ตั้งค่าความยืดเป็น %1 %", - "LOOKS_SWITCHCOSTUMETO": "เปลี่ยนคอสตูมเป็น %1", - "LOOKS_NEXTCOSTUME": "ชุดถัดไป", - "LOOKS_SWITCHBACKDROPTO": "เปลี่ยนฉากหลังเป็น %1", - "LOOKS_GOTOFRONTBACK": "ไปที่ระดับ %1 ", - "LOOKS_GOTOFRONTBACK_FRONT": "หน้าสุด", - "LOOKS_GOTOFRONTBACK_BACK": "หลังสุด", - "LOOKS_GOFORWARDBACKWARDLAYERS": "ไป %1 %2 ระดับ", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ด้านหน้า", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ด้านหลัง", - "LOOKS_BACKDROPNUMBERNAME": "ฉากหลัง %1", - "LOOKS_COSTUMENUMBERNAME": "คอสตูม %1", - "LOOKS_NUMBERNAME_NUMBER": "หมายเลข", - "LOOKS_NUMBERNAME_NAME": "ชื่อ", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "เปลี่ยนฉากหลังเป็น %1 และรอ", - "LOOKS_NEXTBACKDROP_BLOCK": "ฉากหลังต่อไป", - "LOOKS_NEXTBACKDROP": "ฉากหลังต่อไป", - "LOOKS_PREVIOUSBACKDROP": "ฉากหลังก่อนหน้า", - "LOOKS_RANDOMBACKDROP": "ฉากหลังแบบสุ่ม", - "MOTION_MOVESTEPS": "เคลื่อนที่ %1 ก้าว", - "MOTION_TURNLEFT": "หัน %1 %2 องศา", - "MOTION_TURNRIGHT": "หัน %1 %2 องศา", - "MOTION_POINTINDIRECTION": "หันในทิศทาง %1", - "MOTION_POINTTOWARDS": "หันไปทาง %1", - "MOTION_POINTTOWARDS_POINTER": "ตัวชี้เมาส์", - "MOTION_POINTTOWARDS_RANDOM": "สุ่มทิศทาง", - "MOTION_GOTO": "ไปที่ %1", - "MOTION_GOTO_POINTER": "ตัวชี้เมาส์", - "MOTION_GOTO_RANDOM": "ตำแหน่งสุ่ม", - "MOTION_GOTOXY": "ไปที่ x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "เหิน %1 วินาที ไปยัง x: %2 y: %3", - "MOTION_GLIDETO": "เหิน %1 วินาที ไปยัง %2", - "MOTION_GLIDETO_POINTER": "ตัวชี้เมาส์", - "MOTION_GLIDETO_RANDOM": "ตำแหน่งสุ่ม", - "MOTION_CHANGEXBY": "เปลี่ยน x ทีละ %1", - "MOTION_SETX": "ตั้งค่า x เป็น %1", - "MOTION_CHANGEYBY": "เปลี่ยน y ทีละ %1", - "MOTION_SETY": "ตั้งค่า y เป็น %1", - "MOTION_IFONEDGEBOUNCE": "ถ้าชนขอบให้สะท้อนกลับ", - "MOTION_SETROTATIONSTYLE": "ตั้งรูปแบบการหมุนเป็น %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "ซ้าย-ขวา", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ห้ามหมุน", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "รอบด้าน", - "MOTION_XPOSITION": "ตำแหน่ง x ", - "MOTION_YPOSITION": "ตำแหน่ง y", - "MOTION_DIRECTION": "ทิศทาง", - "MOTION_SCROLLRIGHT": "เลื่อนขวา %1", - "MOTION_SCROLLUP": "เลื่อนขึ้น %1", - "MOTION_ALIGNSCENE": "แนวฉาก %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ล่างซ้าย", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ล่างขวา", - "MOTION_ALIGNSCENE_MIDDLE": "กึ่งกลาง", - "MOTION_ALIGNSCENE_TOPLEFT": "บนซ้าย", - "MOTION_ALIGNSCENE_TOPRIGHT": "บนขวา", - "MOTION_XSCROLL": "x เลื่อน", - "MOTION_YSCROLL": "y เลื่อน", - "MOTION_STAGE_SELECTED": "เลือกเวที: ไม่มีบล็อกเคลื่อนไหว", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "เลือกสุ่มจาก %1 ถึง %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 และ %2", - "OPERATORS_OR": "%1 หรือ %2", - "OPERATORS_NOT": "ไม่ %1", - "OPERATORS_JOIN": "ต่อ %1 %2", - "OPERATORS_JOIN_APPLE": "แอปเปิ้ล", - "OPERATORS_JOIN_BANANA": "กล้วย", - "OPERATORS_LETTEROF": "อักษรที่ %1 ของ %2", - "OPERATORS_LETTEROF_APPLE": "อ", - "OPERATORS_LENGTH": "ความยาวของ %1", - "OPERATORS_CONTAINS": "%1 มี %2?", - "OPERATORS_MOD": "%1 หารเอาเศษ %2", - "OPERATORS_ROUND": "ปัดเศษ %1", - "OPERATORS_MATHOP": "%1 ของ %2", - "OPERATORS_MATHOP_ABS": "ค่าสัมบูรณ์", - "OPERATORS_MATHOP_FLOOR": "พื้น", - "OPERATORS_MATHOP_CEILING": "เพดาน", - "OPERATORS_MATHOP_SQRT": "รากที่สอง", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "กำหนด %1", - "SENSING_TOUCHINGOBJECT": "แตะ %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "ตัวชี้เมาส์", - "SENSING_TOUCHINGOBJECT_EDGE": "ขอบ", - "SENSING_TOUCHINGCOLOR": "แตะสี %1?", - "SENSING_COLORISTOUCHINGCOLOR": "สี %1 แตะกับสี %2?", - "SENSING_DISTANCETO": "ระยะห่างไปยัง %1", - "SENSING_DISTANCETO_POINTER": "ตัวชี้เมาส์", - "SENSING_ASKANDWAIT": "ถาม %1 และรอ", - "SENSING_ASK_TEXT": "คุณชื่ออะไร?", - "SENSING_ANSWER": "คำตอบ", - "SENSING_KEYPRESSED": "ปุ่ม %1 ถูกกด?", - "SENSING_MOUSEDOWN": "เมาส์ถูกกด?", - "SENSING_MOUSEX": "ตำแหน่ง x ของเมาส์", - "SENSING_MOUSEY": "ตำแหน่ง y ของเมาส์", - "SENSING_SETDRAGMODE": "ตั้งค่าโหมดลาก %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "ลากได้", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ลากไม่ได้", - "SENSING_LOUDNESS": "ระดับความดัง", - "SENSING_LOUD": "เสียงดัง?", - "SENSING_TIMER": "จับเวลา", - "SENSING_RESETTIMER": "จับเวลาใหม่", - "SENSING_OF": "%1 ของ %2", - "SENSING_OF_XPOSITION": "ตำแหน่ง x ", - "SENSING_OF_YPOSITION": "ตำแหน่ง y", - "SENSING_OF_DIRECTION": "ทิศทาง", - "SENSING_OF_COSTUMENUMBER": "คอสตูม #", - "SENSING_OF_COSTUMENAME": "ชื่อคอสตูม", - "SENSING_OF_SIZE": "ขนาด", - "SENSING_OF_VOLUME": "ระดับเสียง", - "SENSING_OF_BACKDROPNUMBER": "ฉากหลัง #", - "SENSING_OF_BACKDROPNAME": "ชื่อฉากหลัง", - "SENSING_OF_STAGE": "เวที", - "SENSING_CURRENT": "%1 ปัจจุบัน", - "SENSING_CURRENT_YEAR": "ปี", - "SENSING_CURRENT_MONTH": "เดือน", - "SENSING_CURRENT_DATE": "วันที่", - "SENSING_CURRENT_DAYOFWEEK": "วันของสัปดาห์", - "SENSING_CURRENT_HOUR": "ชั่วโมง", - "SENSING_CURRENT_MINUTE": "นาที", - "SENSING_CURRENT_SECOND": "วินาที", - "SENSING_DAYSSINCE2000": "จำนวนวันตั้งแต่ปี ค.ศ 2000", - "SENSING_USERNAME": "ชื่อผู้ใช้", - "SENSING_USERID": "รหัสผู้ใช้", - "SOUND_PLAY": "เริ่มเสียง %1", - "SOUND_PLAYUNTILDONE": "เล่นเสียง %1 จนจบ", - "SOUND_STOPALLSOUNDS": "หยุดเสียงทั้งหมด", - "SOUND_SETEFFECTO": "ตั้งค่าเอฟเฟกต์ %1 เป็น %2", - "SOUND_CHANGEEFFECTBY": "เปลี่ยนเอฟเฟกต์ %1 ทีละ %2", - "SOUND_CLEAREFFECTS": "ล้างเอฟเฟกต์เสียง", - "SOUND_EFFECTS_PITCH": "เสียงสูงต่ำ", - "SOUND_EFFECTS_PAN": "แพนเสียงซ้าย/ขวา", - "SOUND_CHANGEVOLUMEBY": "เปลี่ยนระดับเสียงทีละ %1", - "SOUND_SETVOLUMETO": "ตั้งระดับเสียงเป็น %1%", - "SOUND_VOLUME": "ระดับเสียง", - "SOUND_RECORD": "อัดบันทึก...", - "CATEGORY_MOTION": "เคลื่อนไหว", - "CATEGORY_LOOKS": "รูปลักษณ์", - "CATEGORY_SOUND": "เสียง", - "CATEGORY_EVENTS": "เหตุการณ์", - "CATEGORY_CONTROL": "ควบคุม", - "CATEGORY_SENSING": "ตรวจจับ", - "CATEGORY_OPERATORS": "ตัวดำเนินการ", - "CATEGORY_VARIABLES": "ตัวแปร", - "CATEGORY_MYBLOCKS": "บล็อกของฉัน", - "DUPLICATE": "ทำซ้ำ", - "DELETE": "ลบ", - "ADD_COMMENT": "เพิ่มคำอธิบาย", - "REMOVE_COMMENT": "ลบคำอธิบาย", - "DELETE_BLOCK": "ลบบล็อก", - "DELETE_X_BLOCKS": "ลบ %1 บล็อก", - "DELETE_ALL_BLOCKS": "ลบทั้งหมด %1 บล็อก?", - "CLEAN_UP": "จัดระเบียบบล็อก", - "HELP": "ช่วยเหลือ", - "UNDO": "ย้อนกลับ", - "REDO": "ทำซ้ำ", - "EDIT_PROCEDURE": "แก้ไข", - "SHOW_PROCEDURE_DEFINITION": "ไปยังตัวกำหนด", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "พูดอะไรสักอย่าง...", - "COLOUR_HUE_LABEL": "สี", - "COLOUR_SATURATION_LABEL": "ความอิ่มตัว", - "COLOUR_BRIGHTNESS_LABEL": "ความสว่าง", - "CHANGE_VALUE_TITLE": "เปลี่ยนค่า:", - "RENAME_VARIABLE": "เปลี่ยนชื่อตัวแปร", - "RENAME_VARIABLE_TITLE": "เปลี่ยนชื่อตัวแปร \"%1\" ทั้งหมดเป็น:", - "RENAME_VARIABLE_MODAL_TITLE": "เปลี่ยนชื่อตัวแปร", - "NEW_VARIABLE": "สร้างตัวแปร", - "NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:", - "VARIABLE_MODAL_TITLE": "ตัวแปรใหม่", - "VARIABLE_ALREADY_EXISTS": "มีตัวแปรชื่อ \"%1\" อยู่แล้ว", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "มีตัวแปรชื่อ \"%1\" อยู่แล้วสำหรับตัวแปรอื่นชนิด \"%2\"", - "DELETE_VARIABLE_CONFIRMATION": "ลบตัวแปร \"%2\" ซึ่งใช้อยู่ %1 ที่?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "ไม่สามารถลบตัวแปร \"%1\" ได้เนื่องจากเป็นส่วนหนึ่งของคำจำกัดความของฟังก์ชัน \"%2\"", - "DELETE_VARIABLE": "ลบตัวแปร \"%1\"", - "NEW_PROCEDURE": "สร้างบล็อกใหม่", - "PROCEDURE_ALREADY_EXISTS": "มีขั้นตอนชื่อ \"%1\" อยู่แล้ว", - "PROCEDURE_DEFAULT_NAME": "ชื่อบล็อก", - "NEW_LIST": "สร้างรายการ", - "NEW_LIST_TITLE": "ชื่อรายการ:", - "LIST_MODAL_TITLE": "รายการใหม่", - "LIST_ALREADY_EXISTS": "มีรายการชื่อ \"%1\" อยู่แล้ว", - "RENAME_LIST_TITLE": "เปลี่ยนชื่อรายการ \"%1\" ทั้งหมดเป็น:", - "RENAME_LIST_MODAL_TITLE": "เปลี่ยนชื่อรายการ", - "DEFAULT_LIST_ITEM": "สิ่ง", - "DELETE_LIST": "ลบรายชื่อ \"%1\"", - "RENAME_LIST": "เปลี่ยนชื่อรายชื่อ", - "NEW_BROADCAST_MESSAGE": "ข้อความใหม่", - "NEW_BROADCAST_MESSAGE_TITLE": "ชื่อข้อความใหม่:", - "BROADCAST_MODAL_TITLE": "ข้อความใหม่", - "DEFAULT_BROADCAST_MESSAGE_NAME": "ข้อความ1" -}; - -Blockly.ScratchMsgs.locales["km"] = -{ - "CONTROL_FOREVER": "រហូត", - "CONTROL_REPEAT": "ធ្វើដដែលៗ %1 ដង", - "CONTROL_IF": "ប្រសិន %1 នោះ", - "CONTROL_ELSE": "បើមិនដូច្នោះទេ", - "CONTROL_STOP": "ឈប់", - "CONTROL_STOP_ALL": "ទាំងអស់", - "CONTROL_STOP_THIS": "ស្គ្រីបនេះ", - "CONTROL_STOP_OTHER": "ស្រ្គីបផ្សេងទៀតក្នុងតួអង្គ", - "CONTROL_WAIT": "ចាំ %1 វិនាទី", - "CONTROL_WAITUNTIL": "ចាំរហូតដល់ %1", - "CONTROL_REPEATUNTIL": "ធ្វើដដែលៗរហូតដល់ %1", - "CONTROL_WHILE": "ខណៈពេល %1", - "CONTROL_FOREACH": "សម្រាប់ %1 នីមួយៗ ក្នុង %2", - "CONTROL_STARTASCLONE": "ពេលខ្ញុំចាប់ផ្តើមជារូបចម្លង", - "CONTROL_CREATECLONEOF": "ចម្លងរូបរាងនៃ %1", - "CONTROL_CREATECLONEOF_MYSELF": "ខ្លួនឯង", - "CONTROL_DELETETHISCLONE": "លុបរូបចម្លងនេះ", - "CONTROL_COUNTER": "លេខរាប់", - "CONTROL_INCRCOUNTER": "បង្កើនលេខរាប់", - "CONTROL_CLEARCOUNTER": "លុបលេខរាប់", - "CONTROL_ALLATONCE": "ម្តងទាំងអស់", - "DATA_SETVARIABLETO": "ដាក់ %1 ទៅជា %2", - "DATA_CHANGEVARIABLEBY": "ប្តូរ %1 ចំនួន %2", - "DATA_SHOWVARIABLE": "បង្ហាញអថេរ %1", - "DATA_HIDEVARIABLE": "លាក់អថេរ %1", - "DATA_ADDTOLIST": "បន្ថែម %1 ទៅលើ %2", - "DATA_DELETEOFLIST": "លុបធាតុទី %1 ចេញពី %2", - "DATA_DELETEALLOFLIST": "លុបធាតុទាំងអស់ក្នុង %1", - "DATA_INSERTATLIST": "បញ្ចូល %1 នៅទីតាំង %2 ក្នុង %3", - "DATA_REPLACEITEMOFLIST": "ជំនួសធាតុ %1 នៃ %2 ដោយ %3", - "DATA_ITEMOFLIST": "ធាតុ %1 នៃ %2", - "DATA_ITEMNUMOFLIST": "លេខទីតាំងនៃធាតុ %1 ក្នុង %2", - "DATA_LENGTHOFLIST": "ប្រវែងនៃ %1", - "DATA_LISTCONTAINSITEM": "%1 មាន %2?", - "DATA_SHOWLIST": "បង្ហាញបញ្ជី %1", - "DATA_HIDELIST": "លាក់បញ្ជី %1", - "DATA_INDEX_ALL": "ទាំងអស់", - "DATA_INDEX_LAST": "ចុងក្រោយ", - "DATA_INDEX_RANDOM": "ចៃដន្យ", - "EVENT_WHENFLAGCLICKED": "ពេលចុច %1", - "EVENT_WHENTHISSPRITECLICKED": "ពេលចុចតួអង្គ", - "EVENT_WHENSTAGECLICKED": "ពេលចុចឆាក", - "EVENT_WHENTOUCHINGOBJECT": "នៅពេលតួអង្គនេះប៉ះ %1", - "EVENT_WHENBROADCASTRECEIVED": "ពេលខ្ញុំទទួលបាន %1", - "EVENT_WHENBACKDROPSWITCHESTO": "ពេលផ្ទាំងខាងក្រោយប្តូរទៅជា %1", - "EVENT_WHENGREATERTHAN": "ពេល %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "ម៉ោងរាប់ថយក្រោយ", - "EVENT_WHENGREATERTHAN_LOUDNESS": "កម្រិតឮ", - "EVENT_BROADCAST": "បញ្ជូនសារ %1", - "EVENT_BROADCASTANDWAIT": "បញ្ជូនសារ %1 ហើយចាំ", - "EVENT_WHENKEYPRESSED": "ពេលចុច %1", - "EVENT_WHENKEYPRESSED_SPACE": "ច្នុចដក​ឃ្លា", - "EVENT_WHENKEYPRESSED_LEFT": "ព្រួញខាង​ឆ្វេង", - "EVENT_WHENKEYPRESSED_RIGHT": "ព្រួញខាង​ស្ដាំ", - "EVENT_WHENKEYPRESSED_DOWN": "ព្រួញខាងក្រោម", - "EVENT_WHENKEYPRESSED_UP": "ព្រួញ​ខាង​លើ", - "EVENT_WHENKEYPRESSED_ANY": "ណាមួយ", - "LOOKS_SAYFORSECS": "និយាយ %1 រយៈពេល %2 វិនាទី", - "LOOKS_SAY": "និយាយ %1", - "LOOKS_HELLO": "សួស្តី!", - "LOOKS_THINKFORSECS": "គិត %1 រយៈពេល %2 វិនាទី", - "LOOKS_THINK": "គិត %1", - "LOOKS_HMM": "អឺ...", - "LOOKS_SHOW": "បង្ហាញ", - "LOOKS_HIDE": "លាក់", - "LOOKS_HIDEALLSPRITES": "លាក់តួអង្គទាំងអស់", - "LOOKS_EFFECT_COLOR": "ពណ៌", - "LOOKS_EFFECT_FISHEYE": "fisheye", - "LOOKS_EFFECT_WHIRL": "whirl", - "LOOKS_EFFECT_PIXELATE": "pixelate", - "LOOKS_EFFECT_MOSAIC": "mosaic", - "LOOKS_EFFECT_BRIGHTNESS": "កម្រិតពន្លឺ", - "LOOKS_EFFECT_GHOST": "ghost", - "LOOKS_CHANGEEFFECTBY": "ប្តូរបែបផែន %1 ចំនួន %2", - "LOOKS_SETEFFECTTO": "ដាក់បែបផែន %1 ត្រឹម %2", - "LOOKS_CLEARGRAPHICEFFECTS": "លុបបែបផែនក្រាហ្វិក", - "LOOKS_CHANGESIZEBY": "ប្តូរទំហំចំនួន %1", - "LOOKS_SETSIZETO": "ដាក់ទំហំត្រឹម %1 %", - "LOOKS_SIZE": "ទំហំ", - "LOOKS_CHANGESTRETCHBY": "ប្តូរកម្រិតយឺតចំនួន %1", - "LOOKS_SETSTRETCHTO": "ដាក់កម្រិតយឺតត្រឹម %1 %", - "LOOKS_SWITCHCOSTUMETO": "ប្តូររូបរាងទៅជា %1", - "LOOKS_NEXTCOSTUME": "រូបរាងបន្ទាប់", - "LOOKS_SWITCHBACKDROPTO": "ប្ដូរផ្ទាំង​ខាងក្រោយ​ទៅជា %1", - "LOOKS_GOTOFRONTBACK": "ទៅស្រទាប់ %1", - "LOOKS_GOTOFRONTBACK_FRONT": "មុខ", - "LOOKS_GOTOFRONTBACK_BACK": "ក្រោយ", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 ស្រទាប់", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ទៅមុខ", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ថយក្រោយ", - "LOOKS_BACKDROPNUMBERNAME": "ផ្ទាំងខាងក្រោយ %1", - "LOOKS_COSTUMENUMBERNAME": "រូបរាង %1", - "LOOKS_NUMBERNAME_NUMBER": "លេខ", - "LOOKS_NUMBERNAME_NAME": "ឈ្មោះ", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "ប្ដូរផ្ទាំងខាង​ក្រោយ​ទៅជា %1 ហើយ​រងចាំ", - "LOOKS_NEXTBACKDROP_BLOCK": "ផ្ទាំងខាងក្រោយបន្ទាប់", - "LOOKS_NEXTBACKDROP": "ផ្ទាំងខាងក្រោយបន្ទាប់", - "LOOKS_PREVIOUSBACKDROP": "ផ្ទាំងខាងក្រោយមុន", - "LOOKS_RANDOMBACKDROP": "ផ្ទាំងខាងក្រោយចៃដន្យ", - "MOTION_MOVESTEPS": "ផ្លាស់ទី %1 ជំហាន", - "MOTION_TURNLEFT": "បង្វិល %1 %2 ដឺក្រេ", - "MOTION_TURNRIGHT": "បង្វិល %1 %2 ដឺក្រេ", - "MOTION_POINTINDIRECTION": "ចង្អុលទៅទិសដៅ %1", - "MOTION_POINTTOWARDS": "ចង្អុលទៅ %1", - "MOTION_POINTTOWARDS_POINTER": "ព្រួញម៉ៅស៍", - "MOTION_POINTTOWARDS_RANDOM": "ទិសដៅចៃដន្យ", - "MOTION_GOTO": "ទៅកាន់ %1", - "MOTION_GOTO_POINTER": "ព្រួញម៉ៅស៍", - "MOTION_GOTO_RANDOM": "ទីតាំង​ចៃ​ដន្យ", - "MOTION_GOTOXY": "ទៅកាន់ x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "រំកិល %1 វិនាទី ទៅ x: %2 y: %3", - "MOTION_GLIDETO": "រំកិល %1 វិនាទី ទៅ %2", - "MOTION_GLIDETO_POINTER": "ព្រួញម៉ៅស៍", - "MOTION_GLIDETO_RANDOM": "ទីតាំង​ចៃ​ដន្យ", - "MOTION_CHANGEXBY": "ប្តូរ x ចំនួន %1", - "MOTION_SETX": "ដាក់ x ត្រឹម %1", - "MOTION_CHANGEYBY": "ប្តូរ y ចំនួន %1", - "MOTION_SETY": "ដាក់ y ត្រឹម %1", - "MOTION_IFONEDGEBOUNCE": "បើនៅគែមឆាក, អោយខ្ទាតចេញ", - "MOTION_SETROTATIONSTYLE": "ដាក់ស្តាយបង្វិល %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "ឆ្វេង-ស្តាំ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "កុំ​បង្វិល", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "ពេញមួយជុំ", - "MOTION_XPOSITION": "ទីតាំង x", - "MOTION_YPOSITION": "ទីតាំង y", - "MOTION_DIRECTION": "ទិសដៅ", - "MOTION_SCROLLRIGHT": "រមូរស្តាំ %1", - "MOTION_SCROLLUP": "រមូរឡើងលើ %1", - "MOTION_ALIGNSCENE": "តម្រឹមឈុត %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ក្រោម-ឆ្វេង", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ក្រោម-ស្តាំ", - "MOTION_ALIGNSCENE_MIDDLE": "កណ្តាល", - "MOTION_ALIGNSCENE_TOPLEFT": "លើ-ឆ្វេង", - "MOTION_ALIGNSCENE_TOPRIGHT": "លើ-ស្តាំ", - "MOTION_XSCROLL": "រមូរ x", - "MOTION_YSCROLL": "រមូរ y", - "MOTION_STAGE_SELECTED": "អ្នកបានជ្រើសឆាក។ មិនមានប្លុកចលនាទេ", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "យកតម្លៃចៃដន្យពី %1 ទៅ %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 និង %2", - "OPERATORS_OR": "%1 ឬ %2", - "OPERATORS_NOT": "មិនមែន %1", - "OPERATORS_JOIN": "ភ្ជាប់ %1 %2", - "OPERATORS_JOIN_APPLE": "apple", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "តួអក្សរទី %1 នៃ %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "ប្រវែងនៃ %1", - "OPERATORS_CONTAINS": "%1 មាន %2?", - "OPERATORS_MOD": "សំណល់នៃ %1 ចែកនឹង %2", - "OPERATORS_ROUND": "បង្គត់ %1", - "OPERATORS_MATHOP": "%1 នៃ %2", - "OPERATORS_MATHOP_ABS": "តម្លៃដាច់ខាត", - "OPERATORS_MATHOP_FLOOR": "បង្គត់ចុះ", - "OPERATORS_MATHOP_CEILING": "បង្គត់ឡើង", - "OPERATORS_MATHOP_SQRT": "ឫស​ការ៉េ", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "កំណត់ន័យ %1", - "SENSING_TOUCHINGOBJECT": "ប៉ះ %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "ព្រួញម៉ៅស៍", - "SENSING_TOUCHINGOBJECT_EDGE": "គែម", - "SENSING_TOUCHINGCOLOR": "ប៉ះពណ៌ %1?", - "SENSING_COLORISTOUCHINGCOLOR": "ពណ៌ %1 ប៉ះ %2?", - "SENSING_DISTANCETO": "ចម្ងាយពី %1", - "SENSING_DISTANCETO_POINTER": "ព្រួញម៉ៅស៍", - "SENSING_ASKANDWAIT": "សួរ %1 ហើយចាំ", - "SENSING_ASK_TEXT": "តើអ្នកឈ្មោះអ្វី?", - "SENSING_ANSWER": "ចម្លើយ", - "SENSING_KEYPRESSED": "ច្នុច %1 ត្រូវបានចុច?", - "SENSING_MOUSEDOWN": "ចុចម៉ៅស៍?", - "SENSING_MOUSEX": "ទីតាំងព្រួញម៉ៅស៍ x", - "SENSING_MOUSEY": "ទីតាំងព្រួញម៉ៅស៍ y", - "SENSING_SETDRAGMODE": "ដាក់ម៉ូតអូស %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "អាចអូសបាន", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "មិនអាចអូសបាន", - "SENSING_LOUDNESS": "កម្រិតឮ", - "SENSING_LOUD": "លឺ?", - "SENSING_TIMER": "ម៉ោងរាប់ថយក្រោយ", - "SENSING_RESETTIMER": "កំណត់ម៉ោងរាប់ថយក្រោយឡើងវិញ", - "SENSING_OF": "%1 នៃ %2", - "SENSING_OF_XPOSITION": "ទីតាំង x ", - "SENSING_OF_YPOSITION": "ទីតាំង y", - "SENSING_OF_DIRECTION": "ទិសដៅ", - "SENSING_OF_COSTUMENUMBER": "រូបរាង #", - "SENSING_OF_COSTUMENAME": "ឈ្មោះរូបរាង", - "SENSING_OF_SIZE": "ទំហំ", - "SENSING_OF_VOLUME": "កម្រិតសម្លេង", - "SENSING_OF_BACKDROPNUMBER": "ផ្ទាំងខាងក្រោយ #", - "SENSING_OF_BACKDROPNAME": "ឈ្មោះផ្ទាំងខាងក្រោយ", - "SENSING_OF_STAGE": "ឆាក", - "SENSING_CURRENT": "%1 បច្ចុប្បន្ន", - "SENSING_CURRENT_YEAR": "ឆ្នាំ", - "SENSING_CURRENT_MONTH": "ខែ", - "SENSING_CURRENT_DATE": "ថ្ងៃខែ", - "SENSING_CURRENT_DAYOFWEEK": "ថ្ងៃប្រចាំសប្តាហ៍", - "SENSING_CURRENT_HOUR": "ម៉ោង", - "SENSING_CURRENT_MINUTE": "នាទី", - "SENSING_CURRENT_SECOND": "វិនាទី", - "SENSING_DAYSSINCE2000": "ចំនួនថ្ងៃចាប់ពីឆ្នាំ 2000", - "SENSING_USERNAME": "ឈ្មោះគណនី", - "SENSING_USERID": "លេខសម្គាល់អ្នកប្រើ", - "SOUND_PLAY": "ផ្តើមសម្លេង %1", - "SOUND_PLAYUNTILDONE": "លេងសម្លេង %1 រហូតដល់ចប់", - "SOUND_STOPALLSOUNDS": "បញ្ឈប់សម្លេងទាំងអស់", - "SOUND_SETEFFECTO": "ដាក់បែបផែន %1 ត្រឹម %2", - "SOUND_CHANGEEFFECTBY": "ប្តូរបែបផែន %1 ចំនួន %2", - "SOUND_CLEAREFFECTS": "លុបបែបផែនសម្លេង", - "SOUND_EFFECTS_PITCH": "កម្រិតខ្ពស់ទាប", - "SOUND_EFFECTS_PAN": "កម្រិតឆ្វេងស្តាំ", - "SOUND_CHANGEVOLUMEBY": "ប្តូរកម្រិតសម្លេងចំនួន %1", - "SOUND_SETVOLUMETO": "ដាក់កម្រិតសម្លេងត្រឹម %1%", - "SOUND_VOLUME": "កម្រិតសម្លេង", - "SOUND_RECORD": "ថតសម្លេង...", - "CATEGORY_MOTION": "ចលនា", - "CATEGORY_LOOKS": "រូបរាង", - "CATEGORY_SOUND": "សម្លេង", - "CATEGORY_EVENTS": "ព្រឹត្តិការណ៍", - "CATEGORY_CONTROL": "គ្រប់គ្រង", - "CATEGORY_SENSING": "ញ្ញាណ", - "CATEGORY_OPERATORS": "ប្រមាណវិធី", - "CATEGORY_VARIABLES": "អថេរ", - "CATEGORY_MYBLOCKS": "ប្លុកខ្ញុំ", - "DUPLICATE": "ចម្លង", - "DELETE": "លុប", - "ADD_COMMENT": "ដាក់មតិ", - "REMOVE_COMMENT": "លុបមតិ", - "DELETE_BLOCK": "លុបប្លុក", - "DELETE_X_BLOCKS": "លុបប្លុក %1", - "DELETE_ALL_BLOCKS": "លុបប្លុកទាំង %1?", - "CLEAN_UP": "រៀបរយប្លុក", - "HELP": "ជំនួយ", - "UNDO": "មិនធ្វើវិញ", - "REDO": "ធ្វើឡើងវិញ", - "EDIT_PROCEDURE": "កែសម្រួល", - "SHOW_PROCEDURE_DEFINITION": "ទៅកាន់និយមន័យ", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "និយាយអ្វីមួយ...", - "COLOUR_HUE_LABEL": "ពណ៌", - "COLOUR_SATURATION_LABEL": "កម្រិតដិត", - "COLOUR_BRIGHTNESS_LABEL": "កម្រិតពន្លឺ", - "CHANGE_VALUE_TITLE": "ប្តូរតម្លៃ៖", - "RENAME_VARIABLE": "កែឈ្មោះអថេរ", - "RENAME_VARIABLE_TITLE": "កែឈ្មោះអថេរ \"%1\" ទាំងអស់ទៅជា៖", - "RENAME_VARIABLE_MODAL_TITLE": "កែឈ្មោះអថេរ", - "NEW_VARIABLE": "បង្កើតអថេរ", - "NEW_VARIABLE_TITLE": "ឈ្មោះអថេរថ្មី ៖", - "VARIABLE_MODAL_TITLE": "អថេរថ្មី", - "VARIABLE_ALREADY_EXISTS": "អថេរឈ្មោះ \"%1\" មានរួចហើយ", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "អថេរឈ្មោះ \"%1\" មានរួចហើយសម្រាប់អថេរប្រភេទ \"%2\"។", - "DELETE_VARIABLE_CONFIRMATION": "លុបអថេរ \"%2\" និងការប្រើប្រាស់ %1 ដងរបស់វា?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "មិនអាចលុបអថេរ \"%1\" ទេព្រោះវាទាក់ទងនឹងអនុគមន៍ \"%2\"", - "DELETE_VARIABLE": "លុបអថេរ \"%1\"", - "NEW_PROCEDURE": "បង្កើតប្លុកមួយ", - "PROCEDURE_ALREADY_EXISTS": "ដំណាក់កាលឈ្មោះ \"%1\" មានរួចហើយ។", - "PROCEDURE_DEFAULT_NAME": "ឈ្មោះប្លុក", - "NEW_LIST": "បង្កើតបញ្ជី", - "NEW_LIST_TITLE": "ឈ្មោះបញ្ជីថ្មី៖", - "LIST_MODAL_TITLE": "បញ្ជីថ្មី", - "LIST_ALREADY_EXISTS": "បញ្ជីឈ្មោះ \"%1\" មានរួចហើយ។", - "RENAME_LIST_TITLE": "កែឈ្មោះបញ្ជី \"%1\" ទាំងអស់ទៅជា៖", - "RENAME_LIST_MODAL_TITLE": "កែឈ្មោះបញ្ជី", - "DEFAULT_LIST_ITEM": "វត្ថុ", - "DELETE_LIST": "លុបបញ្ជី \"%1\"", - "RENAME_LIST": "កែឈ្មោះបញ្ជី", - "NEW_BROADCAST_MESSAGE": "សារថ្មី", - "NEW_BROADCAST_MESSAGE_TITLE": "ឈ្មោះសារថ្មី៖", - "BROADCAST_MODAL_TITLE": "សារថ្មី", - "DEFAULT_BROADCAST_MESSAGE_NAME": "សារ 1" -}; - -Blockly.ScratchMsgs.locales["pl"] = -{ - "CONTROL_FOREVER": "zawsze", - "CONTROL_REPEAT": "powtarzaj %1", - "CONTROL_IF": "jeżeli %1 to", - "CONTROL_ELSE": "w przeciwnym razie", - "CONTROL_STOP": "zatrzymaj", - "CONTROL_STOP_ALL": "wszystko", - "CONTROL_STOP_THIS": "ten skrypt", - "CONTROL_STOP_OTHER": "inne skrypty duszka", - "CONTROL_WAIT": "czekaj %1 sekund", - "CONTROL_WAITUNTIL": "czekaj aż %1", - "CONTROL_REPEATUNTIL": "powtarzaj aż %1", - "CONTROL_WHILE": "podczas gdy %1", - "CONTROL_FOREACH": "dla każdego %1 z %2", - "CONTROL_STARTASCLONE": "gdy zaczynam jako klon", - "CONTROL_CREATECLONEOF": "utwórz klona z %1", - "CONTROL_CREATECLONEOF_MYSELF": "siebie", - "CONTROL_DELETETHISCLONE": "usuń tego klona", - "CONTROL_COUNTER": "licznik", - "CONTROL_INCRCOUNTER": "zwiększ licznik", - "CONTROL_CLEARCOUNTER": "zeruj licznik", - "CONTROL_ALLATONCE": "wszystko na raz", - "DATA_SETVARIABLETO": "ustaw %1 na %2", - "DATA_CHANGEVARIABLEBY": "zmień %1 o %2", - "DATA_SHOWVARIABLE": "pokaż zmienną %1", - "DATA_HIDEVARIABLE": "ukryj zmienną %1", - "DATA_ADDTOLIST": "dodaj %1 do %2", - "DATA_DELETEOFLIST": "usuń %1 z %2", - "DATA_DELETEALLOFLIST": "usuń wszystko z %1", - "DATA_INSERTATLIST": "wstaw %1 na %2 pozycji z %3", - "DATA_REPLACEITEMOFLIST": "zamień %1 z %2 na %3", - "DATA_ITEMOFLIST": "element %1 z %2", - "DATA_ITEMNUMOFLIST": "pozycja %1 na liście %2", - "DATA_LENGTHOFLIST": "długość %1", - "DATA_LISTCONTAINSITEM": "%1 zawiera %2?", - "DATA_SHOWLIST": "pokaż listę %1", - "DATA_HIDELIST": "ukryj listę %1", - "DATA_INDEX_ALL": "wszystko", - "DATA_INDEX_LAST": "ostatni", - "DATA_INDEX_RANDOM": "losowa", - "EVENT_WHENFLAGCLICKED": "kiedy kliknięto %1", - "EVENT_WHENTHISSPRITECLICKED": "kiedy ten duszek kliknięty", - "EVENT_WHENSTAGECLICKED": "kiedy scena kliknięta", - "EVENT_WHENTOUCHINGOBJECT": "kiedy ten duszek dotknie %1", - "EVENT_WHENBROADCASTRECEIVED": "kiedy otrzymam %1", - "EVENT_WHENBACKDROPSWITCHESTO": "kiedy tło zmieni się na %1", - "EVENT_WHENGREATERTHAN": "kiedy %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "stoper", - "EVENT_WHENGREATERTHAN_LOUDNESS": "głośność", - "EVENT_BROADCAST": "nadaj komunikat %1", - "EVENT_BROADCASTANDWAIT": "nadaj komunikat %1 i czekaj", - "EVENT_WHENKEYPRESSED": "kiedy klawisz %1 naciśnięty", - "EVENT_WHENKEYPRESSED_SPACE": "spacja", - "EVENT_WHENKEYPRESSED_LEFT": "strzałka w lewo", - "EVENT_WHENKEYPRESSED_RIGHT": "strzałka w prawo", - "EVENT_WHENKEYPRESSED_DOWN": "strzałka w dół", - "EVENT_WHENKEYPRESSED_UP": "strzałka w górę", - "EVENT_WHENKEYPRESSED_ANY": "dowolny", - "LOOKS_SAYFORSECS": "powiedz %1 przez %2 sekund", - "LOOKS_SAY": "powiedz %1", - "LOOKS_HELLO": "Cześć!", - "LOOKS_THINKFORSECS": "pomyśl %1 przez %2 sekund", - "LOOKS_THINK": "pomyśl %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "pokaż", - "LOOKS_HIDE": "ukryj", - "LOOKS_HIDEALLSPRITES": "ukryj wszystkie duszki", - "LOOKS_EFFECT_COLOR": "kolor", - "LOOKS_EFFECT_FISHEYE": "rybie oko", - "LOOKS_EFFECT_WHIRL": "wir", - "LOOKS_EFFECT_PIXELATE": "zniekształć", - "LOOKS_EFFECT_MOSAIC": "mozaika", - "LOOKS_EFFECT_BRIGHTNESS": "jasność", - "LOOKS_EFFECT_GHOST": "duch", - "LOOKS_CHANGEEFFECTBY": "zmień efekt %1 o %2", - "LOOKS_SETEFFECTTO": "ustaw efekt %1 na %2", - "LOOKS_CLEARGRAPHICEFFECTS": "wyczyść efekty graficzne", - "LOOKS_CHANGESIZEBY": "zmień rozmiar o %1", - "LOOKS_SETSIZETO": "ustaw rozmiar na %1 %", - "LOOKS_SIZE": "rozmiar", - "LOOKS_CHANGESTRETCHBY": "zmień rozciągnięcie o %1", - "LOOKS_SETSTRETCHTO": "ustaw rozciąganie na %1 %", - "LOOKS_SWITCHCOSTUMETO": "zmień kostium na %1", - "LOOKS_NEXTCOSTUME": "następny kostium", - "LOOKS_SWITCHBACKDROPTO": "zmień tło na %1", - "LOOKS_GOTOFRONTBACK": "przesuń na %1", - "LOOKS_GOTOFRONTBACK_FRONT": "na wierzch", - "LOOKS_GOTOFRONTBACK_BACK": "na spód", - "LOOKS_GOFORWARDBACKWARDLAYERS": "przesuń %1 o %2 warstw", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "do przodu", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "do tyłu", - "LOOKS_BACKDROPNUMBERNAME": "tło %1", - "LOOKS_COSTUMENUMBERNAME": "kostium %1", - "LOOKS_NUMBERNAME_NUMBER": "liczba", - "LOOKS_NUMBERNAME_NAME": "nazwa", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "zmień tło na %1 i czekaj", - "LOOKS_NEXTBACKDROP_BLOCK": "następne tło", - "LOOKS_NEXTBACKDROP": "następne tło", - "LOOKS_PREVIOUSBACKDROP": "poprzednie tło", - "LOOKS_RANDOMBACKDROP": "losowo wybrane tło", - "MOTION_MOVESTEPS": "przesuń o %1 kroków", - "MOTION_TURNLEFT": "obróć %1 o %2 stopni", - "MOTION_TURNRIGHT": "obróć %1 o %2 stopni", - "MOTION_POINTINDIRECTION": "ustaw kierunek na %1", - "MOTION_POINTTOWARDS": "ustaw w kierunku duszka %1", - "MOTION_POINTTOWARDS_POINTER": "wskaźnik myszy", - "MOTION_POINTTOWARDS_RANDOM": "losowy kierunek", - "MOTION_GOTO": "idź do %1", - "MOTION_GOTO_POINTER": "wskaźnik myszy", - "MOTION_GOTO_RANDOM": "losowa pozycja", - "MOTION_GOTOXY": "Idź do x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "leć przez %1 sekund do x: %2 y: %3", - "MOTION_GLIDETO": "leć przez %1 sekund do %2", - "MOTION_GLIDETO_POINTER": "wskaźnik myszy", - "MOTION_GLIDETO_RANDOM": "losowa pozycja", - "MOTION_CHANGEXBY": "zmień x o %1", - "MOTION_SETX": "ustaw x na %1", - "MOTION_CHANGEYBY": "zmień y o %1", - "MOTION_SETY": "ustaw y na %1", - "MOTION_IFONEDGEBOUNCE": "jeżeli na brzegu, odbij się", - "MOTION_SETROTATIONSTYLE": "ustaw styl obrotu na %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "lewo-prawo", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "nie obracaj", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "dookoła", - "MOTION_XPOSITION": "pozycja x", - "MOTION_YPOSITION": "pozycja y", - "MOTION_DIRECTION": "kierunek", - "MOTION_SCROLLRIGHT": "przewiń w prawo %1", - "MOTION_SCROLLUP": "przewiń w górę %1", - "MOTION_ALIGNSCENE": "wyrównaj scenę %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "na dole po lewej stronie", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "na dole z prawej stronie", - "MOTION_ALIGNSCENE_MIDDLE": "środek", - "MOTION_ALIGNSCENE_TOPLEFT": "na górze po lewej stronie", - "MOTION_ALIGNSCENE_TOPRIGHT": "na górze po prawej stronie", - "MOTION_XSCROLL": "przewijanie x", - "MOTION_YSCROLL": "przewijanie y", - "MOTION_STAGE_SELECTED": "wybrana scena: bez bloków ruchu", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "losuj liczbę od %1 do %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 i %2", - "OPERATORS_OR": "%1 lub %2", - "OPERATORS_NOT": "nie %1", - "OPERATORS_JOIN": "połącz %1 i %2", - "OPERATORS_JOIN_APPLE": "jabłko", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "litera %1 z %2", - "OPERATORS_LETTEROF_APPLE": "j", - "OPERATORS_LENGTH": "długość %1", - "OPERATORS_CONTAINS": "Czy %1 zawiera %2 ?", - "OPERATORS_MOD": "reszta z dzielenia %1 przez %2", - "OPERATORS_ROUND": "zaokrąglij %1", - "OPERATORS_MATHOP": "%1 z %2", - "OPERATORS_MATHOP_ABS": "wartość bezwzględna", - "OPERATORS_MATHOP_FLOOR": "podłoga", - "OPERATORS_MATHOP_CEILING": "sufit", - "OPERATORS_MATHOP_SQRT": "pierwiastek kwadratowy", - "OPERATORS_MATHOP_SIN": "sinus", - "OPERATORS_MATHOP_COS": "cosinus", - "OPERATORS_MATHOP_TAN": "tangens", - "OPERATORS_MATHOP_ASIN": "arcus sinus", - "OPERATORS_MATHOP_ACOS": "arcus cosinus", - "OPERATORS_MATHOP_ATAN": "arcus tangens", - "OPERATORS_MATHOP_LN": "logarytm naturalny", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definiuj %1", - "SENSING_TOUCHINGOBJECT": "dotyka %1 ?", - "SENSING_TOUCHINGOBJECT_POINTER": "wskaźnik myszy", - "SENSING_TOUCHINGOBJECT_EDGE": "krawędź", - "SENSING_TOUCHINGCOLOR": "dotyka koloru %1 ?", - "SENSING_COLORISTOUCHINGCOLOR": "kolor %1 dotyka %2 ? ", - "SENSING_DISTANCETO": "odległość od %1", - "SENSING_DISTANCETO_POINTER": "wskaźnik myszy", - "SENSING_ASKANDWAIT": "zapytaj %1 i czekaj", - "SENSING_ASK_TEXT": "Jak się nazywasz?", - "SENSING_ANSWER": "odpowiedź", - "SENSING_KEYPRESSED": "klawisz %1 naciśnięty ?", - "SENSING_MOUSEDOWN": "kliknięto myszką?", - "SENSING_MOUSEX": "x myszy", - "SENSING_MOUSEY": "y myszy", - "SENSING_SETDRAGMODE": "ustaw tryb przeciągania na %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "z przeciąganiem", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "bez przeciągania", - "SENSING_LOUDNESS": "głośność", - "SENSING_LOUD": "głośno?", - "SENSING_TIMER": "stoper", - "SENSING_RESETTIMER": "resetuj stoper", - "SENSING_OF": "%1 z %2", - "SENSING_OF_XPOSITION": "pozycja x", - "SENSING_OF_YPOSITION": "pozycja y", - "SENSING_OF_DIRECTION": "kierunek", - "SENSING_OF_COSTUMENUMBER": "indeks kostiumu", - "SENSING_OF_COSTUMENAME": "nazwa kostiumu", - "SENSING_OF_SIZE": "rozmiar", - "SENSING_OF_VOLUME": "głośność", - "SENSING_OF_BACKDROPNUMBER": "indeks tła", - "SENSING_OF_BACKDROPNAME": "nazwa tła", - "SENSING_OF_STAGE": "scena", - "SENSING_CURRENT": "obecny %1", - "SENSING_CURRENT_YEAR": "rok", - "SENSING_CURRENT_MONTH": "miesiąc", - "SENSING_CURRENT_DATE": "dzień", - "SENSING_CURRENT_DAYOFWEEK": "dzień tygodnia", - "SENSING_CURRENT_HOUR": "godzina", - "SENSING_CURRENT_MINUTE": "minuta", - "SENSING_CURRENT_SECOND": "sekunda", - "SENSING_DAYSSINCE2000": "dni od 2000", - "SENSING_USERNAME": "nazwa użytkownika", - "SENSING_USERID": "ID użytkownika", - "SOUND_PLAY": "zagraj dźwięk %1", - "SOUND_PLAYUNTILDONE": "graj dźwięk %1 aż się skończy", - "SOUND_STOPALLSOUNDS": "zakończ wszystkie dźwięki", - "SOUND_SETEFFECTO": "ustaw efekt %1 na %2", - "SOUND_CHANGEEFFECTBY": "zmień efekt %1 o %2", - "SOUND_CLEAREFFECTS": "usuń efekty dźwiękowe", - "SOUND_EFFECTS_PITCH": "płynność dźwięku", - "SOUND_EFFECTS_PAN": "przesuń w lewo/prawo", - "SOUND_CHANGEVOLUMEBY": "zmień głośność o %1", - "SOUND_SETVOLUMETO": "ustaw głośność na %1%", - "SOUND_VOLUME": "głośność", - "SOUND_RECORD": "nagraj...", - "CATEGORY_MOTION": "Ruch", - "CATEGORY_LOOKS": "Wygląd", - "CATEGORY_SOUND": "Dźwięk", - "CATEGORY_EVENTS": "Zdarzenia", - "CATEGORY_CONTROL": "Kontrola", - "CATEGORY_SENSING": "Czujniki", - "CATEGORY_OPERATORS": "Wyrażenia", - "CATEGORY_VARIABLES": "Zmienne", - "CATEGORY_MYBLOCKS": "Moje bloki", - "DUPLICATE": "Duplikuj", - "DELETE": "Usuń", - "ADD_COMMENT": "Dodaj komentarz", - "REMOVE_COMMENT": "Usuń komentarz", - "DELETE_BLOCK": "Usuń blok", - "DELETE_X_BLOCKS": "Usuń %1 bloków", - "DELETE_ALL_BLOCKS": "Czy usunąć wszystkie %1 bloków?", - "CLEAN_UP": "Posprzątaj bloki", - "HELP": "Pomoc", - "UNDO": "Cofnij", - "REDO": "Ponów", - "EDIT_PROCEDURE": "Edycja", - "SHOW_PROCEDURE_DEFINITION": "Przejdź do definicji", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Powiedz coś...", - "COLOUR_HUE_LABEL": "Kolor", - "COLOUR_SATURATION_LABEL": "Nasycenie", - "COLOUR_BRIGHTNESS_LABEL": "Jasność", - "CHANGE_VALUE_TITLE": "Zmień wartość:", - "RENAME_VARIABLE": "Zmień nazwę zmiennej", - "RENAME_VARIABLE_TITLE": "Zmień nazwę wszystkich zmiennych \"%1\" na:", - "RENAME_VARIABLE_MODAL_TITLE": "Zmień nazwę zmiennej", - "NEW_VARIABLE": "Utwórz zmienną", - "NEW_VARIABLE_TITLE": "Nowa nazwa zmiennej:", - "VARIABLE_MODAL_TITLE": "Nowa zmienna", - "VARIABLE_ALREADY_EXISTS": "Zmienna o nazwie \"%1\" już istnieje.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Zmienna o nazwie \"%1\" już istnieje dla innego typu zmiennej \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Czy usunąć %1 używając zmiennej \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nie można usunąć zmiennej \"%1\", ponieważ stanowi część definicji funkcji \"%2\"", - "DELETE_VARIABLE": "Usuń zmienną \"%1\"", - "NEW_PROCEDURE": "Utwórz blok", - "PROCEDURE_ALREADY_EXISTS": "Procedura o nazwie \"%1\" już istnieje.", - "PROCEDURE_DEFAULT_NAME": "nazwa bloku", - "NEW_LIST": "Stwórz listę", - "NEW_LIST_TITLE": "Nowa nazwa lista:", - "LIST_MODAL_TITLE": "Nowa lista", - "LIST_ALREADY_EXISTS": "Lista o nazwie \"%1\" już istnieje.", - "RENAME_LIST_TITLE": "Zmień nazwy wszystkich list \"%1\" na:", - "RENAME_LIST_MODAL_TITLE": "Zmień nazwę listy", - "DEFAULT_LIST_ITEM": "obiekt", - "DELETE_LIST": "Usuń listę \"%1\"", - "RENAME_LIST": "Zmień nazwę listy", - "NEW_BROADCAST_MESSAGE": "Nowa wiadomość", - "NEW_BROADCAST_MESSAGE_TITLE": "Nowa nazwa wiadomości:", - "BROADCAST_MODAL_TITLE": "Nowa wiadomość", - "DEFAULT_BROADCAST_MESSAGE_NAME": "wiadomość1" -}; - -Blockly.ScratchMsgs.locales["pt"] = -{ - "CONTROL_FOREVER": "repete para sempre", - "CONTROL_REPEAT": "repete %1 vezes", - "CONTROL_IF": "se %1 , então", - "CONTROL_ELSE": "senão,", - "CONTROL_STOP": "pára", - "CONTROL_STOP_ALL": "tudo", - "CONTROL_STOP_THIS": "este guião", - "CONTROL_STOP_OTHER": "os teus outros guiões", - "CONTROL_WAIT": "espera %1 s", - "CONTROL_WAITUNTIL": "espera até que %1", - "CONTROL_REPEATUNTIL": "até que %1 , repete", - "CONTROL_WHILE": "enquanto %1", - "CONTROL_FOREACH": "para cada %1 em %2", - "CONTROL_STARTASCLONE": "Quando fores criado como um clone", - "CONTROL_CREATECLONEOF": "cria um clone de %1", - "CONTROL_CREATECLONEOF_MYSELF": "ti mesmo", - "CONTROL_DELETETHISCLONE": "remove-te como clone", - "CONTROL_COUNTER": "contador", - "CONTROL_INCRCOUNTER": "incrementa o contador", - "CONTROL_CLEARCOUNTER": "põe o contador a zero", - "CONTROL_ALLATONCE": "executa tudo de uma vez", - "DATA_SETVARIABLETO": "altera %1 para %2", - "DATA_CHANGEVARIABLEBY": "adiciona a %1 o valor %2", - "DATA_SHOWVARIABLE": "mostra a variável %1", - "DATA_HIDEVARIABLE": "esconde a variável %1", - "DATA_ADDTOLIST": "acrescenta %1 a %2", - "DATA_DELETEOFLIST": "remove %1 de %2", - "DATA_DELETEALLOFLIST": "remove tudo de %1", - "DATA_INSERTATLIST": "insere %1 como %2 de %3", - "DATA_REPLACEITEMOFLIST": "substitui %1 de %2 por %3", - "DATA_ITEMOFLIST": "%1 de %2", - "DATA_ITEMNUMOFLIST": "o número do item %1 em %2", - "DATA_LENGTHOFLIST": "o comprimento de %1", - "DATA_LISTCONTAINSITEM": "%1 contém %2", - "DATA_SHOWLIST": "mostra a lista %1", - "DATA_HIDELIST": "esconde a lista %1", - "DATA_INDEX_ALL": "tudo", - "DATA_INDEX_LAST": "o último item", - "DATA_INDEX_RANDOM": "um item ao acaso", - "EVENT_WHENFLAGCLICKED": "Quando alguém clicar em %1", - "EVENT_WHENTHISSPRITECLICKED": "Quando alguém clicar em ti", - "EVENT_WHENSTAGECLICKED": "Quando alguém clicar no palco", - "EVENT_WHENTOUCHINGOBJECT": "Quando tocares em %1", - "EVENT_WHENBROADCASTRECEIVED": "Quando receberes a mensagem %1", - "EVENT_WHENBACKDROPSWITCHESTO": "Quando o cenário mudar para %1", - "EVENT_WHENGREATERTHAN": "Quando o valor do sensor %1 exceder %2", - "EVENT_WHENGREATERTHAN_TIMER": "o valor do cronómetro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "o volume no microfone", - "EVENT_BROADCAST": "difunde a mensagem %1", - "EVENT_BROADCASTANDWAIT": "difunde a mensagem %1 e espera", - "EVENT_WHENKEYPRESSED": "Quando alguém pressionar a tecla %1", - "EVENT_WHENKEYPRESSED_SPACE": "espaço", - "EVENT_WHENKEYPRESSED_LEFT": "seta para a esquerda", - "EVENT_WHENKEYPRESSED_RIGHT": "seta para a direita", - "EVENT_WHENKEYPRESSED_DOWN": "seta para baixo", - "EVENT_WHENKEYPRESSED_UP": "seta para cima", - "EVENT_WHENKEYPRESSED_ANY": "qualquer", - "LOOKS_SAYFORSECS": "diz %1 durante %2 s", - "LOOKS_SAY": "diz %1", - "LOOKS_HELLO": "Olá!", - "LOOKS_THINKFORSECS": "pensa %1 durante %2 s", - "LOOKS_THINK": "pensa %1", - "LOOKS_HMM": "Hmm…", - "LOOKS_SHOW": "mostra-te", - "LOOKS_HIDE": "esconde-te", - "LOOKS_HIDEALLSPRITES": "esconde todos os actores", - "LOOKS_EFFECT_COLOR": "cor", - "LOOKS_EFFECT_FISHEYE": "olho de peixe", - "LOOKS_EFFECT_WHIRL": "remoinho", - "LOOKS_EFFECT_PIXELATE": "pixelização", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "brilho", - "LOOKS_EFFECT_GHOST": "fantasma", - "LOOKS_CHANGEEFFECTBY": "adiciona ao teu efeito %1 o valor %2", - "LOOKS_SETEFFECTTO": "altera o teu efeito %1 para %2", - "LOOKS_CLEARGRAPHICEFFECTS": "cancela os teus efeitos gráficos", - "LOOKS_CHANGESIZEBY": "adiciona %1 ao teu tamanho", - "LOOKS_SETSIZETO": "altera o teu tamanho para %1 %", - "LOOKS_SIZE": "o tamanho", - "LOOKS_CHANGESTRETCHBY": "adiciona %1 % ao esticamento", - "LOOKS_SETSTRETCHTO": "altera o esticamento para %1 %", - "LOOKS_SWITCHCOSTUMETO": "muda o teu traje para %1", - "LOOKS_NEXTCOSTUME": "passa para o teu próximo traje", - "LOOKS_SWITCHBACKDROPTO": "muda o cenário para %1", - "LOOKS_GOTOFRONTBACK": "vai para a camada %1", - "LOOKS_GOTOFRONTBACK_FRONT": "frontal", - "LOOKS_GOTOFRONTBACK_BACK": "traseira", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 camadas", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "avança", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "recua", - "LOOKS_BACKDROPNUMBERNAME": "%1 do cenário", - "LOOKS_COSTUMENUMBERNAME": "%1 do traje", - "LOOKS_NUMBERNAME_NUMBER": "o número", - "LOOKS_NUMBERNAME_NAME": "o nome", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "muda o cenário para %1 e espera", - "LOOKS_NEXTBACKDROP_BLOCK": "passa para o teu próximo cenário", - "LOOKS_NEXTBACKDROP": "passa para o teu próximo cenário", - "LOOKS_PREVIOUSBACKDROP": "o cenário anterior", - "LOOKS_RANDOMBACKDROP": "um cenário ao acaso", - "MOTION_MOVESTEPS": "anda %1 passos", - "MOTION_TURNLEFT": "gira %1 %2 °", - "MOTION_TURNRIGHT": "gira %1 %2 °", - "MOTION_POINTINDIRECTION": "altera a tua direcção para %1 °", - "MOTION_POINTTOWARDS": "aponta em direcção a %1", - "MOTION_POINTTOWARDS_POINTER": "ponteiro do rato", - "MOTION_POINTTOWARDS_RANDOM": "uma direcção ao acaso", - "MOTION_GOTO": "vai para %1", - "MOTION_GOTO_POINTER": "o ponteiro do rato", - "MOTION_GOTO_RANDOM": "uma posição ao acaso", - "MOTION_GOTOXY": "vai para a posição x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "desliza em %1 s para a posição x: %2 y: %3", - "MOTION_GLIDETO": "desliza em %1 s em direcção a%2", - "MOTION_GLIDETO_POINTER": "o ponteiro do rato", - "MOTION_GLIDETO_RANDOM": "uma posição ao acaso", - "MOTION_CHANGEXBY": "adiciona %1 ao teu x", - "MOTION_SETX": "altera o teu x para %1", - "MOTION_CHANGEYBY": "adiciona %1 ao teu y", - "MOTION_SETY": "altera o teu y para %1", - "MOTION_IFONEDGEBOUNCE": "se estiveres a bater na borda, ressalta", - "MOTION_SETROTATIONSTYLE": "altera o teu estilo de rotação para %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "olha apenas para a esquerda e para a direita", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "não gires", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "gira a toda a volta", - "MOTION_XPOSITION": "o x da tua posição", - "MOTION_YPOSITION": "o y da tua posição", - "MOTION_DIRECTION": "a direcção", - "MOTION_SCROLLRIGHT": "rola %1 para a direita", - "MOTION_SCROLLUP": "rola %1 para cima", - "MOTION_ALIGNSCENE": "alinha a cena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "ao fundo e à esquerda", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "ao fundo e à direita", - "MOTION_ALIGNSCENE_MIDDLE": "a meio", - "MOTION_ALIGNSCENE_TOPLEFT": "no topo e à esquerda", - "MOTION_ALIGNSCENE_TOPRIGHT": "no topo e à direita", - "MOTION_XSCROLL": "o rolamento em x", - "MOTION_YSCROLL": "o rolamento em y", - "MOTION_STAGE_SELECTED": "Palco seleccionado: não tem blocos de movimento", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 − %2", - "OPERATORS_MULTIPLY": "%1 × %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "um valor ao acaso entre %1 e %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 e %2", - "OPERATORS_OR": "%1 ou %2", - "OPERATORS_NOT": "é falso que %1", - "OPERATORS_JOIN": "a junção de %1 com %2", - "OPERATORS_JOIN_APPLE": "maçã", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "o caractere %1 de %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "o comprimento de %1", - "OPERATORS_CONTAINS": "%1 contém %2", - "OPERATORS_MOD": "o resto de %1 a dividir por %2", - "OPERATORS_ROUND": "o arredondamento de %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "o valor absoluto", - "OPERATORS_MATHOP_FLOOR": "o chão (o maior inteiro não superior)", - "OPERATORS_MATHOP_CEILING": "o tecto (menor inteiro não inferior)", - "OPERATORS_MATHOP_SQRT": "a raiz quadrada", - "OPERATORS_MATHOP_SIN": "o seno", - "OPERATORS_MATHOP_COS": "o cosseno", - "OPERATORS_MATHOP_TAN": "a tangente", - "OPERATORS_MATHOP_ASIN": "o arco-seno", - "OPERATORS_MATHOP_ACOS": "o arco-cosseno", - "OPERATORS_MATHOP_ATAN": "o arco-tangente", - "OPERATORS_MATHOP_LN": "o logaritmo natural", - "OPERATORS_MATHOP_LOG": "o logaritmo", - "OPERATORS_MATHOP_EEXP": "a exponencial", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "Define %1", - "SENSING_TOUCHINGOBJECT": "estás a tocar em %1", - "SENSING_TOUCHINGOBJECT_POINTER": "o ponteiro do rato", - "SENSING_TOUCHINGOBJECT_EDGE": "a borda", - "SENSING_TOUCHINGCOLOR": "estás a tocar na cor %1", - "SENSING_COLORISTOUCHINGCOLOR": "a cor %1 está a tocar na cor %2", - "SENSING_DISTANCETO": "a distância até %1", - "SENSING_DISTANCETO_POINTER": "o ponteiro do rato", - "SENSING_ASKANDWAIT": "pergunta %1 e espera pela resposta", - "SENSING_ASK_TEXT": "Como te chamas?", - "SENSING_ANSWER": "a resposta", - "SENSING_KEYPRESSED": "a tecla %1 está a ser pressionada", - "SENSING_MOUSEDOWN": "o botão do rato está pressionado", - "SENSING_MOUSEX": "o x da posição do rato", - "SENSING_MOUSEY": "o y da posição do rato", - "SENSING_SETDRAGMODE": "altera o teu modo de arrasto para %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrastável", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "não arrastável", - "SENSING_LOUDNESS": "o volume no microfone", - "SENSING_LOUD": "o som é forte", - "SENSING_TIMER": "o valor do cronómetro", - "SENSING_RESETTIMER": "reinicia o cronómetro", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "o x da posição", - "SENSING_OF_YPOSITION": "o y da posição", - "SENSING_OF_DIRECTION": "a direcção", - "SENSING_OF_COSTUMENUMBER": "o número do traje", - "SENSING_OF_COSTUMENAME": "o nome do traje", - "SENSING_OF_SIZE": "o tamanho", - "SENSING_OF_VOLUME": "o volume", - "SENSING_OF_BACKDROPNUMBER": "o número do cenário", - "SENSING_OF_BACKDROPNAME": "o nome do cenário", - "SENSING_OF_STAGE": "o palco", - "SENSING_CURRENT": "%1 actual", - "SENSING_CURRENT_YEAR": "o ano", - "SENSING_CURRENT_MONTH": "o mês", - "SENSING_CURRENT_DATE": "a data", - "SENSING_CURRENT_DAYOFWEEK": "o dia da semana", - "SENSING_CURRENT_HOUR": "a hora", - "SENSING_CURRENT_MINUTE": "o minuto", - "SENSING_CURRENT_SECOND": "o segundo", - "SENSING_DAYSSINCE2000": "o número de dias desde 2000", - "SENSING_USERNAME": "o nome de utilizador", - "SENSING_USERID": "o ID de utilizador", - "SOUND_PLAY": "toca o som %1", - "SOUND_PLAYUNTILDONE": "toca o som %1 até terminar", - "SOUND_STOPALLSOUNDS": "pára todos os sons", - "SOUND_SETEFFECTO": "altera o teu efeito %1 para %2", - "SOUND_CHANGEEFFECTBY": "adiciona ao teu efeito %1 o valor %2", - "SOUND_CLEAREFFECTS": "cancela todos os teus efeitos sonoros", - "SOUND_EFFECTS_PITCH": "tom", - "SOUND_EFFECTS_PAN": "canal esquerdo/direito", - "SOUND_CHANGEVOLUMEBY": "adiciona %1 % ao teu volume", - "SOUND_SETVOLUMETO": "altera o teu volume para %1%", - "SOUND_VOLUME": "o volume", - "SOUND_RECORD": "gravar…", - "CATEGORY_MOTION": "Movimento", - "CATEGORY_LOOKS": "Aparência", - "CATEGORY_SOUND": "Som", - "CATEGORY_EVENTS": "Eventos", - "CATEGORY_CONTROL": "Controlo", - "CATEGORY_SENSING": "Sensores", - "CATEGORY_OPERATORS": "Operadores", - "CATEGORY_VARIABLES": "Variáveis", - "CATEGORY_MYBLOCKS": "Os Meus Blocos", - "DUPLICATE": "Duplicar", - "DELETE": "Remover", - "ADD_COMMENT": "Adicionar Comentário", - "REMOVE_COMMENT": "Remover Comentário", - "DELETE_BLOCK": "Remover Bloco", - "DELETE_X_BLOCKS": "Remover %1 Blocos", - "DELETE_ALL_BLOCKS": "Remover todos os %1 blocos?", - "CLEAN_UP": "Arrumar Blocos", - "HELP": "Ajuda", - "UNDO": "Desfazer", - "REDO": "Refazer", - "EDIT_PROCEDURE": "Editar", - "SHOW_PROCEDURE_DEFINITION": "Ir para a definição", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diga qualquer coisa…", - "COLOUR_HUE_LABEL": "Matiz", - "COLOUR_SATURATION_LABEL": "Saturação", - "COLOUR_BRIGHTNESS_LABEL": "Brilho", - "CHANGE_VALUE_TITLE": "Alterar o valor:", - "RENAME_VARIABLE": "Renomear a variável", - "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis «%1» para:", - "RENAME_VARIABLE_MODAL_TITLE": "Renomear Variável", - "NEW_VARIABLE": "Criar uma Variável", - "NEW_VARIABLE_TITLE": "Novo nome da variável:", - "VARIABLE_MODAL_TITLE": "Nova Variável", - "VARIABLE_ALREADY_EXISTS": "Já existe uma variável com o nome «%1».", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Já existe uma variável com o nome «%1» do tipo «%2».", - "DELETE_VARIABLE_CONFIRMATION": "Remover %1 utilizações da variável «%2»?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Não é possível remover a variável «%1» porque é parte da definição da função «%2»", - "DELETE_VARIABLE": "Remover a variável «%1»", - "NEW_PROCEDURE": "Criar um Bloco", - "PROCEDURE_ALREADY_EXISTS": "Já existe um procedimento com o nome «%1».", - "PROCEDURE_DEFAULT_NAME": "nome do bloco", - "NEW_LIST": "Criar uma Lista", - "NEW_LIST_TITLE": "Nome da nova lista:", - "LIST_MODAL_TITLE": "Nova Lista", - "LIST_ALREADY_EXISTS": "Já existe uma lista com o nome «%1».", - "RENAME_LIST_TITLE": "Renomear todas as listas «%1» para:", - "RENAME_LIST_MODAL_TITLE": "Renomear Lista", - "DEFAULT_LIST_ITEM": "uma coisa", - "DELETE_LIST": "Remover a lista «%1»", - "RENAME_LIST": "Renomear a lista", - "NEW_BROADCAST_MESSAGE": "Nova mensagem", - "NEW_BROADCAST_MESSAGE_TITLE": "Nome da nova mensagem:", - "BROADCAST_MODAL_TITLE": "Nova Mensagem", - "DEFAULT_BROADCAST_MESSAGE_NAME": "Mensagem 1" -}; - -Blockly.ScratchMsgs.locales["pt-br"] = -{ - "CONTROL_FOREVER": "sempre", - "CONTROL_REPEAT": "repita %1 vezes", - "CONTROL_IF": "se %1 então", - "CONTROL_ELSE": "senão", - "CONTROL_STOP": "pare", - "CONTROL_STOP_ALL": "todos", - "CONTROL_STOP_THIS": "este script", - "CONTROL_STOP_OTHER": "outros scripts no ator", - "CONTROL_WAIT": "espere %1 seg", - "CONTROL_WAITUNTIL": "espere até que %1", - "CONTROL_REPEATUNTIL": "repita até que %1", - "CONTROL_WHILE": "enquanto %1", - "CONTROL_FOREACH": "para cada %1 em %2", - "CONTROL_STARTASCLONE": "quando eu começar como um clone", - "CONTROL_CREATECLONEOF": "crie clone de %1", - "CONTROL_CREATECLONEOF_MYSELF": "este ator", - "CONTROL_DELETETHISCLONE": "apague este clone", - "CONTROL_COUNTER": "contador", - "CONTROL_INCRCOUNTER": "desenvolver contador", - "CONTROL_CLEARCOUNTER": "limpar contador", - "CONTROL_ALLATONCE": "todos de uma vez", - "DATA_SETVARIABLETO": "mude %1 para %2", - "DATA_CHANGEVARIABLEBY": "adicione %2 a %1", - "DATA_SHOWVARIABLE": "mostre a variável %1", - "DATA_HIDEVARIABLE": "esconda a variável %1", - "DATA_ADDTOLIST": "adicione %1 a %2", - "DATA_DELETEOFLIST": "apague %1 de %2", - "DATA_DELETEALLOFLIST": "apague todos os itens de %1", - "DATA_INSERTATLIST": "insira %1 na posição %2 de %3", - "DATA_REPLACEITEMOFLIST": "substitua o item %1 de %2 por %3", - "DATA_ITEMOFLIST": "item %1 de %2", - "DATA_ITEMNUMOFLIST": "item # de %1 em %2", - "DATA_LENGTHOFLIST": "tamanho de %1", - "DATA_LISTCONTAINSITEM": "%1 contém %2?", - "DATA_SHOWLIST": "mostre a lista %1", - "DATA_HIDELIST": "esconda a lista %1", - "DATA_INDEX_ALL": "todos", - "DATA_INDEX_LAST": "último", - "DATA_INDEX_RANDOM": "aleatório", - "EVENT_WHENFLAGCLICKED": "quando %1 for clicado", - "EVENT_WHENTHISSPRITECLICKED": "quando este ator for clicado", - "EVENT_WHENSTAGECLICKED": "quando o palco for clicado", - "EVENT_WHENTOUCHINGOBJECT": "quando este ator tocar %1", - "EVENT_WHENBROADCASTRECEIVED": "quando eu receber %1", - "EVENT_WHENBACKDROPSWITCHESTO": "quando o cenário mudar para %1", - "EVENT_WHENGREATERTHAN": "quando %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronômetro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ruído", - "EVENT_BROADCAST": "transmita %1", - "EVENT_BROADCASTANDWAIT": "transmita %1 e espere", - "EVENT_WHENKEYPRESSED": "quando a tecla %1 for pressionada", - "EVENT_WHENKEYPRESSED_SPACE": "espaço", - "EVENT_WHENKEYPRESSED_LEFT": "seta para esquerda", - "EVENT_WHENKEYPRESSED_RIGHT": "seta para direita", - "EVENT_WHENKEYPRESSED_DOWN": "seta para baixo", - "EVENT_WHENKEYPRESSED_UP": "seta para cima", - "EVENT_WHENKEYPRESSED_ANY": "qualquer", - "LOOKS_SAYFORSECS": "diga %1 por %2 segundos", - "LOOKS_SAY": "diga %1", - "LOOKS_HELLO": "Olá!", - "LOOKS_THINKFORSECS": "pense %1 por %2 segundos", - "LOOKS_THINK": "pense %1", - "LOOKS_HMM": "Hummm...", - "LOOKS_SHOW": "mostre", - "LOOKS_HIDE": "esconda", - "LOOKS_HIDEALLSPRITES": "esconda todos os atores", - "LOOKS_EFFECT_COLOR": "cor", - "LOOKS_EFFECT_FISHEYE": "olho de peixe", - "LOOKS_EFFECT_WHIRL": "turbilhão", - "LOOKS_EFFECT_PIXELATE": "pixelado", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "brilho", - "LOOKS_EFFECT_GHOST": "fantasma", - "LOOKS_CHANGEEFFECTBY": "mude %2 ao efeito %1", - "LOOKS_SETEFFECTTO": "defina o efeito %1 como %2", - "LOOKS_CLEARGRAPHICEFFECTS": "remova os efeitos gráficos", - "LOOKS_CHANGESIZEBY": "mude %1 no tamanho", - "LOOKS_SETSIZETO": "defina o tamanho como %1 %", - "LOOKS_SIZE": "tamanho", - "LOOKS_CHANGESTRETCHBY": "mude trajeto por %1", - "LOOKS_SETSTRETCHTO": "defina curso para %1 %", - "LOOKS_SWITCHCOSTUMETO": "mude para a fantasia %1", - "LOOKS_NEXTCOSTUME": "próxima fantasia", - "LOOKS_SWITCHBACKDROPTO": "mude para o cenário %1", - "LOOKS_GOTOFRONTBACK": "Vá para a camada %1", - "LOOKS_GOTOFRONTBACK_FRONT": "da frente", - "LOOKS_GOTOFRONTBACK_BACK": "de trás", - "LOOKS_GOFORWARDBACKWARDLAYERS": "Vá para %1 %2 camadas", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "frente", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "trás", - "LOOKS_BACKDROPNUMBERNAME": "cenário %1", - "LOOKS_COSTUMENUMBERNAME": "fantasia %1", - "LOOKS_NUMBERNAME_NUMBER": "número", - "LOOKS_NUMBERNAME_NAME": "nome", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "mude para o cenário %1 e espere", - "LOOKS_NEXTBACKDROP_BLOCK": "próximo cenário", - "LOOKS_NEXTBACKDROP": "próximo cenário", - "LOOKS_PREVIOUSBACKDROP": "cenário anterior", - "LOOKS_RANDOMBACKDROP": "cenário aleatório", - "MOTION_MOVESTEPS": "mova %1 passos", - "MOTION_TURNLEFT": "gire %1 %2 graus", - "MOTION_TURNRIGHT": "gire %1 %2 graus", - "MOTION_POINTINDIRECTION": "aponte para a direção %1", - "MOTION_POINTTOWARDS": "aponte para %1", - "MOTION_POINTTOWARDS_POINTER": "ponteiro do mouse", - "MOTION_POINTTOWARDS_RANDOM": "direção aleatória", - "MOTION_GOTO": "vá para %1", - "MOTION_GOTO_POINTER": "ponteiro do mouse", - "MOTION_GOTO_RANDOM": "posição aleatória", - "MOTION_GOTOXY": "vá para x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "deslize por %1 segs. até x: %2 y: %3", - "MOTION_GLIDETO": "deslize por %1 segs. até %2", - "MOTION_GLIDETO_POINTER": "ponteiro do mouse", - "MOTION_GLIDETO_RANDOM": "posição aleatória", - "MOTION_CHANGEXBY": "adicione %1 a x", - "MOTION_SETX": "mude x para %1", - "MOTION_CHANGEYBY": "adicione %1 a y", - "MOTION_SETY": "mude y para %1", - "MOTION_IFONEDGEBOUNCE": "se tocar na borda, volte", - "MOTION_SETROTATIONSTYLE": "defina o estilo de rotação para %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "esquerda-direita", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "não rotacionar", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "rotação completa", - "MOTION_XPOSITION": "posição x", - "MOTION_YPOSITION": "posição y", - "MOTION_DIRECTION": "direção", - "MOTION_SCROLLRIGHT": "rolar para direita %1 %", - "MOTION_SCROLLUP": "rolar para cima %1", - "MOTION_ALIGNSCENE": "alinhar cena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "inferior esquerda", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "inferior direita", - "MOTION_ALIGNSCENE_MIDDLE": "meio", - "MOTION_ALIGNSCENE_TOPLEFT": "superior esquerdo", - "MOTION_ALIGNSCENE_TOPRIGHT": "superior direita", - "MOTION_XSCROLL": "rolagem eixo x", - "MOTION_YSCROLL": "rolagem eixo y", - "MOTION_STAGE_SELECTED": "Palco selecionado: sem blocos de movimento", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "número aleatório entre %1 e %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 e %2", - "OPERATORS_OR": "%1 ou %2", - "OPERATORS_NOT": "não %1", - "OPERATORS_JOIN": "junte %1 com %2", - "OPERATORS_JOIN_APPLE": "maçã", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "letra %1 de %2", - "OPERATORS_LETTEROF_APPLE": "m", - "OPERATORS_LENGTH": "tamanho de %1", - "OPERATORS_CONTAINS": "%1 contém %2?", - "OPERATORS_MOD": "resto de %1 por %2", - "OPERATORS_ROUND": "arredondamento de %1", - "OPERATORS_MATHOP": "%1 de %2", - "OPERATORS_MATHOP_ABS": "módulo", - "OPERATORS_MATHOP_FLOOR": "arredondamento para baixo de", - "OPERATORS_MATHOP_CEILING": "arredondamento para cima de", - "OPERATORS_MATHOP_SQRT": "raiz quadrada", - "OPERATORS_MATHOP_SIN": "sen", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsen", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctg", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "logaritmo", - "OPERATORS_MATHOP_EEXP": "e elevado à ", - "OPERATORS_MATHOP_10EXP": "10 elevado à ", - "PROCEDURES_DEFINITION": "defina %1", - "SENSING_TOUCHINGOBJECT": "tocando em %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "ponteiro do mouse", - "SENSING_TOUCHINGOBJECT_EDGE": "borda", - "SENSING_TOUCHINGCOLOR": "tocando na cor %1?", - "SENSING_COLORISTOUCHINGCOLOR": "a cor %1 está tocando na cor %2?", - "SENSING_DISTANCETO": "distância até %1", - "SENSING_DISTANCETO_POINTER": "ponteiro do mouse", - "SENSING_ASKANDWAIT": "pergunte %1 e espere", - "SENSING_ASK_TEXT": "Qual o seu nome?", - "SENSING_ANSWER": "resposta", - "SENSING_KEYPRESSED": "tecla %1 pressionada?", - "SENSING_MOUSEDOWN": "mouse pressionado?", - "SENSING_MOUSEX": "posição x do mouse", - "SENSING_MOUSEY": "posição y do mouse", - "SENSING_SETDRAGMODE": "defina modo de arrasto para %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "arrastável", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "não arrastável", - "SENSING_LOUDNESS": "ruído", - "SENSING_LOUD": "alto?", - "SENSING_TIMER": "cronômetro", - "SENSING_RESETTIMER": "zere o cronômetro", - "SENSING_OF": "%1 de %2", - "SENSING_OF_XPOSITION": "posição x", - "SENSING_OF_YPOSITION": "posição y", - "SENSING_OF_DIRECTION": "direção", - "SENSING_OF_COSTUMENUMBER": "n° da fantasia", - "SENSING_OF_COSTUMENAME": "nome da fantasia", - "SENSING_OF_SIZE": "tamanho", - "SENSING_OF_VOLUME": "volume", - "SENSING_OF_BACKDROPNUMBER": "n° do cenário", - "SENSING_OF_BACKDROPNAME": "nome do cenário", - "SENSING_OF_STAGE": "Palco", - "SENSING_CURRENT": "%1 atual", - "SENSING_CURRENT_YEAR": "ano", - "SENSING_CURRENT_MONTH": "mês", - "SENSING_CURRENT_DATE": "data", - "SENSING_CURRENT_DAYOFWEEK": "dia da semana", - "SENSING_CURRENT_HOUR": "hora", - "SENSING_CURRENT_MINUTE": "minuto", - "SENSING_CURRENT_SECOND": "segundo", - "SENSING_DAYSSINCE2000": "número de dias desde 2000", - "SENSING_USERNAME": "nome de usuário", - "SENSING_USERID": "id do usuário", - "SOUND_PLAY": "toque o som %1", - "SOUND_PLAYUNTILDONE": "toque o som %1 até o fim", - "SOUND_STOPALLSOUNDS": "pare todos os sons", - "SOUND_SETEFFECTO": "mude o efeito %1 para %2", - "SOUND_CHANGEEFFECTBY": "mude %2 no efeito %1", - "SOUND_CLEAREFFECTS": "remova os efeitos sonoros ", - "SOUND_EFFECTS_PITCH": "tom", - "SOUND_EFFECTS_PAN": "balanço esquerda/direita", - "SOUND_CHANGEVOLUMEBY": "mude volume em %1", - "SOUND_SETVOLUMETO": "mude o volume para %1%", - "SOUND_VOLUME": "volume", - "SOUND_RECORD": "gravar...", - "CATEGORY_MOTION": "Movimento", - "CATEGORY_LOOKS": "Aparência", - "CATEGORY_SOUND": "Som", - "CATEGORY_EVENTS": "Eventos", - "CATEGORY_CONTROL": "Controle", - "CATEGORY_SENSING": "Sensores", - "CATEGORY_OPERATORS": "Operadores", - "CATEGORY_VARIABLES": "Variáveis", - "CATEGORY_MYBLOCKS": "Meus Blocos", - "DUPLICATE": "Duplicar", - "DELETE": "Apagar", - "ADD_COMMENT": "Comentar", - "REMOVE_COMMENT": "Remover Comentário", - "DELETE_BLOCK": "Apagar Bloco", - "DELETE_X_BLOCKS": "Apagar %1 Blocos", - "DELETE_ALL_BLOCKS": "Apagar todos os blocos %1?", - "CLEAN_UP": "Limpar Blocos", - "HELP": "Ajuda", - "UNDO": "Desfazer", - "REDO": "Refazer", - "EDIT_PROCEDURE": "Editar", - "SHOW_PROCEDURE_DEFINITION": "Vá para definição", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diga algo...", - "COLOUR_HUE_LABEL": "Cor", - "COLOUR_SATURATION_LABEL": "Saturação", - "COLOUR_BRIGHTNESS_LABEL": "Brilho", - "CHANGE_VALUE_TITLE": "Mudar valor:", - "RENAME_VARIABLE": "Renomear variável", - "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis \"%1\" para:", - "RENAME_VARIABLE_MODAL_TITLE": "Renomear Variável", - "NEW_VARIABLE": "Criar uma Variável", - "NEW_VARIABLE_TITLE": "Nome da nova variável:", - "VARIABLE_MODAL_TITLE": "Nova Variável", - "VARIABLE_ALREADY_EXISTS": "Uma variável chamada \"%1\" já existe.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Uma variável chamada \"%1\" já existe para outra variável do tipo \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Apagar os %1 usos da variável \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Não é possível apagar a variável '%1' pois ela faz parte da definição do bloco '%2'", - "DELETE_VARIABLE": "Apagar a variável '%1'", - "NEW_PROCEDURE": "Criar um bloco", - "PROCEDURE_ALREADY_EXISTS": "Já existe um bloco chamado '%1'.", - "PROCEDURE_DEFAULT_NAME": "nome do bloco", - "NEW_LIST": "Criar uma Lista", - "NEW_LIST_TITLE": "Nome da nova lista:", - "LIST_MODAL_TITLE": "Nova Lista", - "LIST_ALREADY_EXISTS": "Já existe uma lista chamada '%1'.", - "RENAME_LIST_TITLE": "Renomear todas as listas \"%1\" para:", - "RENAME_LIST_MODAL_TITLE": "Renomear Lista", - "DEFAULT_LIST_ITEM": "coisa", - "DELETE_LIST": "Apagar a lista \"%1\"", - "RENAME_LIST": "Renomear lista", - "NEW_BROADCAST_MESSAGE": "Nova mensagem", - "NEW_BROADCAST_MESSAGE_TITLE": "Novo nome de mensagem:", - "BROADCAST_MODAL_TITLE": "Nova Mensagem", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mensagem 1" -}; - -Blockly.ScratchMsgs.locales["rap"] = -{ - "CONTROL_FOREVER": "mo āŋa paurō te hora", - "CONTROL_REPEAT": "haka ʾou %1", - "CONTROL_IF": "eʾe %1 oira", - "CONTROL_ELSE": "eʾe ina", - "CONTROL_STOP": "noho", - "CONTROL_STOP_ALL": "taʾatoʾa", - "CONTROL_STOP_THIS": "te āŋa nei he programa", - "CONTROL_STOP_OTHER": "te tahi programa i te sprite", - "CONTROL_WAIT": "e tiaki %1 piere", - "CONTROL_WAITUNTIL": "tiaki ki %1", - "CONTROL_REPEATUNTIL": "hakaʾou ki %1", - "CONTROL_WHILE": "ki te tiaki %1", - "CONTROL_FOREACH": "mo te %1 e ai te %2", - "CONTROL_STARTASCLONE": "ki haʾamata pahe clon", - "CONTROL_CREATECLONEOF": "e aŋa te ko tu meʾe a o te %1", - "CONTROL_CREATECLONEOF_MYSELF": "ko au mau ā", - "CONTROL_DELETETHISCLONE": "haka kore te clon nei", - "CONTROL_COUNTER": "te tataku", - "CONTROL_INCRCOUNTER": "e hahaʾo te tataku", - "CONTROL_CLEARCOUNTER": "haka kore te tataku", - "CONTROL_ALLATONCE": "taʾatoʾa etahi no vece", - "DATA_SETVARIABLETO": " e vaʾai ki te %1 te mau %2", - "DATA_CHANGEVARIABLEBY": "haka rahi ki te %1 %2", - "DATA_SHOWVARIABLE": "haka tikeʾa te variable %1", - "DATA_HIDEVARIABLE": "e naʾa te variable %1", - "DATA_ADDTOLIST": "ka hahaʾo te %1 ki te %2", - "DATA_DELETEOFLIST": "haka kore %1 de %2", - "DATA_DELETEALLOFLIST": "haka kore taʾa toʾa te %1", - "DATA_INSERTATLIST": "e hahaʾo te %1 ki te %2 o te %3", - "DATA_REPLACEITEMOFLIST": "ka hahaʾo te rua meʾe %1 o te %2 hai %3", - "DATA_ITEMOFLIST": "meʾe %1 i te %2", - "DATA_ITEMNUMOFLIST": "# o te meʾe he %1 i te %2", - "DATA_LENGTHOFLIST": "roa roa o te %1", - "DATA_LISTCONTAINSITEM": "¿%2 e ai era te %1?", - "DATA_SHOWLIST": "haka tikeʾa te parau o te meʾe %1", - "DATA_HIDELIST": "naʾa te parau %1", - "DATA_INDEX_ALL": "taʾatoʾa", - "DATA_INDEX_LAST": "hopeʾa", - "DATA_INDEX_RANDOM": "aleatorio", - "EVENT_WHENFLAGCLICKED": "ki āŋa te clic i te %1", - "EVENT_WHENTHISSPRITECLICKED": "ki āŋa te clic i te meʾe nei", - "EVENT_WHENSTAGECLICKED": "mo ŋatu te clic i te ahu", - "EVENT_WHENTOUCHINGOBJECT": "mo te sprite he ŋatu te %1", - "EVENT_WHENBROADCASTRECEIVED": "ki vaʾai mai %1", - "EVENT_WHENBACKDROPSWITCHESTO": "ki kamiare te tuʾa nui ki te %1", - "EVENT_WHENGREATERTHAN": " a he %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "cronómetro", - "EVENT_WHENGREATERTHAN_LOUDNESS": "volumen o te pakeke", - "EVENT_BROADCAST": "haka oho %1", - "EVENT_BROADCASTANDWAIT": "e haka oho %1 e tiaki", - "EVENT_WHENKEYPRESSED": "mo ŋatu te pito pito %1", - "EVENT_WHENKEYPRESSED_SPACE": "kona", - "EVENT_WHENKEYPRESSED_LEFT": "teʾa maui", - "EVENT_WHENKEYPRESSED_RIGHT": "teʾa mataʾu", - "EVENT_WHENKEYPRESSED_DOWN": "teʾa ki raro", - "EVENT_WHENKEYPRESSED_UP": "teʾa ki ruŋa", - "EVENT_WHENKEYPRESSED_ANY": "taʾatoʾa meʾe", - "LOOKS_SAYFORSECS": "e ki %1 i te %2 segundos", - "LOOKS_SAY": "e ki %1", - "LOOKS_HELLO": "¡Iorana!", - "LOOKS_THINKFORSECS": "e manaʾu mmmm %1 i te %2", - "LOOKS_THINK": "e manaʾu %1", - "LOOKS_HMM": "Umm...", - "LOOKS_SHOW": "haka tikeʾa", - "LOOKS_HIDE": "naʾa", - "LOOKS_HIDEALLSPRITES": "ka naʾa te sprite taʾatoʾa", - "LOOKS_EFFECT_COLOR": "kiʾea", - "LOOKS_EFFECT_FISHEYE": "ojo de pez", - "LOOKS_EFFECT_WHIRL": "remolino", - "LOOKS_EFFECT_PIXELATE": "pixelar", - "LOOKS_EFFECT_MOSAIC": "mosaico", - "LOOKS_EFFECT_BRIGHTNESS": "ʾuira", - "LOOKS_EFFECT_GHOST": "haka kore iti", - "LOOKS_CHANGEEFFECTBY": "haka rahi te efecto %1 %2", - "LOOKS_SETEFFECTTO": "ka vaʾai te efecto %1 te %2", - "LOOKS_CLEARGRAPHICEFFECTS": "haka kore te efectos graficos", - "LOOKS_CHANGESIZEBY": "ka kamiare te nui nui hai %1", - "LOOKS_SETSIZETO": "haka noho te nui nui ki te %1 %", - "LOOKS_SIZE": "he haito", - "LOOKS_CHANGESTRETCHBY": "haka rahi ki te haka roa roa te %1", - "LOOKS_SETSTRETCHTO": "haka tano te haka roa roa ki te %1", - "LOOKS_SWITCHCOSTUMETO": "ka kamiare te diseño ki te %1", - "LOOKS_NEXTCOSTUME": "te rua diseño", - "LOOKS_SWITCHBACKDROPTO": "ka kamiare te tuʾa nui ki te %1", - "LOOKS_GOTOFRONTBACK": "e oho a capa %1", - "LOOKS_GOTOFRONTBACK_FRONT": "a muʾa ki te tahi", - "LOOKS_GOTOFRONTBACK_BACK": "i tuʾa", - "LOOKS_GOFORWARDBACKWARDLAYERS": " e oho %2 capas ki te %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "a muʾa ki te tahi", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "a tuʾa ", - "LOOKS_BACKDROPNUMBERNAME": "%1 o te tuʾa nui", - "LOOKS_COSTUMENUMBERNAME": "%1 o te diseño", - "LOOKS_NUMBERNAME_NUMBER": "nūmera", - "LOOKS_NUMBERNAME_NAME": "iŋoa", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "kamiare te tuʾa nui ki te %1 e ka tiaki", - "LOOKS_NEXTBACKDROP_BLOCK": "te rua tuʾa nui", - "LOOKS_NEXTBACKDROP": "te rua tuʾa nui", - "LOOKS_PREVIOUSBACKDROP": "tuʾa nui hoki a tuʾa", - "LOOKS_RANDOMBACKDROP": "tuʾa nui aleatorio", - "MOTION_MOVESTEPS": "e makenu %1 te vaʾe", - "MOTION_TURNLEFT": "e teka %1 %2 grados", - "MOTION_TURNRIGHT": "e teka %1 %2 grados", - "MOTION_POINTINDIRECTION": "ka tuhi ki te kona %1", - "MOTION_POINTTOWARDS": "ka tuki ki %1", - "MOTION_POINTTOWARDS_POINTER": "teʾa kioʾe", - "MOTION_POINTTOWARDS_RANDOM": "he oho haŋa te aleatoria", - "MOTION_GOTO": "e oho ki te %1", - "MOTION_GOTO_POINTER": "teʾa kioʾe", - "MOTION_GOTO_RANDOM": "posición aleatoria", - "MOTION_GOTOXY": "e oho ki te a x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "haka nini ki te %1 piere ki te x:%2 y: %3", - "MOTION_GLIDETO": "haka nini hai %1 piere ki te %2", - "MOTION_GLIDETO_POINTER": "teʾa kioʾe", - "MOTION_GLIDETO_RANDOM": "posición aleatoria", - "MOTION_CHANGEXBY": "haka rahi te a x %1", - "MOTION_SETX": "ka vaʾai ki te x te mau %1", - "MOTION_CHANGEYBY": "haka rahi te y %1", - "MOTION_SETY": "ka vaʾai ki te a e ki te %1", - "MOTION_IFONEDGEBOUNCE": "ana hahine ki te titi, ka rere rere", - "MOTION_SETROTATIONSTYLE": "fijar estilo de rotación a %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "maūi - mataʾu", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ina ko haka teka", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "ki te taʾatoʾa kona", - "MOTION_XPOSITION": "he noho o te x", - "MOTION_YPOSITION": "he noho o te y", - "MOTION_DIRECTION": "ara", - "MOTION_SCROLLRIGHT": "ka makenu ki te mataʾu %1", - "MOTION_SCROLLUP": "ka makenu ki ruŋa %1", - "MOTION_ALIGNSCENE": "haka titika te escena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "i raro ki te maui", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "i raro ki mataʾu", - "MOTION_ALIGNSCENE_MIDDLE": "ki vaeŋa", - "MOTION_ALIGNSCENE_TOPLEFT": "a ruŋa ki te maui", - "MOTION_ALIGNSCENE_TOPRIGHT": "a ruŋa ki te mataʾu", - "MOTION_XSCROLL": "he makenu hai x", - "MOTION_YSCROLL": "he makenu hai y", - "MOTION_STAGE_SELECTED": "escenario tuhi: ina he avahata mo te makenu", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "numera aleatorio i a %1 e %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 e %2", - "OPERATORS_OR": "%1 o %2", - "OPERATORS_NOT": "ina %1", - "OPERATORS_JOIN": "ka haka piri %1 %2", - "OPERATORS_JOIN_APPLE": "manzana", - "OPERATORS_JOIN_BANANA": "maika", - "OPERATORS_LETTEROF": " tiaraʾa %1 o te %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "roa roa o te %1", - "OPERATORS_CONTAINS": "¿%2 e ai era te %1?", - "OPERATORS_MOD": "%1 módulo %2", - "OPERATORS_ROUND": "haka taka taka %1", - "OPERATORS_MATHOP": "%1 o te %2", - "OPERATORS_MATHOP_ABS": "valor absoluto", - "OPERATORS_MATHOP_FLOOR": "suelo", - "OPERATORS_MATHOP_CEILING": "techo", - "OPERATORS_MATHOP_SQRT": "raíz cuadrada", - "OPERATORS_MATHOP_SIN": "sen", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "arcsen", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "haka tano te %1", - "SENSING_TOUCHINGOBJECT": "¿e puʾa %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "teʾa kioʾe", - "SENSING_TOUCHINGOBJECT_EDGE": "tītī", - "SENSING_TOUCHINGCOLOR": "¿e puʾa te kiea %1?", - "SENSING_COLORISTOUCHINGCOLOR": "¿kiea %1 ē puʾa %2?", - "SENSING_DISTANCETO": "roa ki %1", - "SENSING_DISTANCETO_POINTER": "teʾa kioʾe", - "SENSING_ASKANDWAIT": "e ʾui %1 e he tiaki", - "SENSING_ASK_TEXT": "¿ko ai toʾu iŋoa?", - "SENSING_ANSWER": "pahono", - "SENSING_KEYPRESSED": "¿pito pito %1 ko ŋatu ā?", - "SENSING_MOUSEDOWN": "¿kioʾe ko te ŋatu hāŋa ā?", - "SENSING_MOUSEX": "he kona noho x o te kioʾe", - "SENSING_MOUSEY": "he kona noho y o te kioʾe", - "SENSING_SETDRAGMODE": "haka titika te modo makenu ki te %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "e riva ro mo haka makenu", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "e ko tano mo haka makenu", - "SENSING_LOUDNESS": "volumen o te pakeke", - "SENSING_LOUD": "¿poŋeha?", - "SENSING_TIMER": "cronómetro", - "SENSING_RESETTIMER": "e haʾamata haka ʾou te cronómetro", - "SENSING_OF": "%1 o te %2", - "SENSING_OF_XPOSITION": "he noho o te x", - "SENSING_OF_YPOSITION": "he noho o te y", - "SENSING_OF_DIRECTION": "ara", - "SENSING_OF_COSTUMENUMBER": "# o te diseño", - "SENSING_OF_COSTUMENAME": "iŋoa o te diseño", - "SENSING_OF_SIZE": "he haito", - "SENSING_OF_VOLUME": "re´o o te computador", - "SENSING_OF_BACKDROPNUMBER": " o te tuʾa nui", - "SENSING_OF_BACKDROPNAME": "iŋoa o te tuʾa nui", - "SENSING_OF_STAGE": "Ahu", - "SENSING_CURRENT": "%1 apī", - "SENSING_CURRENT_YEAR": "matahiti", - "SENSING_CURRENT_MONTH": "avaʾe", - "SENSING_CURRENT_DATE": "mahana", - "SENSING_CURRENT_DAYOFWEEK": "mahana o te tapati", - "SENSING_CURRENT_HOUR": "hōra", - "SENSING_CURRENT_MINUTE": "minuti", - "SENSING_CURRENT_SECOND": "segundo", - "SENSING_DAYSSINCE2000": "he mahana mai te 2000", - "SENSING_USERNAME": "iŋoa o te usuario", - "SENSING_USERID": "id o te kope kori", - "SOUND_PLAY": "haʾamata te pakeke %1", - "SOUND_PLAYUNTILDONE": "ka pakeke %1 ki te oti", - "SOUND_STOPALLSOUNDS": "haka noho te pakeke taʾatoʾa", - "SOUND_SETEFFECTO": "ka vaʾai te efecto %1 te %2", - "SOUND_CHANGEEFFECTBY": "haka rahi te efecto %1 %2", - "SOUND_CLEAREFFECTS": "haka kore te efecto o te pakeke", - "SOUND_EFFECTS_PITCH": "roa roatano", - "SOUND_EFFECTS_PAN": "haka iri te reʾo o a te maui o a te mataʾu", - "SOUND_CHANGEVOLUMEBY": "ka kamiare te reʾo ki te %1", - "SOUND_SETVOLUMETO": "haka tano te volumen al %1%", - "SOUND_VOLUME": "re´o o te computador", - "SOUND_RECORD": "hapaʾo…", - "CATEGORY_MOTION": "makenu", - "CATEGORY_LOOKS": "pahe meʾe no e tahi", - "CATEGORY_SOUND": "pakeke", - "CATEGORY_EVENTS": "ŋoŋoro", - "CATEGORY_CONTROL": "aʾaru", - "CATEGORY_SENSING": "sensores", - "CATEGORY_OPERATORS": "operadores", - "CATEGORY_VARIABLES": "variables", - "CATEGORY_MYBLOCKS": "taʾaku avhata poto roa mekera", - "DUPLICATE": "haka rahi", - "DELETE": "haka kore", - "ADD_COMMENT": "hahaʾo te vanāŋa", - "REMOVE_COMMENT": "haka kore te vanaŋa", - "DELETE_BLOCK": "haka kore te avahata poto roa", - "DELETE_X_BLOCKS": "haka kore %1 avahata poto roa o te puŋa", - "DELETE_ALL_BLOCKS": "¿haka kore te %1?", - "CLEAN_UP": "apapa te mekera avahata poto roa", - "HELP": "hāʾuʾu", - "UNDO": "moumou", - "REDO": "he anga haka ʾou", - "EDIT_PROCEDURE": "haka titika", - "SHOW_PROCEDURE_DEFINITION": "Go to definition", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "ka ki e tahi meʾe…", - "COLOUR_HUE_LABEL": "Kiʾea", - "COLOUR_SATURATION_LABEL": "Saturación", - "COLOUR_BRIGHTNESS_LABEL": "ʾUira", - "CHANGE_VALUE_TITLE": "kamiare te mau:", - "RENAME_VARIABLE": "ka nape hakaʾou te variable", - "RENAME_VARIABLE_TITLE": "ka papaʾi te variable taʾatoʾa iŋoa ko \"%1\" a:", - "RENAME_VARIABLE_MODAL_TITLE": "ka nape hakaʾou te variable", - "NEW_VARIABLE": "he manaʾu mo āŋa te variable", - "NEW_VARIABLE_TITLE": "iŋoa o te variable:", - "VARIABLE_MODAL_TITLE": "variable apī", - "VARIABLE_ALREADY_EXISTS": "ko ai a te variable iŋoa \"%1\"", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ko ai a te variable iŋoa \"%1\" mo te rua variable o te huru \"%2\"", - "DELETE_VARIABLE_CONFIRMATION": "¿haka kore %1 aŋa o te variable \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "ē ko tano mo haka kore te variable \"%1\" o te ai he tano o te funcion \"%2\"", - "DELETE_VARIABLE": "haka kore te variable %1", - "NEW_PROCEDURE": "he manaʾu mo āŋa e tahi avahata poto roa mekerā", - "PROCEDURE_ALREADY_EXISTS": "ko ai a te aŋa ioa ko \"%1\"", - "PROCEDURE_DEFAULT_NAME": "iŋoa o te avahata poto roa puŋa", - "NEW_LIST": "ka manaʾu mo āŋa te parau", - "NEW_LIST_TITLE": "iŋoa o te parau:", - "LIST_MODAL_TITLE": "parau apī", - "LIST_ALREADY_EXISTS": "A list named \"%1\" already exists.", - "RENAME_LIST_TITLE": "Rename all \"%1\" lists to:", - "RENAME_LIST_MODAL_TITLE": "he nape hakaʾou", - "DEFAULT_LIST_ITEM": "meʾe", - "DELETE_LIST": "haka kore te parau %1", - "RENAME_LIST": "he nape hakaʾou", - "NEW_BROADCAST_MESSAGE": "parau apī", - "NEW_BROADCAST_MESSAGE_TITLE": "iŋoa o te papaʾi:", - "BROADCAST_MODAL_TITLE": "parau apī", - "DEFAULT_BROADCAST_MESSAGE_NAME": "ki hāŋa1" -}; - -Blockly.ScratchMsgs.locales["ro"] = -{ - "CONTROL_FOREVER": "la infinit", - "CONTROL_REPEAT": "repetă %1", - "CONTROL_IF": "dacă %1 atunci", - "CONTROL_ELSE": "altfel", - "CONTROL_STOP": "stop", - "CONTROL_STOP_ALL": "totul", - "CONTROL_STOP_THIS": "acest script", - "CONTROL_STOP_OTHER": "alte scripturi pentru personaj", - "CONTROL_WAIT": "așteaptă %1 secunde", - "CONTROL_WAITUNTIL": "așteaptă până când %1", - "CONTROL_REPEATUNTIL": "repetă până când %1", - "CONTROL_WHILE": "cât timp %1", - "CONTROL_FOREACH": "pentru fiecare %1 în %2", - "CONTROL_STARTASCLONE": "când încep ca și clonă", - "CONTROL_CREATECLONEOF": "creează o clonă a %1", - "CONTROL_CREATECLONEOF_MYSELF": "mea", - "CONTROL_DELETETHISCLONE": "șterge această clonă", - "CONTROL_COUNTER": "contor", - "CONTROL_INCRCOUNTER": "incrementează contor", - "CONTROL_CLEARCOUNTER": "resetează contor", - "CONTROL_ALLATONCE": "integral", - "DATA_SETVARIABLETO": "setează %1 la %2", - "DATA_CHANGEVARIABLEBY": "modifică %1 cu %2", - "DATA_SHOWVARIABLE": "arată variabila %1", - "DATA_HIDEVARIABLE": "ascunde variabila %1", - "DATA_ADDTOLIST": "adaugă %1 la %2", - "DATA_DELETEOFLIST": "șterge %1 din %2", - "DATA_DELETEALLOFLIST": "șterge tot din %1", - "DATA_INSERTATLIST": "inserează %1 la %2 din %3", - "DATA_REPLACEITEMOFLIST": "înlocuiește item %1 din %2 cu %3", - "DATA_ITEMOFLIST": "element %1 din %2", - "DATA_ITEMNUMOFLIST": "nr. elementului %1 în %2", - "DATA_LENGTHOFLIST": "lungimea lui %1", - "DATA_LISTCONTAINSITEM": "%1 conține %2?", - "DATA_SHOWLIST": "arată lista %1", - "DATA_HIDELIST": "ascunde lista %1", - "DATA_INDEX_ALL": "totul", - "DATA_INDEX_LAST": "ultim", - "DATA_INDEX_RANDOM": "aleator", - "EVENT_WHENFLAGCLICKED": "când se dă click pe %1", - "EVENT_WHENTHISSPRITECLICKED": "când se dă click pe acest personaj", - "EVENT_WHENSTAGECLICKED": "când se dă clic pe scenă", - "EVENT_WHENTOUCHINGOBJECT": "când personajul atinge %1", - "EVENT_WHENBROADCASTRECEIVED": "când primesc %1", - "EVENT_WHENBACKDROPSWITCHESTO": "când decorul se schimbă la %1", - "EVENT_WHENGREATERTHAN": "când %1>%2", - "EVENT_WHENGREATERTHAN_TIMER": "cronometru", - "EVENT_WHENGREATERTHAN_LOUDNESS": "intensitatea sunetului", - "EVENT_BROADCAST": "difuzează %1", - "EVENT_BROADCASTANDWAIT": "difuzează %1 și așteaptă", - "EVENT_WHENKEYPRESSED": "când tasta %1 este apăsată", - "EVENT_WHENKEYPRESSED_SPACE": "spațiu", - "EVENT_WHENKEYPRESSED_LEFT": "săgeată stânga", - "EVENT_WHENKEYPRESSED_RIGHT": "săgeată dreapta", - "EVENT_WHENKEYPRESSED_DOWN": "săgeată jos", - "EVENT_WHENKEYPRESSED_UP": "săgeată în sus", - "EVENT_WHENKEYPRESSED_ANY": "oricare", - "LOOKS_SAYFORSECS": "spune %1 pentru %2 secunde", - "LOOKS_SAY": "spune %1", - "LOOKS_HELLO": "Salut!", - "LOOKS_THINKFORSECS": "gândește %1 pentru %2 secunde ", - "LOOKS_THINK": "gândește %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "arată", - "LOOKS_HIDE": "ascunde", - "LOOKS_HIDEALLSPRITES": "ascunde toate personajele", - "LOOKS_EFFECT_COLOR": "culoare", - "LOOKS_EFFECT_FISHEYE": "ochi de pește", - "LOOKS_EFFECT_WHIRL": "vârtej", - "LOOKS_EFFECT_PIXELATE": "pixelare", - "LOOKS_EFFECT_MOSAIC": "mozaic", - "LOOKS_EFFECT_BRIGHTNESS": "strălucire", - "LOOKS_EFFECT_GHOST": "fantomă", - "LOOKS_CHANGEEFFECTBY": "modifică efectul %1 cu %2", - "LOOKS_SETEFFECTTO": "setează efectul %1 la %2", - "LOOKS_CLEARGRAPHICEFFECTS": "anulează efectele grafice", - "LOOKS_CHANGESIZEBY": "modifică mărimea cu %1", - "LOOKS_SETSIZETO": "setează mărimea la %1 %", - "LOOKS_SIZE": "mărime", - "LOOKS_CHANGESTRETCHBY": "modifică lărgimea cu %1", - "LOOKS_SETSTRETCHTO": "setează lărgimea %1", - "LOOKS_SWITCHCOSTUMETO": "schimbă costumul la %1", - "LOOKS_NEXTCOSTUME": "costumul următor", - "LOOKS_SWITCHBACKDROPTO": "schimbă decorul la %1", - "LOOKS_GOTOFRONTBACK": "mergi la stratul %1", - "LOOKS_GOTOFRONTBACK_FRONT": "în față", - "LOOKS_GOTOFRONTBACK_BACK": "înapoi", - "LOOKS_GOFORWARDBACKWARDLAYERS": "mergi %1 %2 straturi", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "înainte", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "înapoi", - "LOOKS_BACKDROPNUMBERNAME": "decor %1", - "LOOKS_COSTUMENUMBERNAME": "costumul %1", - "LOOKS_NUMBERNAME_NUMBER": "număr", - "LOOKS_NUMBERNAME_NAME": "nume", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "schimbă decorul la %1 și așteaptă", - "LOOKS_NEXTBACKDROP_BLOCK": "decorul următor", - "LOOKS_NEXTBACKDROP": "decorul următor", - "LOOKS_PREVIOUSBACKDROP": "decorul anterior", - "LOOKS_RANDOMBACKDROP": "decor aleatoriu", - "MOTION_MOVESTEPS": "mergi %1 pași", - "MOTION_TURNLEFT": "rotește-te %1 %2 grade", - "MOTION_TURNRIGHT": "rotește-te %1 %2 grade", - "MOTION_POINTINDIRECTION": "orientează-te în direcția %1", - "MOTION_POINTTOWARDS": "orientează-te spre %1", - "MOTION_POINTTOWARDS_POINTER": "cursorul mouse-ului", - "MOTION_POINTTOWARDS_RANDOM": "direcție aleatoare", - "MOTION_GOTO": "mergi la %1", - "MOTION_GOTO_POINTER": "cursorul mouse-ului", - "MOTION_GOTO_RANDOM": "poziție aleatoare", - "MOTION_GOTOXY": "mergi la x %1 y: %2", - "MOTION_GLIDESECSTOXY": "glisează în %1 secunde la x: %2 y: %3", - "MOTION_GLIDETO": "glisează în %1 secunde la %2 ", - "MOTION_GLIDETO_POINTER": "cursorul mouse-ului", - "MOTION_GLIDETO_RANDOM": "poziție aleatoare", - "MOTION_CHANGEXBY": "modifică x cu %1", - "MOTION_SETX": "setează x la %1", - "MOTION_CHANGEYBY": "modifică y cu %1", - "MOTION_SETY": "setează y la %1", - "MOTION_IFONEDGEBOUNCE": "dacă atinge marginea, ricoșează", - "MOTION_SETROTATIONSTYLE": "setează stilul de rotație %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "stânga-dreapta", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "nu te roti", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "de jur împrejur", - "MOTION_XPOSITION": "poziția x", - "MOTION_YPOSITION": "poziția y", - "MOTION_DIRECTION": "direcția", - "MOTION_SCROLLRIGHT": "derulează la dreapta %1", - "MOTION_SCROLLUP": "derulează în sus %1", - "MOTION_ALIGNSCENE": "aliniază scena %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "stânga-jos", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "dreapta-jos", - "MOTION_ALIGNSCENE_MIDDLE": "în centru", - "MOTION_ALIGNSCENE_TOPLEFT": "stânga-sus", - "MOTION_ALIGNSCENE_TOPRIGHT": "dreapta-sus", - "MOTION_XSCROLL": "derulare x", - "MOTION_YSCROLL": "derulare y", - "MOTION_STAGE_SELECTED": "Scena selectată: fără blocuri de mișcare", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "alege aleator între %1 și %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 și %2", - "OPERATORS_OR": "%1 sau %2", - "OPERATORS_NOT": "nu %1", - "OPERATORS_JOIN": "alătură %1 %2", - "OPERATORS_JOIN_APPLE": "măr", - "OPERATORS_JOIN_BANANA": "banană", - "OPERATORS_LETTEROF": "litera %1 din %2", - "OPERATORS_LETTEROF_APPLE": "m", - "OPERATORS_LENGTH": "lungimea lui %1", - "OPERATORS_CONTAINS": "%1 conține %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "rotunjește %1", - "OPERATORS_MATHOP": "%1 din %2", - "OPERATORS_MATHOP_ABS": "modul", - "OPERATORS_MATHOP_FLOOR": "partea întreagă", - "OPERATORS_MATHOP_CEILING": "rotunjire prin adaos", - "OPERATORS_MATHOP_SQRT": "radical", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definește %1", - "SENSING_TOUCHINGOBJECT": "atinge %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "cursorul mouse-ului", - "SENSING_TOUCHINGOBJECT_EDGE": "marginea", - "SENSING_TOUCHINGCOLOR": "atinge culoarea %1?", - "SENSING_COLORISTOUCHINGCOLOR": "culoarea %1 atinge %2?", - "SENSING_DISTANCETO": "distanța până la %1", - "SENSING_DISTANCETO_POINTER": "cursorul mouse-ului", - "SENSING_ASKANDWAIT": "întreabă %1 și așteaptă", - "SENSING_ASK_TEXT": "Cum te numești?", - "SENSING_ANSWER": "răspuns", - "SENSING_KEYPRESSED": "tasta %1 apăsată?", - "SENSING_MOUSEDOWN": "butonul mouse-ului e apăsat?", - "SENSING_MOUSEX": "mouse x", - "SENSING_MOUSEY": "mouse y", - "SENSING_SETDRAGMODE": "setează mod tragere %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "activat", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "dezactivat", - "SENSING_LOUDNESS": "intensitatea sunetului", - "SENSING_LOUD": "tare?", - "SENSING_TIMER": "cronometru", - "SENSING_RESETTIMER": "resetează cronometru", - "SENSING_OF": "%1 din %2", - "SENSING_OF_XPOSITION": "poziția x", - "SENSING_OF_YPOSITION": "poziția y", - "SENSING_OF_DIRECTION": "direcția", - "SENSING_OF_COSTUMENUMBER": "nr. costum", - "SENSING_OF_COSTUMENAME": "denumire costum", - "SENSING_OF_SIZE": "mărime", - "SENSING_OF_VOLUME": "volum", - "SENSING_OF_BACKDROPNUMBER": "nr. decor", - "SENSING_OF_BACKDROPNAME": "denumire decor", - "SENSING_OF_STAGE": "Scenă", - "SENSING_CURRENT": "%1 curent(ă)", - "SENSING_CURRENT_YEAR": "anul", - "SENSING_CURRENT_MONTH": "luna", - "SENSING_CURRENT_DATE": "data", - "SENSING_CURRENT_DAYOFWEEK": "ziua săptămânii", - "SENSING_CURRENT_HOUR": "ora", - "SENSING_CURRENT_MINUTE": "minutul", - "SENSING_CURRENT_SECOND": "secunda", - "SENSING_DAYSSINCE2000": "zile din 2000", - "SENSING_USERNAME": "nume utilizator", - "SENSING_USERID": "id utilizator", - "SOUND_PLAY": "pornește sunetul %1", - "SOUND_PLAYUNTILDONE": "redă sunetul %1 până la final", - "SOUND_STOPALLSOUNDS": "oprește toate sunetele", - "SOUND_SETEFFECTO": "setează efectul %1 la %2", - "SOUND_CHANGEEFFECTBY": "modifică efectul %1 cu %2", - "SOUND_CLEAREFFECTS": "șterge efectele audio", - "SOUND_EFFECTS_PITCH": "înălțimea sunetului", - "SOUND_EFFECTS_PAN": "deplasare la stânga/dreapta", - "SOUND_CHANGEVOLUMEBY": "modifică volumul cu %1", - "SOUND_SETVOLUMETO": "setează volumul la %1%", - "SOUND_VOLUME": "volum", - "SOUND_RECORD": "se înregistrează...", - "CATEGORY_MOTION": "Mișcare", - "CATEGORY_LOOKS": "Aspect", - "CATEGORY_SOUND": "Sunet", - "CATEGORY_EVENTS": "Evenimente", - "CATEGORY_CONTROL": "Control", - "CATEGORY_SENSING": "Detectare", - "CATEGORY_OPERATORS": "Operatori", - "CATEGORY_VARIABLES": "Variabile", - "CATEGORY_MYBLOCKS": "Blocurile mele", - "DUPLICATE": "Duplică", - "DELETE": "Șterge", - "ADD_COMMENT": "Adaugă comentariu", - "REMOVE_COMMENT": "Șterge comentariul", - "DELETE_BLOCK": "Șterge blocul", - "DELETE_X_BLOCKS": "Șterge %1 blocuri", - "DELETE_ALL_BLOCKS": "Șterg toate %1 blocuri?", - "CLEAN_UP": "Șterge blocurile", - "HELP": "Ajutor", - "UNDO": "Anulează ultima modificare", - "REDO": "Refă acțiunea anulată", - "EDIT_PROCEDURE": "Editează", - "SHOW_PROCEDURE_DEFINITION": "Mergi la definiție", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Spune ceva ...", - "COLOUR_HUE_LABEL": "Culoare", - "COLOUR_SATURATION_LABEL": "Saturație", - "COLOUR_BRIGHTNESS_LABEL": "Strălucire", - "CHANGE_VALUE_TITLE": "Modifică valoarea:", - "RENAME_VARIABLE": "Redenumește variabila", - "RENAME_VARIABLE_TITLE": "Redenumește peste tot variabila \"%1\" la:", - "RENAME_VARIABLE_MODAL_TITLE": "Redenumește variabila", - "NEW_VARIABLE": "Creează o variabilă", - "NEW_VARIABLE_TITLE": "Numele variabilei:", - "VARIABLE_MODAL_TITLE": "Variabilă nouă", - "VARIABLE_ALREADY_EXISTS": "O variabilă denumită \"%1\" există deja.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "O variabilă cu numele \"%1\" există deja pentru o altă variabilă de tip \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Șterge %1 utilizări ale variabilei \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Variabila cu numele \"%1\" nu poate fi ștearsă deoarece este parte a definiției funcției \"%2\". ", - "DELETE_VARIABLE": "Șterge variabila cu numele \"%1\" .", - "NEW_PROCEDURE": "Creează un bloc", - "PROCEDURE_ALREADY_EXISTS": "O procedură cu numele \"%1\" există deja.", - "PROCEDURE_DEFAULT_NAME": "numele blocului", - "NEW_LIST": "Creează o listă", - "NEW_LIST_TITLE": "Noul nume al listei:", - "LIST_MODAL_TITLE": "Listă nouă", - "LIST_ALREADY_EXISTS": "O listă cu numele \"%1\" există deja.", - "RENAME_LIST_TITLE": "Redenumește peste tot lista \"%1\" la:", - "RENAME_LIST_MODAL_TITLE": "Redenumește lista", - "DEFAULT_LIST_ITEM": "element", - "DELETE_LIST": "Șterge lista \"%1\" ", - "RENAME_LIST": "Redenumește lista", - "NEW_BROADCAST_MESSAGE": "Mesaj nou", - "NEW_BROADCAST_MESSAGE_TITLE": "Numele mesajului", - "BROADCAST_MODAL_TITLE": "Mesaj nou", - "DEFAULT_BROADCAST_MESSAGE_NAME": "mesaj1" -}; - -Blockly.ScratchMsgs.locales["ru"] = -{ - "CONTROL_FOREVER": "повторять всегда", - "CONTROL_REPEAT": "повторить %1 раз", - "CONTROL_IF": "если %1 , то", - "CONTROL_ELSE": "иначе", - "CONTROL_STOP": "стоп", - "CONTROL_STOP_ALL": "все", - "CONTROL_STOP_THIS": "этот скрипт", - "CONTROL_STOP_OTHER": "другие скрипты спрайта", - "CONTROL_WAIT": "ждать %1 секунд", - "CONTROL_WAITUNTIL": "ждать до %1", - "CONTROL_REPEATUNTIL": "повторять пока не %1", - "CONTROL_WHILE": "пока %1", - "CONTROL_FOREACH": "для каждого %1 в %2", - "CONTROL_STARTASCLONE": "когда я начинаю как клон", - "CONTROL_CREATECLONEOF": "создать клон %1", - "CONTROL_CREATECLONEOF_MYSELF": "самого себя", - "CONTROL_DELETETHISCLONE": "удалить клон", - "CONTROL_COUNTER": "счётчик", - "CONTROL_INCRCOUNTER": "увеличить счётчик", - "CONTROL_CLEARCOUNTER": "очистить счётчик", - "CONTROL_ALLATONCE": "все сразу", - "DATA_SETVARIABLETO": "задать %1 значение %2", - "DATA_CHANGEVARIABLEBY": "изменить %1 на %2", - "DATA_SHOWVARIABLE": "показать переменную %1", - "DATA_HIDEVARIABLE": "скрыть переменную %1", - "DATA_ADDTOLIST": "добавить %1 к %2", - "DATA_DELETEOFLIST": "удалить %1 из %2", - "DATA_DELETEALLOFLIST": "удалить все из %1", - "DATA_INSERTATLIST": "вставить %1 в %3 из %2", - "DATA_REPLACEITEMOFLIST": "заменить элемент %1 в %2 на %3", - "DATA_ITEMOFLIST": "элемент %1 в %2", - "DATA_ITEMNUMOFLIST": "№ элемента %1 в %2", - "DATA_LENGTHOFLIST": "длина списка %1", - "DATA_LISTCONTAINSITEM": "%1 содержит %2?", - "DATA_SHOWLIST": "показать список %1", - "DATA_HIDELIST": "скрыть список %1", - "DATA_INDEX_ALL": "все", - "DATA_INDEX_LAST": "последний", - "DATA_INDEX_RANDOM": "случайный", - "EVENT_WHENFLAGCLICKED": "когда %1 нажат", - "EVENT_WHENTHISSPRITECLICKED": "когда спрайт нажат", - "EVENT_WHENSTAGECLICKED": "когда кликнут по сцене", - "EVENT_WHENTOUCHINGOBJECT": "когда этот спрайт касается %1", - "EVENT_WHENBROADCASTRECEIVED": "когда я получу %1", - "EVENT_WHENBACKDROPSWITCHESTO": "когда фон сменился на %1", - "EVENT_WHENGREATERTHAN": "когда %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "таймер", - "EVENT_WHENGREATERTHAN_LOUDNESS": "громкость", - "EVENT_BROADCAST": "передать %1", - "EVENT_BROADCASTANDWAIT": "передать %1 и ждать до конца", - "EVENT_WHENKEYPRESSED": "когда клавиша %1 нажата", - "EVENT_WHENKEYPRESSED_SPACE": "пробел", - "EVENT_WHENKEYPRESSED_LEFT": "стрелка влево", - "EVENT_WHENKEYPRESSED_RIGHT": "стрелка вправо", - "EVENT_WHENKEYPRESSED_DOWN": "стрелка вниз", - "EVENT_WHENKEYPRESSED_UP": "стрелка вверх", - "EVENT_WHENKEYPRESSED_ANY": "любая", - "LOOKS_SAYFORSECS": "говорить %1 %2 секунд", - "LOOKS_SAY": "сказать %1", - "LOOKS_HELLO": "Привет!", - "LOOKS_THINKFORSECS": "думать %1 %2 секунд", - "LOOKS_THINK": "думать %1", - "LOOKS_HMM": "М-м-м...", - "LOOKS_SHOW": "показаться", - "LOOKS_HIDE": "спрятаться", - "LOOKS_HIDEALLSPRITES": "спрятать все спрайты", - "LOOKS_EFFECT_COLOR": "цвет", - "LOOKS_EFFECT_FISHEYE": "рыбий глаз", - "LOOKS_EFFECT_WHIRL": "завихрение", - "LOOKS_EFFECT_PIXELATE": "укрупнение пикселей", - "LOOKS_EFFECT_MOSAIC": "мозаика", - "LOOKS_EFFECT_BRIGHTNESS": "яркость", - "LOOKS_EFFECT_GHOST": "прозрачность", - "LOOKS_CHANGEEFFECTBY": "изменить эффект %1 на %2", - "LOOKS_SETEFFECTTO": "установить эффект %1 %2", - "LOOKS_CLEARGRAPHICEFFECTS": "убрать графические эффекты", - "LOOKS_CHANGESIZEBY": "изменить размер на %1 %", - "LOOKS_SETSIZETO": "установить размер %1 %", - "LOOKS_SIZE": "размер", - "LOOKS_CHANGESTRETCHBY": "изменить натяжение на %1", - "LOOKS_SETSTRETCHTO": "установить натяжение %1 %", - "LOOKS_SWITCHCOSTUMETO": "изменить костюм на %1", - "LOOKS_NEXTCOSTUME": "следующий костюм", - "LOOKS_SWITCHBACKDROPTO": "переключить фон на %1", - "LOOKS_GOTOFRONTBACK": "перейти на %1 слой", - "LOOKS_GOTOFRONTBACK_FRONT": "передний", - "LOOKS_GOTOFRONTBACK_BACK": "задний", - "LOOKS_GOFORWARDBACKWARDLAYERS": "перейти %1 на %2 слоя", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "вперёд", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "назад", - "LOOKS_BACKDROPNUMBERNAME": "фон %1", - "LOOKS_COSTUMENUMBERNAME": "костюм %1", - "LOOKS_NUMBERNAME_NUMBER": "номер", - "LOOKS_NUMBERNAME_NAME": "имя", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "переключить фон на %1 и ждать", - "LOOKS_NEXTBACKDROP_BLOCK": "следующий фон", - "LOOKS_NEXTBACKDROP": "следующий фон", - "LOOKS_PREVIOUSBACKDROP": "предыдущий фон", - "LOOKS_RANDOMBACKDROP": "случайный фон", - "MOTION_MOVESTEPS": "идти %1 шагов", - "MOTION_TURNLEFT": "повернуть %1 на %2 градусов", - "MOTION_TURNRIGHT": "повернуть %1 на %2 градусов", - "MOTION_POINTINDIRECTION": "повернуться в направлении %1", - "MOTION_POINTTOWARDS": "повернуться к %1", - "MOTION_POINTTOWARDS_POINTER": "указатель мыши", - "MOTION_POINTTOWARDS_RANDOM": "случайно направление", - "MOTION_GOTO": "перейти на %1", - "MOTION_GOTO_POINTER": "указатель мыши", - "MOTION_GOTO_RANDOM": "случайное положение", - "MOTION_GOTOXY": "перейти в x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "плыть %1 секунд в точку x: %2 y: %3", - "MOTION_GLIDETO": "плыть %1 секунд к %2", - "MOTION_GLIDETO_POINTER": "указатель мыши", - "MOTION_GLIDETO_RANDOM": "случайное положение", - "MOTION_CHANGEXBY": "изменить x на %1", - "MOTION_SETX": "установить x в %1", - "MOTION_CHANGEYBY": "изменить y на %1", - "MOTION_SETY": "установить y в %1", - "MOTION_IFONEDGEBOUNCE": "если касается края, оттолкнуться", - "MOTION_SETROTATIONSTYLE": "установить способ вращения %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "влево-вправо", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "не вращать", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "кругом", - "MOTION_XPOSITION": "положение x", - "MOTION_YPOSITION": "положение y", - "MOTION_DIRECTION": "направление", - "MOTION_SCROLLRIGHT": "прокрутить вправо %1", - "MOTION_SCROLLUP": "прокрутить вверх %1", - "MOTION_ALIGNSCENE": "выровнять сцену %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "нижний левый", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "нижний правый", - "MOTION_ALIGNSCENE_MIDDLE": "середина", - "MOTION_ALIGNSCENE_TOPLEFT": "верхний левый", - "MOTION_ALIGNSCENE_TOPRIGHT": "верхний правый", - "MOTION_XSCROLL": "x прокрутка", - "MOTION_YSCROLL": "y прокрутка", - "MOTION_STAGE_SELECTED": "Выбрана сцена: нет блоков движения", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "выдать случайное от %1 до %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 и %2", - "OPERATORS_OR": "%1 или %2", - "OPERATORS_NOT": "не %1", - "OPERATORS_JOIN": "объединить %1 %2", - "OPERATORS_JOIN_APPLE": "яблоко", - "OPERATORS_JOIN_BANANA": "банан", - "OPERATORS_LETTEROF": "буква %1 в %2", - "OPERATORS_LETTEROF_APPLE": "а", - "OPERATORS_LENGTH": "длина %1", - "OPERATORS_CONTAINS": "%1 содержит %2?", - "OPERATORS_MOD": "%1 модуль %2", - "OPERATORS_ROUND": "округлить %1", - "OPERATORS_MATHOP": "%1 от %2", - "OPERATORS_MATHOP_ABS": "модуль", - "OPERATORS_MATHOP_FLOOR": "целое меньшее", - "OPERATORS_MATHOP_CEILING": "целое большее", - "OPERATORS_MATHOP_SQRT": "квадратный корень", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "определить %1", - "SENSING_TOUCHINGOBJECT": "касается %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "указатель мыши", - "SENSING_TOUCHINGOBJECT_EDGE": "край", - "SENSING_TOUCHINGCOLOR": "касается цвета %1?", - "SENSING_COLORISTOUCHINGCOLOR": "цвет %1 касается цвета %2?", - "SENSING_DISTANCETO": "расстояние до %1", - "SENSING_DISTANCETO_POINTER": "указатель мыши", - "SENSING_ASKANDWAIT": "спросить %1 и ждать", - "SENSING_ASK_TEXT": "Как тебя зовут?", - "SENSING_ANSWER": "ответ", - "SENSING_KEYPRESSED": "клавиша %1 нажата?", - "SENSING_MOUSEDOWN": "мышь нажата?", - "SENSING_MOUSEX": "x мыши", - "SENSING_MOUSEY": "y мыши", - "SENSING_SETDRAGMODE": "перетаскивать %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "можно", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "нельзя", - "SENSING_LOUDNESS": "громкость", - "SENSING_LOUD": "громко?", - "SENSING_TIMER": "таймер", - "SENSING_RESETTIMER": "сбросить таймер", - "SENSING_OF": "%1 от %2", - "SENSING_OF_XPOSITION": "положение x", - "SENSING_OF_YPOSITION": "положение y", - "SENSING_OF_DIRECTION": "направление", - "SENSING_OF_COSTUMENUMBER": "костюм #", - "SENSING_OF_COSTUMENAME": "имя костюма", - "SENSING_OF_SIZE": "размер", - "SENSING_OF_VOLUME": "громкость", - "SENSING_OF_BACKDROPNUMBER": "фон #", - "SENSING_OF_BACKDROPNAME": "имя фона", - "SENSING_OF_STAGE": "Сцена", - "SENSING_CURRENT": "текущий %1", - "SENSING_CURRENT_YEAR": "год", - "SENSING_CURRENT_MONTH": "месяц", - "SENSING_CURRENT_DATE": "дата", - "SENSING_CURRENT_DAYOFWEEK": "день недели", - "SENSING_CURRENT_HOUR": "час", - "SENSING_CURRENT_MINUTE": "минута", - "SENSING_CURRENT_SECOND": "секунда", - "SENSING_DAYSSINCE2000": "дней с 2000 г", - "SENSING_USERNAME": "имя пользователя", - "SENSING_USERID": "id пользователя", - "SOUND_PLAY": "включить звук %1", - "SOUND_PLAYUNTILDONE": "играть звук %1 до конца", - "SOUND_STOPALLSOUNDS": "остановить все звуки", - "SOUND_SETEFFECTO": "установить эффект %1 в %2", - "SOUND_CHANGEEFFECTBY": "изменить %1 эффект на %2", - "SOUND_CLEAREFFECTS": "убрать звуковые эффекты", - "SOUND_EFFECTS_PITCH": "высота тона", - "SOUND_EFFECTS_PAN": "звучание слева/справа", - "SOUND_CHANGEVOLUMEBY": "изменить громкость на %1", - "SOUND_SETVOLUMETO": "установить громкость %1%", - "SOUND_VOLUME": "громкость звука", - "SOUND_RECORD": "запись…", - "CATEGORY_MOTION": "Движение", - "CATEGORY_LOOKS": "Внешний вид", - "CATEGORY_SOUND": "Звук", - "CATEGORY_EVENTS": "События", - "CATEGORY_CONTROL": "Управление", - "CATEGORY_SENSING": "Сенсоры", - "CATEGORY_OPERATORS": "Операторы", - "CATEGORY_VARIABLES": "Переменные", - "CATEGORY_MYBLOCKS": "Другие блоки", - "DUPLICATE": "Дублировать", - "DELETE": "Удалить", - "ADD_COMMENT": "Добавить комментарий", - "REMOVE_COMMENT": "Удалить комментарий", - "DELETE_BLOCK": "Удалить блок", - "DELETE_X_BLOCKS": "Удалить %1 блоки", - "DELETE_ALL_BLOCKS": "Удалить все %1 блоки?", - "CLEAN_UP": "Очистить блоки", - "HELP": "Помощь", - "UNDO": "Отменить", - "REDO": "Вернуть", - "EDIT_PROCEDURE": "Редактировать", - "SHOW_PROCEDURE_DEFINITION": "Перейти к определению", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Скажи что-нибудь...", - "COLOUR_HUE_LABEL": "Цвет", - "COLOUR_SATURATION_LABEL": "Насыщенность", - "COLOUR_BRIGHTNESS_LABEL": "Яркость", - "CHANGE_VALUE_TITLE": "Изменить значение:", - "RENAME_VARIABLE": "Переименовать переменную", - "RENAME_VARIABLE_TITLE": "Переименовать все \"%1\" переменных в:", - "RENAME_VARIABLE_MODAL_TITLE": "Переименовать переменную", - "NEW_VARIABLE": "Создать переменную", - "NEW_VARIABLE_TITLE": "Имя новой переменной:", - "VARIABLE_MODAL_TITLE": "Новая переменная", - "VARIABLE_ALREADY_EXISTS": "Переменная с именем \"%1\" уже существует.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "переменная с именем \"%1\" уже существует в другом типе переменных \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Удалить %1 использований \"%2\" переменной?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Нельзя удалить переменную \"%1\", так как она является частью определения функции \"%2\"", - "DELETE_VARIABLE": "Удалить переменную \"%1\"", - "NEW_PROCEDURE": "Создать блок", - "PROCEDURE_ALREADY_EXISTS": "Процедура с именем \"%1\" уже существует.", - "PROCEDURE_DEFAULT_NAME": "название блока", - "NEW_LIST": "Создать список", - "NEW_LIST_TITLE": "Имя нового списка:", - "LIST_MODAL_TITLE": "Новый список", - "LIST_ALREADY_EXISTS": "Список с именем \"%1\" уже существует.", - "RENAME_LIST_TITLE": "Переименовать все \"%1\" списки в:", - "RENAME_LIST_MODAL_TITLE": "Переименовать список", - "DEFAULT_LIST_ITEM": "что-то", - "DELETE_LIST": "Удалить список \"%1\"", - "RENAME_LIST": "Переименовать список", - "NEW_BROADCAST_MESSAGE": "Новое сообщение", - "NEW_BROADCAST_MESSAGE_TITLE": "Новое имя сообщения:", - "BROADCAST_MODAL_TITLE": "Новое сообщение", - "DEFAULT_BROADCAST_MESSAGE_NAME": "сообщение1" -}; - -Blockly.ScratchMsgs.locales["sr"] = -{ - "CONTROL_FOREVER": "понављај заувек", - "CONTROL_REPEAT": "понови %1", - "CONTROL_IF": "ако је %1 онда", - "CONTROL_ELSE": "у супротном", - "CONTROL_STOP": "заустави", - "CONTROL_STOP_ALL": "све", - "CONTROL_STOP_THIS": "овај програм", - "CONTROL_STOP_OTHER": "друге програме лика", - "CONTROL_WAIT": "чекај %1 секунду", - "CONTROL_WAITUNTIL": "чекај док не %1", - "CONTROL_REPEATUNTIL": "понављај до %1", - "CONTROL_WHILE": "док је %1", - "CONTROL_FOREACH": "за сваки %1 у %2", - "CONTROL_STARTASCLONE": "када се појавим као умножак", - "CONTROL_CREATECLONEOF": "направи дупликат од %1", - "CONTROL_CREATECLONEOF_MYSELF": "мене", - "CONTROL_DELETETHISCLONE": "обриши овај умножак", - "CONTROL_COUNTER": "бројач", - "CONTROL_INCRCOUNTER": "увећај бројач", - "CONTROL_CLEARCOUNTER": "обриши бројач", - "CONTROL_ALLATONCE": "све одједном", - "DATA_SETVARIABLETO": "нека %1 буде %2", - "DATA_CHANGEVARIABLEBY": "промени %1 за %2", - "DATA_SHOWVARIABLE": "прикажи променљиву %1", - "DATA_HIDEVARIABLE": "сакриј променљиву %1", - "DATA_ADDTOLIST": "додај %1 у %2", - "DATA_DELETEOFLIST": "обриши %1 из %2", - "DATA_DELETEALLOFLIST": "обриши све из %1", - "DATA_INSERTATLIST": "убаци %1 на %2 у %3", - "DATA_REPLACEITEMOFLIST": "замени елемент %1 у %2 са %3", - "DATA_ITEMOFLIST": "елемент %1 из %2", - "DATA_ITEMNUMOFLIST": "место од %1 у %2", - "DATA_LENGTHOFLIST": "дужина %1", - "DATA_LISTCONTAINSITEM": "да ли %1 садржи %2?", - "DATA_SHOWLIST": "прикажи листу %1", - "DATA_HIDELIST": "сакриј листу %1", - "DATA_INDEX_ALL": "све", - "DATA_INDEX_LAST": "последњи", - "DATA_INDEX_RANDOM": "насумичан", - "EVENT_WHENFLAGCLICKED": "када је кликнуто на %1", - "EVENT_WHENTHISSPRITECLICKED": "када је кликнуто на овај лик", - "EVENT_WHENSTAGECLICKED": "када је кликнуто на позорницу", - "EVENT_WHENTOUCHINGOBJECT": "када овај лик додирне %1", - "EVENT_WHENBROADCASTRECEIVED": "када примим %1", - "EVENT_WHENBACKDROPSWITCHESTO": "када се позадина промени у %1", - "EVENT_WHENGREATERTHAN": "када је %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "тајмер", - "EVENT_WHENGREATERTHAN_LOUDNESS": "јачина звука", - "EVENT_BROADCAST": "разгласи %1", - "EVENT_BROADCASTANDWAIT": "разгласи %1 и чекај", - "EVENT_WHENKEYPRESSED": "када је дирка %1 притиснута", - "EVENT_WHENKEYPRESSED_SPACE": "размак", - "EVENT_WHENKEYPRESSED_LEFT": "стрелица лево", - "EVENT_WHENKEYPRESSED_RIGHT": "стрелица десно", - "EVENT_WHENKEYPRESSED_DOWN": "стрелица доле", - "EVENT_WHENKEYPRESSED_UP": "стрелица горе", - "EVENT_WHENKEYPRESSED_ANY": "било који", - "LOOKS_SAYFORSECS": "изговори %1 током %2 секунде", - "LOOKS_SAY": "изговори %1", - "LOOKS_HELLO": "Здраво!", - "LOOKS_THINKFORSECS": "замисли %1 током %2 секунде", - "LOOKS_THINK": "замисли %1", - "LOOKS_HMM": "Хмм...", - "LOOKS_SHOW": "прикажи", - "LOOKS_HIDE": "сакриј", - "LOOKS_HIDEALLSPRITES": "сакриј све ликове", - "LOOKS_EFFECT_COLOR": "боја", - "LOOKS_EFFECT_FISHEYE": "рибље око", - "LOOKS_EFFECT_WHIRL": "вртлог", - "LOOKS_EFFECT_PIXELATE": "позрнати", - "LOOKS_EFFECT_MOSAIC": "мозаик", - "LOOKS_EFFECT_BRIGHTNESS": "осветљеност", - "LOOKS_EFFECT_GHOST": "дух", - "LOOKS_CHANGEEFFECTBY": "промени ефекат %1 за %2", - "LOOKS_SETEFFECTTO": "нека ефекат %1 буде %2", - "LOOKS_CLEARGRAPHICEFFECTS": "уклони графичке ефекте", - "LOOKS_CHANGESIZEBY": "промени величину за %1", - "LOOKS_SETSIZETO": "нека величина буде %1 %", - "LOOKS_SIZE": "величина", - "LOOKS_CHANGESTRETCHBY": "промени увећање за %1", - "LOOKS_SETSTRETCHTO": "нека увећање буде %1 %", - "LOOKS_SWITCHCOSTUMETO": "замени костим са %1", - "LOOKS_NEXTCOSTUME": "следећи костим", - "LOOKS_SWITCHBACKDROPTO": "промени позадину у %1", - "LOOKS_GOTOFRONTBACK": "иди на %1 слој", - "LOOKS_GOTOFRONTBACK_FRONT": "напред", - "LOOKS_GOTOFRONTBACK_BACK": "назад", - "LOOKS_GOFORWARDBACKWARDLAYERS": "иди %1 %2 слоја", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "проследи", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "уназад", - "LOOKS_BACKDROPNUMBERNAME": "позадина %1", - "LOOKS_COSTUMENUMBERNAME": "костим %1", - "LOOKS_NUMBERNAME_NUMBER": "број", - "LOOKS_NUMBERNAME_NAME": "име", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "промени позадину у %1 и чекај", - "LOOKS_NEXTBACKDROP_BLOCK": "следећа позадина", - "LOOKS_NEXTBACKDROP": "следећа позадина", - "LOOKS_PREVIOUSBACKDROP": "претходна позадина", - "LOOKS_RANDOMBACKDROP": "случајна позадина", - "MOTION_MOVESTEPS": "иди %1 корака", - "MOTION_TURNLEFT": "окрет %1 за %2 степени", - "MOTION_TURNRIGHT": "окрет %1 за %2 степени", - "MOTION_POINTINDIRECTION": "усмери се ка %1", - "MOTION_POINTTOWARDS": "усмери се ка %1", - "MOTION_POINTTOWARDS_POINTER": "показивач миша", - "MOTION_POINTTOWARDS_RANDOM": "насумичан правац", - "MOTION_GOTO": "иди до %1", - "MOTION_GOTO_POINTER": "показивач миша", - "MOTION_GOTO_RANDOM": "насумичан положај", - "MOTION_GOTOXY": "иди до x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "клизи %1 секунди до x: %2 y: %3", - "MOTION_GLIDETO": "клизи %1 секунди до %2", - "MOTION_GLIDETO_POINTER": "показивач миша", - "MOTION_GLIDETO_RANDOM": "случајан положај", - "MOTION_CHANGEXBY": "промени x за %1", - "MOTION_SETX": "нека x буде %1", - "MOTION_CHANGEYBY": "промени y за %1", - "MOTION_SETY": "нека y буде %1", - "MOTION_IFONEDGEBOUNCE": "ако си на рубу, окрени се", - "MOTION_SETROTATIONSTYLE": "подеси начин окретања %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "лево-десно", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "без окретања", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "на све стране", - "MOTION_XPOSITION": "место х", - "MOTION_YPOSITION": "место у", - "MOTION_DIRECTION": "смер", - "MOTION_SCROLLRIGHT": "клизи у десно %1", - "MOTION_SCROLLUP": "клизи горе %1", - "MOTION_ALIGNSCENE": "поравнај сцену %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "доле-лево", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "доле-десно", - "MOTION_ALIGNSCENE_MIDDLE": "средина", - "MOTION_ALIGNSCENE_TOPLEFT": "горе-лево", - "MOTION_ALIGNSCENE_TOPRIGHT": "горе-десно", - "MOTION_XSCROLL": "x клизање", - "MOTION_YSCROLL": "y клизање", - "MOTION_STAGE_SELECTED": "Издабрана је позорница: нема блокова за кретање", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "случајан број од %1 до %2 ", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 и %2", - "OPERATORS_OR": "%1 или %2", - "OPERATORS_NOT": "није %1", - "OPERATORS_JOIN": "споји %1 и %2", - "OPERATORS_JOIN_APPLE": "јабука", - "OPERATORS_JOIN_BANANA": "банана", - "OPERATORS_LETTEROF": "%1 слово од %2", - "OPERATORS_LETTEROF_APPLE": "ј", - "OPERATORS_LENGTH": "дужина %1", - "OPERATORS_CONTAINS": "%1 садржи %2", - "OPERATORS_MOD": "%1 мод %2", - "OPERATORS_ROUND": "заокружи %1", - "OPERATORS_MATHOP": "%1 од %2", - "OPERATORS_MATHOP_ABS": "абс", - "OPERATORS_MATHOP_FLOOR": "цео део", - "OPERATORS_MATHOP_CEILING": "цео+1", - "OPERATORS_MATHOP_SQRT": "корен", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "дефиниши %1", - "SENSING_TOUCHINGOBJECT": "додирује ли %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "показивач миша", - "SENSING_TOUCHINGOBJECT_EDGE": "ивица", - "SENSING_TOUCHINGCOLOR": "додирује ли боју %1?", - "SENSING_COLORISTOUCHINGCOLOR": "боја %1 додирује %2?", - "SENSING_DISTANCETO": "удаљеност од %1", - "SENSING_DISTANCETO_POINTER": "показивач миша", - "SENSING_ASKANDWAIT": "питај %1 и чекај", - "SENSING_ASK_TEXT": "Како се зовеш?", - "SENSING_ANSWER": "одговор", - "SENSING_KEYPRESSED": "дугме %1 је притиснуто?", - "SENSING_MOUSEDOWN": "миш притиснут?", - "SENSING_MOUSEX": "миш x", - "SENSING_MOUSEY": "миш y", - "SENSING_SETDRAGMODE": "нека начин превлачења буде %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "превлачиво", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "није превлачиво", - "SENSING_LOUDNESS": "јачина звука", - "SENSING_LOUD": "гласно?", - "SENSING_TIMER": "тајмер", - "SENSING_RESETTIMER": "постави тајмер на 0", - "SENSING_OF": "%1 од %2", - "SENSING_OF_XPOSITION": "x положај", - "SENSING_OF_YPOSITION": "y положај", - "SENSING_OF_DIRECTION": "смер", - "SENSING_OF_COSTUMENUMBER": "број костима", - "SENSING_OF_COSTUMENAME": "име костима", - "SENSING_OF_SIZE": "величина", - "SENSING_OF_VOLUME": "јачина звука", - "SENSING_OF_BACKDROPNUMBER": "број позадине", - "SENSING_OF_BACKDROPNAME": "име позадине", - "SENSING_OF_STAGE": "Позорница", - "SENSING_CURRENT": "тренутно %1", - "SENSING_CURRENT_YEAR": "година", - "SENSING_CURRENT_MONTH": "месец", - "SENSING_CURRENT_DATE": "датум", - "SENSING_CURRENT_DAYOFWEEK": "дан у недељи", - "SENSING_CURRENT_HOUR": "сат", - "SENSING_CURRENT_MINUTE": "минут", - "SENSING_CURRENT_SECOND": "секунда", - "SENSING_DAYSSINCE2000": "дана после 2000", - "SENSING_USERNAME": "корисничко име", - "SENSING_USERID": "Корисников ид", - "SOUND_PLAY": "покрени звук %1", - "SOUND_PLAYUNTILDONE": "репродукуј звук %1 до краја", - "SOUND_STOPALLSOUNDS": "заустави све звукове", - "SOUND_SETEFFECTO": "нека ефекат %1 буде %2", - "SOUND_CHANGEEFFECTBY": "промени ефекат %1 за %2", - "SOUND_CLEAREFFECTS": "уклони звучне ефекте", - "SOUND_EFFECTS_PITCH": "висина тона", - "SOUND_EFFECTS_PAN": "померање лево/десно", - "SOUND_CHANGEVOLUMEBY": "промени јачину звука за %1", - "SOUND_SETVOLUMETO": "нека јачина звука буде %1%", - "SOUND_VOLUME": "јачина звука", - "SOUND_RECORD": "сними...", - "CATEGORY_MOTION": "Кретање", - "CATEGORY_LOOKS": "Изглед", - "CATEGORY_SOUND": "Звук", - "CATEGORY_EVENTS": "Догађаји", - "CATEGORY_CONTROL": "Управљање", - "CATEGORY_SENSING": "Осећаји", - "CATEGORY_OPERATORS": "Оператори", - "CATEGORY_VARIABLES": "Променљиве", - "CATEGORY_MYBLOCKS": "Моји блокови", - "DUPLICATE": "Умножи", - "DELETE": "Обриши", - "ADD_COMMENT": "Додај коментар", - "REMOVE_COMMENT": "Уклони коментар", - "DELETE_BLOCK": "Обриши блок", - "DELETE_X_BLOCKS": "Обриши %1 блокова", - "DELETE_ALL_BLOCKS": "Обрисати свих %1 блокова?", - "CLEAN_UP": "Поспреми блокове", - "HELP": "Помоћ", - "UNDO": "Опозови", - "REDO": "Понови", - "EDIT_PROCEDURE": "Уреди", - "SHOW_PROCEDURE_DEFINITION": "Иди до дефиниције", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Кажи нешто...", - "COLOUR_HUE_LABEL": "Боја", - "COLOUR_SATURATION_LABEL": "Засићење", - "COLOUR_BRIGHTNESS_LABEL": "Осветљеност", - "CHANGE_VALUE_TITLE": "Промени вредност:", - "RENAME_VARIABLE": "Преименуј променљиву", - "RENAME_VARIABLE_TITLE": "Преименуј свих \"%1\" променљивих у:", - "RENAME_VARIABLE_MODAL_TITLE": "Преименуј променљиву", - "NEW_VARIABLE": "Направи променљиву", - "NEW_VARIABLE_TITLE": "Ново име променљиве:", - "VARIABLE_MODAL_TITLE": "Нова променљива", - "VARIABLE_ALREADY_EXISTS": "Име променљиве \"%1\" већ постоји.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Име променљиве \"%1\" већ постоји код друге променљиве типа \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Обрисати %1 употреба променљиве \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Не могу да обришем променљиву \"%1\" зато што је она део дефиниције функције \"%2\"", - "DELETE_VARIABLE": "Обриши променљиву \"%1\"", - "NEW_PROCEDURE": "Направи блок", - "PROCEDURE_ALREADY_EXISTS": "Процедура са именом \"%1\" већ постоји.", - "PROCEDURE_DEFAULT_NAME": "име блока", - "NEW_LIST": "Направи листу", - "NEW_LIST_TITLE": "Ново име листе:", - "LIST_MODAL_TITLE": "Нова листа", - "LIST_ALREADY_EXISTS": "Листа са именом \"%1\" већ постоји.", - "RENAME_LIST_TITLE": "Преименуј свих \"%1\" листи у:", - "RENAME_LIST_MODAL_TITLE": "Преименуј листу", - "DEFAULT_LIST_ITEM": "ствар", - "DELETE_LIST": "Обриши листу \"%1\"", - "RENAME_LIST": "Преименуј листу", - "NEW_BROADCAST_MESSAGE": "Нова порука", - "NEW_BROADCAST_MESSAGE_TITLE": "Име нове поруке:", - "BROADCAST_MODAL_TITLE": "Нова порука", - "DEFAULT_BROADCAST_MESSAGE_NAME": "порука1" -}; - -Blockly.ScratchMsgs.locales["sk"] = -{ - "CONTROL_FOREVER": "opakuj stále", - "CONTROL_REPEAT": "opakuj %1", - "CONTROL_IF": "ak %1", - "CONTROL_ELSE": "inak", - "CONTROL_STOP": "zastav", - "CONTROL_STOP_ALL": "všetko", - "CONTROL_STOP_THIS": "tento scenár", - "CONTROL_STOP_OTHER": "moje iné scenáre", - "CONTROL_WAIT": "čakaj %1 s", - "CONTROL_WAITUNTIL": "čakaj až kým %1", - "CONTROL_REPEATUNTIL": "opakuj až kým %1", - "CONTROL_WHILE": "opakuj ak %1", - "CONTROL_FOREACH": "pre každé %1 v %2", - "CONTROL_STARTASCLONE": "pri štarte klonu", - "CONTROL_CREATECLONEOF": "naklonuj %1", - "CONTROL_CREATECLONEOF_MYSELF": "seba", - "CONTROL_DELETETHISCLONE": "zruš tento klon", - "CONTROL_COUNTER": "počítadlo", - "CONTROL_INCRCOUNTER": "zvýš počítadlo", - "CONTROL_CLEARCOUNTER": "vynuluj počítadlo", - "CONTROL_ALLATONCE": "všetko naraz", - "DATA_SETVARIABLETO": "nastav %1 na %2", - "DATA_CHANGEVARIABLEBY": "zmeň %1 o %2", - "DATA_SHOWVARIABLE": "ukáž premennú %1", - "DATA_HIDEVARIABLE": "skry premennú %1", - "DATA_ADDTOLIST": "pridaj %1 do %2", - "DATA_DELETEOFLIST": "zruš %1 z %2", - "DATA_DELETEALLOFLIST": "zruš všetko z %1", - "DATA_INSERTATLIST": "vlož %1 na %2 v %3", - "DATA_REPLACEITEMOFLIST": "nahraď %1 v %2 hodnotou %3", - "DATA_ITEMOFLIST": "prvok %1 z %2", - "DATA_ITEMNUMOFLIST": "poradie prvku %1 v %2", - "DATA_LENGTHOFLIST": "dĺžka %1", - "DATA_LISTCONTAINSITEM": "%1 obsahuje %2?", - "DATA_SHOWLIST": "ukáž zoznam %1", - "DATA_HIDELIST": "skry zoznam %1", - "DATA_INDEX_ALL": "všetko", - "DATA_INDEX_LAST": "posledný", - "DATA_INDEX_RANDOM": "náhodný", - "EVENT_WHENFLAGCLICKED": "pri kliknutí na %1", - "EVENT_WHENTHISSPRITECLICKED": "pri kliknutí na mňa", - "EVENT_WHENSTAGECLICKED": "pri kliknutí na scénu", - "EVENT_WHENTOUCHINGOBJECT": "pri dotyku %1", - "EVENT_WHENBROADCASTRECEIVED": "pri prijatí správy %1", - "EVENT_WHENBACKDROPSWITCHESTO": "pri zmene pozadia na %1", - "EVENT_WHENGREATERTHAN": "pri %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "časovač", - "EVENT_WHENGREATERTHAN_LOUDNESS": "hlasitosť", - "EVENT_BROADCAST": "vyšli správu %1", - "EVENT_BROADCASTANDWAIT": "vyšli správu %1 a počkaj", - "EVENT_WHENKEYPRESSED": "pri stlačení %1", - "EVENT_WHENKEYPRESSED_SPACE": "medzerník", - "EVENT_WHENKEYPRESSED_LEFT": "šípka vľavo", - "EVENT_WHENKEYPRESSED_RIGHT": "šípka vpravo", - "EVENT_WHENKEYPRESSED_DOWN": "šípka dole", - "EVENT_WHENKEYPRESSED_UP": "šípka hore", - "EVENT_WHENKEYPRESSED_ANY": "hociktorý", - "LOOKS_SAYFORSECS": "bublina %1 %2 s", - "LOOKS_SAY": "bublina %1", - "LOOKS_HELLO": "Ahoj!", - "LOOKS_THINKFORSECS": "myšlienka %1 %2 s", - "LOOKS_THINK": "myšlienka %1", - "LOOKS_HMM": "Hm...", - "LOOKS_SHOW": "ukáž sa", - "LOOKS_HIDE": "skry sa", - "LOOKS_HIDEALLSPRITES": "skry všetky postavy", - "LOOKS_EFFECT_COLOR": "farba", - "LOOKS_EFFECT_FISHEYE": "rybie oko", - "LOOKS_EFFECT_WHIRL": "zvírenie", - "LOOKS_EFFECT_PIXELATE": "štvorčeky", - "LOOKS_EFFECT_MOSAIC": "mozaika", - "LOOKS_EFFECT_BRIGHTNESS": "jas", - "LOOKS_EFFECT_GHOST": "duch", - "LOOKS_CHANGEEFFECTBY": "zmeň efekt %1 o %2", - "LOOKS_SETEFFECTTO": "nastav efekt %1 na %2", - "LOOKS_CLEARGRAPHICEFFECTS": "zruš grafické efekty", - "LOOKS_CHANGESIZEBY": "zmeň veľkosť o %1 %", - "LOOKS_SETSIZETO": "nastav veľkosť na %1 %", - "LOOKS_SIZE": "veľkosť", - "LOOKS_CHANGESTRETCHBY": "zmeň natiahnutie o %1", - "LOOKS_SETSTRETCHTO": "nastav natiahnutie na %1 %", - "LOOKS_SWITCHCOSTUMETO": "zmeň kostým na %1", - "LOOKS_NEXTCOSTUME": "ďalší kostým", - "LOOKS_SWITCHBACKDROPTO": "zmeň pozadie na %1", - "LOOKS_GOTOFRONTBACK": "prejdi na %1 vrstvu", - "LOOKS_GOTOFRONTBACK_FRONT": "vrchnú", - "LOOKS_GOTOFRONTBACK_BACK": "spodnú", - "LOOKS_GOFORWARDBACKWARDLAYERS": "prejdi o %2 vrstiev %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "dopredu", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "dozadu", - "LOOKS_BACKDROPNUMBERNAME": "pozadie %1", - "LOOKS_COSTUMENUMBERNAME": "kostým %1", - "LOOKS_NUMBERNAME_NUMBER": "číslo", - "LOOKS_NUMBERNAME_NAME": "meno", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "zmeň pozadie na %1 a počkaj", - "LOOKS_NEXTBACKDROP_BLOCK": "ďalšie pozadie", - "LOOKS_NEXTBACKDROP": "ďalšie pozadie", - "LOOKS_PREVIOUSBACKDROP": "predchádzajúce pozadie", - "LOOKS_RANDOMBACKDROP": "náhodné pozadie", - "MOTION_MOVESTEPS": "dopredu %1", - "MOTION_TURNLEFT": "vľavo %1 %2", - "MOTION_TURNRIGHT": "vpravo %1 %2", - "MOTION_POINTINDIRECTION": "smerom %1", - "MOTION_POINTTOWARDS": "smerom k %1", - "MOTION_POINTTOWARDS_POINTER": "myš", - "MOTION_POINTTOWARDS_RANDOM": "náhodný smer", - "MOTION_GOTO": "skoč na %1", - "MOTION_GOTO_POINTER": "myš", - "MOTION_GOTO_RANDOM": "náhodná pozícia", - "MOTION_GOTOXY": "skoč na x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "kĺž sa %1 s na x: %2 y: %3", - "MOTION_GLIDETO": "kĺž sa %1 s na %2", - "MOTION_GLIDETO_POINTER": "myš", - "MOTION_GLIDETO_RANDOM": "náhodná pozícia", - "MOTION_CHANGEXBY": "zmeň x o %1", - "MOTION_SETX": "skoč na x: %1", - "MOTION_CHANGEYBY": "zmeň y o %1", - "MOTION_SETY": "skoč na y: %1", - "MOTION_IFONEDGEBOUNCE": "ak na okraji, odraz sa", - "MOTION_SETROTATIONSTYLE": "nastav otáčanie %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vľavo-vpravo", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "žiadne", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "podľa smeru", - "MOTION_XPOSITION": "pozícia x", - "MOTION_YPOSITION": "pozícia y", - "MOTION_DIRECTION": "smer", - "MOTION_SCROLLRIGHT": "posuň vpravo %1", - "MOTION_SCROLLUP": "presuň hore %1", - "MOTION_ALIGNSCENE": "zarovnaj scénu %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "vľavo dolu", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "vpravo dolu", - "MOTION_ALIGNSCENE_MIDDLE": "stred", - "MOTION_ALIGNSCENE_TOPLEFT": "vľavo hore", - "MOTION_ALIGNSCENE_TOPRIGHT": "vpravo hore", - "MOTION_XSCROLL": "posunutie x", - "MOTION_YSCROLL": "posunutie y", - "MOTION_STAGE_SELECTED": "Scéna nemá bloky pre pohyb", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "náhodne od %1 do %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 a %2", - "OPERATORS_OR": "%1 alebo %2", - "OPERATORS_NOT": "nie je %1", - "OPERATORS_JOIN": "spoj %1 %2", - "OPERATORS_JOIN_APPLE": "jablko", - "OPERATORS_JOIN_BANANA": "hruška", - "OPERATORS_LETTEROF": "znak %1 z %2", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "dĺžka %1", - "OPERATORS_CONTAINS": "%1 obsahuje %2?", - "OPERATORS_MOD": "zvyšok %1 / %2", - "OPERATORS_ROUND": "zaokrúhli %1", - "OPERATORS_MATHOP": "%1 z %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "zaokrúhli nadol", - "OPERATORS_MATHOP_CEILING": "zaokrúhli nahor", - "OPERATORS_MATHOP_SQRT": "odmocnina", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctg", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "exp", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "blok %1", - "SENSING_TOUCHINGOBJECT": "dotýkaš sa %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "myš", - "SENSING_TOUCHINGOBJECT_EDGE": "okraj", - "SENSING_TOUCHINGCOLOR": "dotýkaš sa %1?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 sa dotýkaš %2?", - "SENSING_DISTANCETO": "vzdialenosť k %1", - "SENSING_DISTANCETO_POINTER": "myš", - "SENSING_ASKANDWAIT": "otázka %1", - "SENSING_ASK_TEXT": "Ako sa voláš?", - "SENSING_ANSWER": "odpoveď", - "SENSING_KEYPRESSED": "stlačené %1?", - "SENSING_MOUSEDOWN": "stlačené tlačidlo myši?", - "SENSING_MOUSEX": "myš x", - "SENSING_MOUSEY": "myš y", - "SENSING_SETDRAGMODE": "hráč môže presúvať %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "áno ", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "nie", - "SENSING_LOUDNESS": "hlasitosť", - "SENSING_LOUD": "hlasný?", - "SENSING_TIMER": "časovač", - "SENSING_RESETTIMER": "vynuluj časovač", - "SENSING_OF": "%1 z %2", - "SENSING_OF_XPOSITION": "pozícia x", - "SENSING_OF_YPOSITION": "pozícia y", - "SENSING_OF_DIRECTION": "smer", - "SENSING_OF_COSTUMENUMBER": "číslo kostýmu", - "SENSING_OF_COSTUMENAME": "meno kostýmu", - "SENSING_OF_SIZE": "veľkosť", - "SENSING_OF_VOLUME": "hlasitosť", - "SENSING_OF_BACKDROPNUMBER": "číslo pozadia", - "SENSING_OF_BACKDROPNAME": "meno pozadia", - "SENSING_OF_STAGE": "Scéna", - "SENSING_CURRENT": "teraz je %1", - "SENSING_CURRENT_YEAR": "rok", - "SENSING_CURRENT_MONTH": "mesiac", - "SENSING_CURRENT_DATE": "deň v mesiaci", - "SENSING_CURRENT_DAYOFWEEK": "deň v týždni", - "SENSING_CURRENT_HOUR": "hod", - "SENSING_CURRENT_MINUTE": "min", - "SENSING_CURRENT_SECOND": "s", - "SENSING_DAYSSINCE2000": "dní od roku 2000", - "SENSING_USERNAME": "používateľ", - "SENSING_USERID": "užívateľské id", - "SOUND_PLAY": "zahraj zvuk %1", - "SOUND_PLAYUNTILDONE": "zahraj zvuk %1 až do konca", - "SOUND_STOPALLSOUNDS": "zastav všetky zvuky", - "SOUND_SETEFFECTO": "nastav efekt %1 na %2", - "SOUND_CHANGEEFFECTBY": "zmeň efekt %1 o %2", - "SOUND_CLEAREFFECTS": "zruš zvukové efekty", - "SOUND_EFFECTS_PITCH": "frekvencia", - "SOUND_EFFECTS_PAN": "stereo", - "SOUND_CHANGEVOLUMEBY": "zmeň hlasitosť o %1 %", - "SOUND_SETVOLUMETO": "nastav hlasitosť na %1% %", - "SOUND_VOLUME": "hlasitosť", - "SOUND_RECORD": "nahraj...", - "CATEGORY_MOTION": "Pohyb", - "CATEGORY_LOOKS": "Vzhľad", - "CATEGORY_SOUND": "Zvuk", - "CATEGORY_EVENTS": "Udalosti", - "CATEGORY_CONTROL": "Riadenie", - "CATEGORY_SENSING": "Zisťovanie", - "CATEGORY_OPERATORS": "Operácie", - "CATEGORY_VARIABLES": "Premenné", - "CATEGORY_MYBLOCKS": "Nové bloky", - "DUPLICATE": "duplikuj", - "DELETE": "zruš", - "ADD_COMMENT": "pridaj komentár", - "REMOVE_COMMENT": "zruš komentár", - "DELETE_BLOCK": "zruš blok", - "DELETE_X_BLOCKS": "zruš %1 blokov", - "DELETE_ALL_BLOCKS": "Naozaj chceš zrušiť %1 blokov?", - "CLEAN_UP": "uprac", - "HELP": "pomoc", - "UNDO": "späť", - "REDO": "znovu", - "EDIT_PROCEDURE": "uprav", - "SHOW_PROCEDURE_DEFINITION": "zobraz definíciu", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Poznámka", - "COLOUR_HUE_LABEL": "farba", - "COLOUR_SATURATION_LABEL": "sýtosť", - "COLOUR_BRIGHTNESS_LABEL": "jas", - "CHANGE_VALUE_TITLE": "Zmeň hodnotu:", - "RENAME_VARIABLE": "premenuj", - "RENAME_VARIABLE_TITLE": "Premenuj všetky výskyty premennej \"%1\":", - "RENAME_VARIABLE_MODAL_TITLE": "Premenuj premennú", - "NEW_VARIABLE": "Nová premenná", - "NEW_VARIABLE_TITLE": "Meno premennej:", - "VARIABLE_MODAL_TITLE": "Nová premenná", - "VARIABLE_ALREADY_EXISTS": "Premenná s menom \"%1\" už existuje.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Premenná s menom \"%1\" už existuje pre inú prememnú typu \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Naozaj mám zrušiť %1 výskytov premennej \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nemôžem zrušiť premennú \"%1\", pretože je súčasťou definície funkcie \"%2\".", - "DELETE_VARIABLE": "zruš premennú \"%1\"", - "NEW_PROCEDURE": "Nový blok", - "PROCEDURE_ALREADY_EXISTS": "Blok \"%1\" už existuje.", - "PROCEDURE_DEFAULT_NAME": "meno bloku", - "NEW_LIST": "Nový zoznam", - "NEW_LIST_TITLE": "Meno nového zoznamu:", - "LIST_MODAL_TITLE": "Nový zoznam", - "LIST_ALREADY_EXISTS": "Zoznam \"%1\" už existuje.", - "RENAME_LIST_TITLE": "Premenuj zoznam \"%1\" na:", - "RENAME_LIST_MODAL_TITLE": "Premenuj zoznam", - "DEFAULT_LIST_ITEM": "hodnota", - "DELETE_LIST": "zruš zoznam \"%1\"", - "RENAME_LIST": "premenuj zoznam", - "NEW_BROADCAST_MESSAGE": "nová správa...", - "NEW_BROADCAST_MESSAGE_TITLE": "Meno novej správy:", - "BROADCAST_MODAL_TITLE": "Nová správa", - "DEFAULT_BROADCAST_MESSAGE_NAME": "správa1" -}; - -Blockly.ScratchMsgs.locales["sl"] = -{ - "CONTROL_FOREVER": "ponavljaj", - "CONTROL_REPEAT": "ponovi %1 krat", - "CONTROL_IF": "če %1 potem", - "CONTROL_ELSE": "sicer", - "CONTROL_STOP": "ustavi", - "CONTROL_STOP_ALL": "vse", - "CONTROL_STOP_THIS": "te ukaze", - "CONTROL_STOP_OTHER": "ostale ukaze za to figuro", - "CONTROL_WAIT": "počakaj %1 sekund", - "CONTROL_WAITUNTIL": "počakaj dokler ni %1", - "CONTROL_REPEATUNTIL": "ponavljaj do %1", - "CONTROL_WHILE": "dokler %1", - "CONTROL_FOREACH": "za vsak %1 v %2", - "CONTROL_STARTASCLONE": "ko začnem kot dvojnik", - "CONTROL_CREATECLONEOF": "ustvari dvojnika %1", - "CONTROL_CREATECLONEOF_MYSELF": "sebe", - "CONTROL_DELETETHISCLONE": "zbriši tega dvojnika", - "CONTROL_COUNTER": "števec", - "CONTROL_INCRCOUNTER": "povečaj števec", - "CONTROL_CLEARCOUNTER": "počisti števec", - "CONTROL_ALLATONCE": "vse hkrati", - "DATA_SETVARIABLETO": "nastavi %1 na %2", - "DATA_CHANGEVARIABLEBY": "spremeni %1 za %2", - "DATA_SHOWVARIABLE": "pokaži spremenljivko %1", - "DATA_HIDEVARIABLE": "skrij spremenljivko %1", - "DATA_ADDTOLIST": "dodaj %1 k %2", - "DATA_DELETEOFLIST": "zbriši %1 v %2", - "DATA_DELETEALLOFLIST": "izbriši vse v %1", - "DATA_INSERTATLIST": "vstavi %1 na %2 v %3", - "DATA_REPLACEITEMOFLIST": "zamenjaj %1 v %2 z %3", - "DATA_ITEMOFLIST": "element %1 v %2", - "DATA_ITEMNUMOFLIST": "predmet # od %1 v %2", - "DATA_LENGTHOFLIST": "dolžina %1", - "DATA_LISTCONTAINSITEM": "Ali %1 vsebuje %2?", - "DATA_SHOWLIST": "pokaži seznam %1", - "DATA_HIDELIST": "skrij seznam %1", - "DATA_INDEX_ALL": "vse", - "DATA_INDEX_LAST": "zadnji", - "DATA_INDEX_RANDOM": "naključno", - "EVENT_WHENFLAGCLICKED": "ko kliknemo na %1", - "EVENT_WHENTHISSPRITECLICKED": "ko kliknemo to figuro", - "EVENT_WHENSTAGECLICKED": "ko kliknemo na oder", - "EVENT_WHENTOUCHINGOBJECT": "ko se ta figura dotika %1", - "EVENT_WHENBROADCASTRECEIVED": "ko prejmem %1", - "EVENT_WHENBACKDROPSWITCHESTO": "ko se ozadje zamenja na %1", - "EVENT_WHENGREATERTHAN": "ko je %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "štoparica", - "EVENT_WHENGREATERTHAN_LOUDNESS": "glasnost", - "EVENT_BROADCAST": "objavi %1", - "EVENT_BROADCASTANDWAIT": "objavi %1 in čakaj", - "EVENT_WHENKEYPRESSED": "ko je pritisnjena tipka %1 ", - "EVENT_WHENKEYPRESSED_SPACE": "presledek", - "EVENT_WHENKEYPRESSED_LEFT": "puščica levo", - "EVENT_WHENKEYPRESSED_RIGHT": "puščica desno", - "EVENT_WHENKEYPRESSED_DOWN": "puščica dol", - "EVENT_WHENKEYPRESSED_UP": "puščica gor", - "EVENT_WHENKEYPRESSED_ANY": "poljubna", - "LOOKS_SAYFORSECS": "reci %1 za %2 sekund", - "LOOKS_SAY": "reci %1", - "LOOKS_HELLO": "Živjo!", - "LOOKS_THINKFORSECS": "pomisli %1 za %2 sekund", - "LOOKS_THINK": "pomisli %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "pokaži", - "LOOKS_HIDE": "skrij", - "LOOKS_HIDEALLSPRITES": "skrij vse figure", - "LOOKS_EFFECT_COLOR": "barva", - "LOOKS_EFFECT_FISHEYE": "ribje oko", - "LOOKS_EFFECT_WHIRL": "vrtinec", - "LOOKS_EFFECT_PIXELATE": "pikčasto", - "LOOKS_EFFECT_MOSAIC": "mozaik", - "LOOKS_EFFECT_BRIGHTNESS": "svetlost", - "LOOKS_EFFECT_GHOST": "duh", - "LOOKS_CHANGEEFFECTBY": "spremeni učinek %1 za %2", - "LOOKS_SETEFFECTTO": "nastavi učinek %1 na %2", - "LOOKS_CLEARGRAPHICEFFECTS": "odstrani slikovne učinke", - "LOOKS_CHANGESIZEBY": "spremeni velikost za %1", - "LOOKS_SETSIZETO": "nastavi velikost na %1 %", - "LOOKS_SIZE": "velikost", - "LOOKS_CHANGESTRETCHBY": "spremeni razteg za %1", - "LOOKS_SETSTRETCHTO": "nastavi razteg na %1 %", - "LOOKS_SWITCHCOSTUMETO": "zamenjaj videz na %1", - "LOOKS_NEXTCOSTUME": "naslednji videz", - "LOOKS_SWITCHBACKDROPTO": "zamenjaj ozadje na %1", - "LOOKS_GOTOFRONTBACK": "pojdi na %1 plast", - "LOOKS_GOTOFRONTBACK_FRONT": "spredaj", - "LOOKS_GOTOFRONTBACK_BACK": "zadaj", - "LOOKS_GOFORWARDBACKWARDLAYERS": "pojdi %1 %2 plasti", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "naprej", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "nazaj", - "LOOKS_BACKDROPNUMBERNAME": "ozadje %1", - "LOOKS_COSTUMENUMBERNAME": "videz %1", - "LOOKS_NUMBERNAME_NUMBER": "število", - "LOOKS_NUMBERNAME_NAME": "ime", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "zamenjaj ozadje na %1 in počakaj", - "LOOKS_NEXTBACKDROP_BLOCK": "naslednje ozadje", - "LOOKS_NEXTBACKDROP": "naslednje ozadje", - "LOOKS_PREVIOUSBACKDROP": "prejšnje ozadje", - "LOOKS_RANDOMBACKDROP": "naključno ozadje", - "MOTION_MOVESTEPS": "pojdi %1 korakov", - "MOTION_TURNLEFT": "obrni se za %1 %2 stopinj", - "MOTION_TURNRIGHT": "obrni se za %1 %2 stopinj", - "MOTION_POINTINDIRECTION": "obrni se v smer %1", - "MOTION_POINTTOWARDS": "obrni se proti %1", - "MOTION_POINTTOWARDS_POINTER": "kazalcu miške", - "MOTION_POINTTOWARDS_RANDOM": "naključna smer", - "MOTION_GOTO": "pojdi na %1", - "MOTION_GOTO_POINTER": "kazalcu miške", - "MOTION_GOTO_RANDOM": "naključno mesto", - "MOTION_GOTOXY": "pojdi na x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "drsi %1 sekund do x: %2 y: %3", - "MOTION_GLIDETO": "drsi %1 sekund do %2", - "MOTION_GLIDETO_POINTER": "kazalca miške", - "MOTION_GLIDETO_RANDOM": "naključnega mesta", - "MOTION_CHANGEXBY": "spremeni x za %1", - "MOTION_SETX": "nastavi x na %1", - "MOTION_CHANGEYBY": "spremeni y za %1", - "MOTION_SETY": "nastavi y na %1", - "MOTION_IFONEDGEBOUNCE": "odbij se, če si na robu", - "MOTION_SETROTATIONSTYLE": "Način vrtenja %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "levo-desno", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "ne zasukaj", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "na vse strani", - "MOTION_XPOSITION": "položaj x", - "MOTION_YPOSITION": "položaj y", - "MOTION_DIRECTION": "smer", - "MOTION_SCROLLRIGHT": "premik desno %1", - "MOTION_SCROLLUP": "premik gor%1", - "MOTION_ALIGNSCENE": "poravnaj sceno %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "levo spodaj", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "desno spodaj", - "MOTION_ALIGNSCENE_MIDDLE": "sredina", - "MOTION_ALIGNSCENE_TOPLEFT": "levo zgoraj", - "MOTION_ALIGNSCENE_TOPRIGHT": "desno zgoraj", - "MOTION_XSCROLL": "premik v smeri x", - "MOTION_YSCROLL": "premik v smeri y", - "MOTION_STAGE_SELECTED": "Izbran oder: ni blokov za premikanje", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "naključno število med %1 in %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 in %2", - "OPERATORS_OR": "%1 ali %2", - "OPERATORS_NOT": "ne %1", - "OPERATORS_JOIN": "združi %1 %2", - "OPERATORS_JOIN_APPLE": "jabolko", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "%1 črka v %2", - "OPERATORS_LETTEROF_APPLE": "b", - "OPERATORS_LENGTH": "dolžina %1", - "OPERATORS_CONTAINS": "%1 vsebuje %2?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "zaokroži %1", - "OPERATORS_MATHOP": "%1 od %2", - "OPERATORS_MATHOP_ABS": "absolutna vrednost", - "OPERATORS_MATHOP_FLOOR": "zaokroženo navzdol", - "OPERATORS_MATHOP_CEILING": "zaokroženo navzgor", - "OPERATORS_MATHOP_SQRT": "kvadratni koren ", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tg", - "OPERATORS_MATHOP_ASIN": "arcsin", - "OPERATORS_MATHOP_ACOS": "arccos", - "OPERATORS_MATHOP_ATAN": "arctg", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definiraj %1", - "SENSING_TOUCHINGOBJECT": "se dotika %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "kazalca miške", - "SENSING_TOUCHINGOBJECT_EDGE": "roba", - "SENSING_TOUCHINGCOLOR": "se dotika barve %1?", - "SENSING_COLORISTOUCHINGCOLOR": "se barva %1 dotika %2?", - "SENSING_DISTANCETO": "razdalja do %1", - "SENSING_DISTANCETO_POINTER": "kazalca miške", - "SENSING_ASKANDWAIT": "vprašaj %1 in počakaj", - "SENSING_ASK_TEXT": "Kako ti je ime?", - "SENSING_ANSWER": "odgovor", - "SENSING_KEYPRESSED": "je pritisnjena tipka %1?", - "SENSING_MOUSEDOWN": "je miškin gumb pritisnjen?", - "SENSING_MOUSEX": "miškin x", - "SENSING_MOUSEY": "miškin y", - "SENSING_SETDRAGMODE": "Možnost premika naj bo %1 ", - "SENSING_SETDRAGMODE_DRAGGABLE": "možno premikati", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "ne moremo premikati", - "SENSING_LOUDNESS": "glasnost", - "SENSING_LOUD": "glasno?", - "SENSING_TIMER": "štoparica", - "SENSING_RESETTIMER": "ponastavi štoparico", - "SENSING_OF": "%1 od %2", - "SENSING_OF_XPOSITION": "položaj x", - "SENSING_OF_YPOSITION": "položaj y", - "SENSING_OF_DIRECTION": "smer", - "SENSING_OF_COSTUMENUMBER": "videz #", - "SENSING_OF_COSTUMENAME": "ime videza", - "SENSING_OF_SIZE": "velikost", - "SENSING_OF_VOLUME": "glasnost", - "SENSING_OF_BACKDROPNUMBER": "ozadje #", - "SENSING_OF_BACKDROPNAME": "ime ozadja", - "SENSING_OF_STAGE": "Oder", - "SENSING_CURRENT": "trenutni %1", - "SENSING_CURRENT_YEAR": "leto", - "SENSING_CURRENT_MONTH": "mesec", - "SENSING_CURRENT_DATE": "datum", - "SENSING_CURRENT_DAYOFWEEK": "dan v tednu", - "SENSING_CURRENT_HOUR": "ura", - "SENSING_CURRENT_MINUTE": "minuta", - "SENSING_CURRENT_SECOND": "sekunda", - "SENSING_DAYSSINCE2000": "dni od leta 2000", - "SENSING_USERNAME": "uporabniško ime", - "SENSING_USERID": "uporabnikova številka", - "SOUND_PLAY": "predvajaj zvok %1", - "SOUND_PLAYUNTILDONE": "predvajaj zvok %1 do konca", - "SOUND_STOPALLSOUNDS": "ustavi vse zvoke", - "SOUND_SETEFFECTO": "nastavi učinek %1 na %2", - "SOUND_CHANGEEFFECTBY": "spremeni učinek %1 za %2", - "SOUND_CLEAREFFECTS": "izbriši zvočne učinke", - "SOUND_EFFECTS_PITCH": "višina tona", - "SOUND_EFFECTS_PAN": "premik levo/desno", - "SOUND_CHANGEVOLUMEBY": "spremeni glasnost za %1", - "SOUND_SETVOLUMETO": "nastavi glasnost na %1%", - "SOUND_VOLUME": "glasnost", - "SOUND_RECORD": "posnami...", - "CATEGORY_MOTION": "Gibanje", - "CATEGORY_LOOKS": "Videzi", - "CATEGORY_SOUND": "Zvok", - "CATEGORY_EVENTS": "Dogodki", - "CATEGORY_CONTROL": "Krmiljenje", - "CATEGORY_SENSING": "Zaznavanje", - "CATEGORY_OPERATORS": "Operatorji", - "CATEGORY_VARIABLES": "Spremenljivke", - "CATEGORY_MYBLOCKS": "Moji bloki", - "DUPLICATE": "Podvoji", - "DELETE": "Izbriši", - "ADD_COMMENT": "Dodaj komentar", - "REMOVE_COMMENT": "Odstrani komentar", - "DELETE_BLOCK": "Izbriši blok", - "DELETE_X_BLOCKS": "Izbriši %1 blokov", - "DELETE_ALL_BLOCKS": "Naj izbrišem vseh %1 blokov?", - "CLEAN_UP": "Počisti bloke", - "HELP": "Pomoč", - "UNDO": "Razveljavi", - "REDO": "Uveljavi", - "EDIT_PROCEDURE": "Uredi", - "SHOW_PROCEDURE_DEFINITION": "Pojdi na definicijo", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Reci kaj ...", - "COLOUR_HUE_LABEL": "Barva", - "COLOUR_SATURATION_LABEL": "Nasičenost", - "COLOUR_BRIGHTNESS_LABEL": "Svetlost", - "CHANGE_VALUE_TITLE": "Spremeni vrednost: ", - "RENAME_VARIABLE": "Preimenuj spremenljivko", - "RENAME_VARIABLE_TITLE": "Preimenuj vse spremenljivke \"%1\" v:", - "RENAME_VARIABLE_MODAL_TITLE": "Preimenuj spremenljivko", - "NEW_VARIABLE": "Ustvari spremenljivko", - "NEW_VARIABLE_TITLE": "Novo ime spremenljivke:", - "VARIABLE_MODAL_TITLE": "Nova spremenljivka", - "VARIABLE_ALREADY_EXISTS": "Spremenljivka z imenom \"%1\" že obstaja.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Spremenljivka z imenom \"%1\" že obstaja in je tipa \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Izbrisati %1 uporab spremenljivke \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ne morem izbrisati spremenljivke \"%1\", ker je del definicije funkcije \"%2\"", - "DELETE_VARIABLE": "Izbriši spremenljivko \"%1\"", - "NEW_PROCEDURE": "Ustvari blok", - "PROCEDURE_ALREADY_EXISTS": "Postopek z imenom \"%1\" že obstaja", - "PROCEDURE_DEFAULT_NAME": "ime bloka", - "NEW_LIST": "Ustvari seznam", - "NEW_LIST_TITLE": "Novi ime seznama:", - "LIST_MODAL_TITLE": "Nov seznam", - "LIST_ALREADY_EXISTS": "Seznam z imenom \"%1\" že obstaja.", - "RENAME_LIST_TITLE": "Preimenuj seznam \"%1\" v:", - "RENAME_LIST_MODAL_TITLE": "Preimenuj seznam", - "DEFAULT_LIST_ITEM": "stvar", - "DELETE_LIST": "Izbriši seznam \"%1\" ", - "RENAME_LIST": "Preimenuj seznam", - "NEW_BROADCAST_MESSAGE": "Novo sporočilo", - "NEW_BROADCAST_MESSAGE_TITLE": "Ime novega sporočila:", - "BROADCAST_MODAL_TITLE": "Novo sporočilo", - "DEFAULT_BROADCAST_MESSAGE_NAME": "sporočilo1" -}; - -Blockly.ScratchMsgs.locales["fi"] = -{ - "CONTROL_FOREVER": "ikuisesti", - "CONTROL_REPEAT": "toista %1 kertaa", - "CONTROL_IF": "jos %1, niin", - "CONTROL_ELSE": "tai muuten", - "CONTROL_STOP": "pysäytä", - "CONTROL_STOP_ALL": "kaikki", - "CONTROL_STOP_THIS": "tämä koodi", - "CONTROL_STOP_OTHER": "hahmon muut koodit", - "CONTROL_WAIT": "odota %1 sekuntia", - "CONTROL_WAITUNTIL": "odota kunnes %1", - "CONTROL_REPEATUNTIL": "toista kunnes %1", - "CONTROL_WHILE": "kun %1", - "CONTROL_FOREACH": "jokainen %1 joukossa %2", - "CONTROL_STARTASCLONE": "kun aloitan kloonina", - "CONTROL_CREATECLONEOF": "luo klooni hahmosta %1", - "CONTROL_CREATECLONEOF_MYSELF": "minä itse", - "CONTROL_DELETETHISCLONE": "poista tämä klooni", - "CONTROL_COUNTER": "laskuri", - "CONTROL_INCRCOUNTER": "lisäyslaskuri", - "CONTROL_CLEARCOUNTER": "nollaa laskuri", - "CONTROL_ALLATONCE": "kaikki kerralla", - "DATA_SETVARIABLETO": "aseta %1 arvoon %2", - "DATA_CHANGEVARIABLEBY": "lisää muuttujaan %1 arvo %2", - "DATA_SHOWVARIABLE": "näytä muuttuja %1", - "DATA_HIDEVARIABLE": "piilota muuttuja %1", - "DATA_ADDTOLIST": "lisää %1 listaan %2", - "DATA_DELETEOFLIST": "poista %1 listasta %2", - "DATA_DELETEALLOFLIST": "poista kaikki listasta %1", - "DATA_INSERTATLIST": "lisää %1 kohtaan %2 listassa %3", - "DATA_REPLACEITEMOFLIST": "korvaa listan %2 kohdan %1 arvo arvolla %3", - "DATA_ITEMOFLIST": "listan %2 %1. kohde", - "DATA_ITEMNUMOFLIST": "kohteen %1 numero listassa %2", - "DATA_LENGTHOFLIST": "listan %1 pituus", - "DATA_LISTCONTAINSITEM": "%1 sisältää %2?", - "DATA_SHOWLIST": "näytä lista %1", - "DATA_HIDELIST": "piilota lista %1", - "DATA_INDEX_ALL": "kaikki", - "DATA_INDEX_LAST": "viimeinen", - "DATA_INDEX_RANDOM": "satunnainen", - "EVENT_WHENFLAGCLICKED": "kun klikataan %1", - "EVENT_WHENTHISSPRITECLICKED": "kun tätä hahmoa klikataan", - "EVENT_WHENSTAGECLICKED": "kun esiintymislavaa klikataan", - "EVENT_WHENTOUCHINGOBJECT": "kun tämä hahmo koskettaa %1", - "EVENT_WHENBROADCASTRECEIVED": "kun vastaanotan %1", - "EVENT_WHENBACKDROPSWITCHESTO": "kun taustaksi vaihtuu %1", - "EVENT_WHENGREATERTHAN": "kun %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "ajastin", - "EVENT_WHENGREATERTHAN_LOUDNESS": "äänentaso", - "EVENT_BROADCAST": "lähetä %1", - "EVENT_BROADCASTANDWAIT": "lähetä %1 ja odota", - "EVENT_WHENKEYPRESSED": "kun painetaan %1", - "EVENT_WHENKEYPRESSED_SPACE": "välilyönti", - "EVENT_WHENKEYPRESSED_LEFT": "nuoli vasemmalle", - "EVENT_WHENKEYPRESSED_RIGHT": "nuoli oikealle", - "EVENT_WHENKEYPRESSED_DOWN": "nuoli alas", - "EVENT_WHENKEYPRESSED_UP": "nuoli ylös", - "EVENT_WHENKEYPRESSED_ANY": "mikä tahansa", - "LOOKS_SAYFORSECS": "sano %1 %2 sekunnin ajan", - "LOOKS_SAY": "sano %1", - "LOOKS_HELLO": "Hei!", - "LOOKS_THINKFORSECS": "ajattele %1 %2 sekunnin ajan", - "LOOKS_THINK": "ajattele %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "näytä", - "LOOKS_HIDE": "piilota", - "LOOKS_HIDEALLSPRITES": "piilota kaikki hahmot", - "LOOKS_EFFECT_COLOR": "väri", - "LOOKS_EFFECT_FISHEYE": "kalansilmä", - "LOOKS_EFFECT_WHIRL": "pyörre", - "LOOKS_EFFECT_PIXELATE": "pikselöi", - "LOOKS_EFFECT_MOSAIC": "mosaiikki", - "LOOKS_EFFECT_BRIGHTNESS": "kirkkaus", - "LOOKS_EFFECT_GHOST": "haamu", - "LOOKS_CHANGEEFFECTBY": "lisää %1 tehostetta arvolla %2", - "LOOKS_SETEFFECTTO": "aseta tehoste %1 arvoon %2", - "LOOKS_CLEARGRAPHICEFFECTS": "poista graafiset tehosteet", - "LOOKS_CHANGESIZEBY": "kasvata kokoa arvolla %1", - "LOOKS_SETSIZETO": "aseta koko arvoon %1 %", - "LOOKS_SIZE": "koko", - "LOOKS_CHANGESTRETCHBY": "lisää venytystä arvolla %1", - "LOOKS_SETSTRETCHTO": "aseta venytys arvoon %1 %", - "LOOKS_SWITCHCOSTUMETO": "vaihda asusteeksi %1", - "LOOKS_NEXTCOSTUME": "seuraava asuste", - "LOOKS_SWITCHBACKDROPTO": "vaihda taustaksi %1", - "LOOKS_GOTOFRONTBACK": "mene %1 alalle", - "LOOKS_GOTOFRONTBACK_FRONT": "etu", - "LOOKS_GOTOFRONTBACK_BACK": "taka", - "LOOKS_GOFORWARDBACKWARDLAYERS": "mene %2 tasoa %1", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "eteenpäin", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "taaksepäin", - "LOOKS_BACKDROPNUMBERNAME": "tausta %1", - "LOOKS_COSTUMENUMBERNAME": "asuste %1", - "LOOKS_NUMBERNAME_NUMBER": "luku", - "LOOKS_NUMBERNAME_NAME": "nimi", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "vaihda taustaksi %1 ja odota", - "LOOKS_NEXTBACKDROP_BLOCK": "seuraava tausta", - "LOOKS_NEXTBACKDROP": "seuraava tausta", - "LOOKS_PREVIOUSBACKDROP": "edellinen tausta", - "LOOKS_RANDOMBACKDROP": "satunnainen tausta", - "MOTION_MOVESTEPS": "liiku %1 askelta", - "MOTION_TURNLEFT": "käänny %1 %2 astetta", - "MOTION_TURNRIGHT": "käänny %1 %2 astetta", - "MOTION_POINTINDIRECTION": "osoita suuntaan %1", - "MOTION_POINTTOWARDS": "osoita kohti %1", - "MOTION_POINTTOWARDS_POINTER": "hiiren osoitin", - "MOTION_POINTTOWARDS_RANDOM": "satunnainen suunta", - "MOTION_GOTO": "mene sijaintiin %1", - "MOTION_GOTO_POINTER": "hiiren osoitin", - "MOTION_GOTO_RANDOM": "satunnainen sijainti", - "MOTION_GOTOXY": "mene sijaintiin x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "liu'u %1 sekuntia sijaintiin x: %2 y: %3", - "MOTION_GLIDETO": "liu'u %1 sekuntia sijaintiin %2", - "MOTION_GLIDETO_POINTER": "hiiren osoitin", - "MOTION_GLIDETO_RANDOM": "satunnainen sijainti", - "MOTION_CHANGEXBY": "lisää x:n arvoon %1", - "MOTION_SETX": "aseta x:n arvoksi %1", - "MOTION_CHANGEYBY": "lisää y:n arvoon %1", - "MOTION_SETY": "aseta y:n arvoksi %1", - "MOTION_IFONEDGEBOUNCE": "kimpoa reunasta", - "MOTION_SETROTATIONSTYLE": "aseta kiertotyyliksi %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vasen-oikea", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "älä kierrä", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "joka suuntaan", - "MOTION_XPOSITION": "x-sijainti", - "MOTION_YPOSITION": "y-sijainti", - "MOTION_DIRECTION": "suunta", - "MOTION_SCROLLRIGHT": "kierrä oikealle %1", - "MOTION_SCROLLUP": "kierrä ylös %1", - "MOTION_ALIGNSCENE": "tasaa näkymä %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "alavasen", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "alaoikea", - "MOTION_ALIGNSCENE_MIDDLE": "keskikohta", - "MOTION_ALIGNSCENE_TOPLEFT": "ylävasen", - "MOTION_ALIGNSCENE_TOPRIGHT": "yläoikea", - "MOTION_XSCROLL": "x-kierto", - "MOTION_YSCROLL": "y-kierto", - "MOTION_STAGE_SELECTED": "Esiintymislava valittu: ei liikelohkoja", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "valitse satunnaisluku väliltä %1 – %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 ja %2", - "OPERATORS_OR": "%1 tai %2", - "OPERATORS_NOT": "ei %1", - "OPERATORS_JOIN": "yhdistä %1 ja %2", - "OPERATORS_JOIN_APPLE": "omena", - "OPERATORS_JOIN_BANANA": "banaani", - "OPERATORS_LETTEROF": "%1. kirjain sanasta %2", - "OPERATORS_LETTEROF_APPLE": "o", - "OPERATORS_LENGTH": "sanan %1 pituus", - "OPERATORS_CONTAINS": "%1 sisältää %2?", - "OPERATORS_MOD": "lukujen %1 ja %2 jakojäännös", - "OPERATORS_ROUND": "pyöristä %1", - "OPERATORS_MATHOP": "%1 luvusta %2", - "OPERATORS_MATHOP_ABS": "itseisarvo", - "OPERATORS_MATHOP_FLOOR": "pyöristä alaspäin", - "OPERATORS_MATHOP_CEILING": "pyöristä ylöspäin", - "OPERATORS_MATHOP_SQRT": "neliöjuuri", - "OPERATORS_MATHOP_SIN": "sini", - "OPERATORS_MATHOP_COS": "kosini", - "OPERATORS_MATHOP_TAN": "tangentti", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "luonnollinen logaritmi", - "OPERATORS_MATHOP_LOG": "10-kantainen logaritmi", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "määrittele %1", - "SENSING_TOUCHINGOBJECT": "koskettaako %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "hiiren osoitin", - "SENSING_TOUCHINGOBJECT_EDGE": "reuna", - "SENSING_TOUCHINGCOLOR": "koskettaako väriä %1?", - "SENSING_COLORISTOUCHINGCOLOR": "koskeeko väri %1 väriä %2?", - "SENSING_DISTANCETO": "etäisyys kohteeseen %1", - "SENSING_DISTANCETO_POINTER": "hiiren osoitin", - "SENSING_ASKANDWAIT": "kysy %1 ja odota", - "SENSING_ASK_TEXT": "Mikä on nimesi?", - "SENSING_ANSWER": "vastaus", - "SENSING_KEYPRESSED": "onko näppäin %1 painettu?", - "SENSING_MOUSEDOWN": "onko hiiren nappi painettu?", - "SENSING_MOUSEX": "hiiren x-sijainti", - "SENSING_MOUSEY": "hiiren y-sijainti", - "SENSING_SETDRAGMODE": "aseta raahaustilaksi %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "raahaus sallittu", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "raahaus ei sallittu", - "SENSING_LOUDNESS": "äänentaso", - "SENSING_LOUD": "kova äänentaso?", - "SENSING_TIMER": "ajastin", - "SENSING_RESETTIMER": "nollaa ajastin", - "SENSING_OF": "kohteen %2 %1", - "SENSING_OF_XPOSITION": "x-sijainti", - "SENSING_OF_YPOSITION": "y-sijainti", - "SENSING_OF_DIRECTION": "suunta", - "SENSING_OF_COSTUMENUMBER": "asusteen numero", - "SENSING_OF_COSTUMENAME": "asusteen nimi", - "SENSING_OF_SIZE": "koko", - "SENSING_OF_VOLUME": "äänenvoimakkuus", - "SENSING_OF_BACKDROPNUMBER": "taustan numero", - "SENSING_OF_BACKDROPNAME": "taustan nimi", - "SENSING_OF_STAGE": "Esiintymislava", - "SENSING_CURRENT": "nykyinen %1", - "SENSING_CURRENT_YEAR": "vuosi", - "SENSING_CURRENT_MONTH": "kuukausi", - "SENSING_CURRENT_DATE": "päiväys", - "SENSING_CURRENT_DAYOFWEEK": "viikonpäivä", - "SENSING_CURRENT_HOUR": "tunti", - "SENSING_CURRENT_MINUTE": "minuutti", - "SENSING_CURRENT_SECOND": "sekunti", - "SENSING_DAYSSINCE2000": "päiviä vuoden 2000 jälkeen", - "SENSING_USERNAME": "käyttäjänimi", - "SENSING_USERID": "käyttäjä-id", - "SOUND_PLAY": "soita ääni %1", - "SOUND_PLAYUNTILDONE": "soita ääni %1 loppuun", - "SOUND_STOPALLSOUNDS": "pysäytä kaikki äänet", - "SOUND_SETEFFECTO": "aseta tehoste %1 arvoon %2", - "SOUND_CHANGEEFFECTBY": " lisää tehosteeseen %1 arvo %2", - "SOUND_CLEAREFFECTS": "poista ääniefektit", - "SOUND_EFFECTS_PITCH": "sävelkorkeus", - "SOUND_EFFECTS_PAN": "panoroi vasen/oikea", - "SOUND_CHANGEVOLUMEBY": "lisää äänenvoimakkuutta arvolla %1", - "SOUND_SETVOLUMETO": "aseta äänenvoimakkuudeksi %1%", - "SOUND_VOLUME": "äänenvoimakkuus", - "SOUND_RECORD": "nauhoita...", - "CATEGORY_MOTION": "Liike", - "CATEGORY_LOOKS": "Ulkonäkö", - "CATEGORY_SOUND": "Ääni", - "CATEGORY_EVENTS": "Tapahtumat", - "CATEGORY_CONTROL": "Ohjaus", - "CATEGORY_SENSING": "Tuntoaisti", - "CATEGORY_OPERATORS": "Toiminnot", - "CATEGORY_VARIABLES": "Muuttujat", - "CATEGORY_MYBLOCKS": "Lohkoni", - "DUPLICATE": "Kopioi", - "DELETE": "Poista", - "ADD_COMMENT": "Lisää kommentti", - "REMOVE_COMMENT": "Poista kommentti", - "DELETE_BLOCK": "Poista lohko", - "DELETE_X_BLOCKS": "Poista %1 lohkoa", - "DELETE_ALL_BLOCKS": "Poistetaanko kaikki %1 lohkoa?", - "CLEAN_UP": "Siivoa lohkot", - "HELP": "Apua", - "UNDO": "Kumoa", - "REDO": "Tee uudelleen", - "EDIT_PROCEDURE": "Muokkaa", - "SHOW_PROCEDURE_DEFINITION": "Siirry määrittelyyn", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sano jotakin...", - "COLOUR_HUE_LABEL": "Väri", - "COLOUR_SATURATION_LABEL": "Värikylläisyys", - "COLOUR_BRIGHTNESS_LABEL": "Kirkkaus", - "CHANGE_VALUE_TITLE": "Vaihda arvo:", - "RENAME_VARIABLE": "Nimeä uudelleen muuttuja", - "RENAME_VARIABLE_TITLE": "Nimeä uudelleen kaikki \"%1\" muuttujaa:", - "RENAME_VARIABLE_MODAL_TITLE": "Nimeä uudelleen muuttuja", - "NEW_VARIABLE": "Tee muuttuja", - "NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:", - "VARIABLE_MODAL_TITLE": "Uusi muuttuja", - "VARIABLE_ALREADY_EXISTS": "\"%1\"-niminen muuttuja on jo käytössä.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "\"%1\"-niminen muuttuja on jo käytössä toisella \"%2\"-tyyppisellä muuttujalla.", - "DELETE_VARIABLE_CONFIRMATION": "Poistetaanko \"%2\"-muuttujan %1 käyttökohdetta?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ei voitu poistaa \"%1\"-muuttujaa, koska se on osa \"%2\"-funktion määrittelyä", - "DELETE_VARIABLE": "Poista \"%1\"-muuttuja", - "NEW_PROCEDURE": "Tee lohko", - "PROCEDURE_ALREADY_EXISTS": "\"%1\"-niminen aliohjelma on jo käytössä.", - "PROCEDURE_DEFAULT_NAME": "lohkon nimi", - "NEW_LIST": "Tee lista", - "NEW_LIST_TITLE": "Uuden listan nimi:", - "LIST_MODAL_TITLE": "Uusi lista", - "LIST_ALREADY_EXISTS": "\"%1\"-niminen lista on jo käytössä.", - "RENAME_LIST_TITLE": "Nimeä uudelleen kaikki \"%1\" listaa:", - "RENAME_LIST_MODAL_TITLE": "Nimeä uudelleen lista", - "DEFAULT_LIST_ITEM": "asia", - "DELETE_LIST": "Poista \"%1\"-lista", - "RENAME_LIST": "Nimeä uudelleen lista", - "NEW_BROADCAST_MESSAGE": "Uusi viesti", - "NEW_BROADCAST_MESSAGE_TITLE": "Uuden viestin nimi:", - "BROADCAST_MODAL_TITLE": "Uusi viesti", - "DEFAULT_BROADCAST_MESSAGE_NAME": "viesti1" -}; - -Blockly.ScratchMsgs.locales["sv"] = -{ - "CONTROL_FOREVER": "för alltid", - "CONTROL_REPEAT": "repetera %1", - "CONTROL_IF": "om %1 då", - "CONTROL_ELSE": "annars", - "CONTROL_STOP": "stoppa", - "CONTROL_STOP_ALL": "alla", - "CONTROL_STOP_THIS": "detta skript", - "CONTROL_STOP_OTHER": "andra skript i sprajten", - "CONTROL_WAIT": "vänta %1 sekunder", - "CONTROL_WAITUNTIL": "vänta tills %1", - "CONTROL_REPEATUNTIL": "repetera tills %1", - "CONTROL_WHILE": "medan %1", - "CONTROL_FOREACH": "för varje %1 i %2", - "CONTROL_STARTASCLONE": "när jag startar som klon", - "CONTROL_CREATECLONEOF": "skapa klon av %1", - "CONTROL_CREATECLONEOF_MYSELF": "mig själv", - "CONTROL_DELETETHISCLONE": "radera klonen", - "CONTROL_COUNTER": "räknare", - "CONTROL_INCRCOUNTER": "öka räknare", - "CONTROL_CLEARCOUNTER": "nollställ räknare", - "CONTROL_ALLATONCE": "alla samtidig", - "DATA_SETVARIABLETO": "sätt %1 till %2", - "DATA_CHANGEVARIABLEBY": "ändra %1 med %2", - "DATA_SHOWVARIABLE": "visa variabel %1", - "DATA_HIDEVARIABLE": "göm variabel %1", - "DATA_ADDTOLIST": "lägg till %1 i %2", - "DATA_DELETEOFLIST": "ta bort %1 från %2", - "DATA_DELETEALLOFLIST": "ta bort alla %1", - "DATA_INSERTATLIST": "infoga %1 vid %2 i %3", - "DATA_REPLACEITEMOFLIST": "ersätt posten %1 i %2 med %3", - "DATA_ITEMOFLIST": "post %1 i %2", - "DATA_ITEMNUMOFLIST": "post # av %1 i %2", - "DATA_LENGTHOFLIST": "längden av %1", - "DATA_LISTCONTAINSITEM": "%1 innehåller %2", - "DATA_SHOWLIST": "visa listan %1", - "DATA_HIDELIST": "göm listan %1", - "DATA_INDEX_ALL": "alla", - "DATA_INDEX_LAST": "sista", - "DATA_INDEX_RANDOM": "slumpmässig", - "EVENT_WHENFLAGCLICKED": "när %1 klickas på", - "EVENT_WHENTHISSPRITECLICKED": "när denna sprajt klickas på", - "EVENT_WHENSTAGECLICKED": "när scenen klickas på", - "EVENT_WHENTOUCHINGOBJECT": "när denna sprajt rör %1", - "EVENT_WHENBROADCASTRECEIVED": "när jag tar emot %1", - "EVENT_WHENBACKDROPSWITCHESTO": "när bakgrunden växlar till %1", - "EVENT_WHENGREATERTHAN": "när %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "timer", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ljudstyrka", - "EVENT_BROADCAST": "skicka %1", - "EVENT_BROADCASTANDWAIT": "skicka %1 och vänta", - "EVENT_WHENKEYPRESSED": "när %1 tangenten trycks ned", - "EVENT_WHENKEYPRESSED_SPACE": "mellanslag", - "EVENT_WHENKEYPRESSED_LEFT": "vänsterpil", - "EVENT_WHENKEYPRESSED_RIGHT": "högerpil", - "EVENT_WHENKEYPRESSED_DOWN": "nedåtpil", - "EVENT_WHENKEYPRESSED_UP": "uppåtpil", - "EVENT_WHENKEYPRESSED_ANY": "någon", - "LOOKS_SAYFORSECS": "säg %1 i %2 sekunder", - "LOOKS_SAY": "säg %1", - "LOOKS_HELLO": "Hej!", - "LOOKS_THINKFORSECS": "tänk %1 i %2 sekunder", - "LOOKS_THINK": "tänk %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "visa", - "LOOKS_HIDE": "göm", - "LOOKS_HIDEALLSPRITES": "göm alla sprajtar", - "LOOKS_EFFECT_COLOR": "färg ", - "LOOKS_EFFECT_FISHEYE": "fisheye", - "LOOKS_EFFECT_WHIRL": "virvel", - "LOOKS_EFFECT_PIXELATE": "pixla", - "LOOKS_EFFECT_MOSAIC": "mosaik", - "LOOKS_EFFECT_BRIGHTNESS": "ljusstyrka", - "LOOKS_EFFECT_GHOST": "genomskinlighet", - "LOOKS_CHANGEEFFECTBY": "ändra %1 effekten med %2", - "LOOKS_SETEFFECTTO": "sätt %1 effekten till %2", - "LOOKS_CLEARGRAPHICEFFECTS": "ta bort grafisk effekt", - "LOOKS_CHANGESIZEBY": "ändra storlek med %1", - "LOOKS_SETSIZETO": "sätt storleken till %1 %", - "LOOKS_SIZE": "storlek", - "LOOKS_CHANGESTRETCHBY": "ändra töjning med %1", - "LOOKS_SETSTRETCHTO": "sätt töjning till %1 %", - "LOOKS_SWITCHCOSTUMETO": "ändra klädsel till %1", - "LOOKS_NEXTCOSTUME": "nästa klädsel", - "LOOKS_SWITCHBACKDROPTO": "växla bakgrund till %1", - "LOOKS_GOTOFRONTBACK": "gå till %1 lagret", - "LOOKS_GOTOFRONTBACK_FRONT": "översta", - "LOOKS_GOTOFRONTBACK_BACK": "tillbaka", - "LOOKS_GOFORWARDBACKWARDLAYERS": "gå %1 %2 lager", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "upp", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "ned", - "LOOKS_BACKDROPNUMBERNAME": "bakgrund %1", - "LOOKS_COSTUMENUMBERNAME": "klädsel %1", - "LOOKS_NUMBERNAME_NUMBER": "nummer", - "LOOKS_NUMBERNAME_NAME": "namn ", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "byt bakgrund till %1 och vänta", - "LOOKS_NEXTBACKDROP_BLOCK": "nästa bakgrund", - "LOOKS_NEXTBACKDROP": "nästa bakgrund", - "LOOKS_PREVIOUSBACKDROP": "föregående bakgrund", - "LOOKS_RANDOMBACKDROP": "slumpvis bakgrund", - "MOTION_MOVESTEPS": "gå %1 steg", - "MOTION_TURNLEFT": "rotera %1 %2 grader", - "MOTION_TURNRIGHT": "rotera %1 %2 grader", - "MOTION_POINTINDIRECTION": "peka i riktning %1", - "MOTION_POINTTOWARDS": "peka mot %1", - "MOTION_POINTTOWARDS_POINTER": "muspekare ", - "MOTION_POINTTOWARDS_RANDOM": "slumpmässig riktning", - "MOTION_GOTO": "gå till %1", - "MOTION_GOTO_POINTER": "muspekare ", - "MOTION_GOTO_RANDOM": "slumpmässig position", - "MOTION_GOTOXY": "gå till x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "glid %1 sek till x: %2 y: %3", - "MOTION_GLIDETO": "glid %1 sekunder till %2", - "MOTION_GLIDETO_POINTER": "muspekare ", - "MOTION_GLIDETO_RANDOM": "slumpmässig position", - "MOTION_CHANGEXBY": "ändra x med %1", - "MOTION_SETX": "sätt x till %1", - "MOTION_CHANGEYBY": "ändra y med %1", - "MOTION_SETY": "sätt y till %1", - "MOTION_IFONEDGEBOUNCE": "om vid kanten, studsa", - "MOTION_SETROTATIONSTYLE": "sätt rotationsstil %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "vänster-höger", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "rotera inte", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "rotera", - "MOTION_XPOSITION": "x position", - "MOTION_YPOSITION": "y position", - "MOTION_DIRECTION": "riktning", - "MOTION_SCROLLRIGHT": "skrolla höger %1", - "MOTION_SCROLLUP": "skrolla upp %1", - "MOTION_ALIGNSCENE": "arrangera scen %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "nedre-vänster", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "nedre-höger", - "MOTION_ALIGNSCENE_MIDDLE": "mitten", - "MOTION_ALIGNSCENE_TOPLEFT": "övre-vänster", - "MOTION_ALIGNSCENE_TOPRIGHT": "övre-höger", - "MOTION_XSCROLL": "x scroll", - "MOTION_YSCROLL": "y scroll", - "MOTION_STAGE_SELECTED": "Scen vald: inga rörelseblock", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "slumptal %1 till %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 och %2", - "OPERATORS_OR": "%1 eller %2", - "OPERATORS_NOT": "inte %1", - "OPERATORS_JOIN": "sammanfoga %1 %2", - "OPERATORS_JOIN_APPLE": "äpple", - "OPERATORS_JOIN_BANANA": "banan", - "OPERATORS_LETTEROF": "bokstav %1 av %2", - "OPERATORS_LETTEROF_APPLE": "ä", - "OPERATORS_LENGTH": "längden av %1", - "OPERATORS_CONTAINS": "%1 innehåller %2", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "avrunda %1", - "OPERATORS_MATHOP": "%1 av %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "golv", - "OPERATORS_MATHOP_CEILING": "tak", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "definiera %1", - "SENSING_TOUCHINGOBJECT": "rör vid %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "muspekare ", - "SENSING_TOUCHINGOBJECT_EDGE": "kant", - "SENSING_TOUCHINGCOLOR": "rör vid färgen %1?", - "SENSING_COLORISTOUCHINGCOLOR": "rör färgen %1 vid %2?", - "SENSING_DISTANCETO": "avstånd till %1", - "SENSING_DISTANCETO_POINTER": "muspekare ", - "SENSING_ASKANDWAIT": "fråga %1 och vänta", - "SENSING_ASK_TEXT": "Vad heter du?", - "SENSING_ANSWER": "svar", - "SENSING_KEYPRESSED": "tangent %1 nedtryckt?", - "SENSING_MOUSEDOWN": "musknappen nedtryckt?", - "SENSING_MOUSEX": "mus x", - "SENSING_MOUSEY": "mus y", - "SENSING_SETDRAGMODE": "sätt dragläge %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "dragbar", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "inte dragbar", - "SENSING_LOUDNESS": "ljudstyrka", - "SENSING_LOUD": "högt ljud?", - "SENSING_TIMER": "timer", - "SENSING_RESETTIMER": "nollställ timer", - "SENSING_OF": "%1 av %2", - "SENSING_OF_XPOSITION": "x position", - "SENSING_OF_YPOSITION": "y position", - "SENSING_OF_DIRECTION": "riktning", - "SENSING_OF_COSTUMENUMBER": "klädselnummer", - "SENSING_OF_COSTUMENAME": "klädselnamn", - "SENSING_OF_SIZE": "storlek", - "SENSING_OF_VOLUME": "volym ", - "SENSING_OF_BACKDROPNUMBER": "bakgrundsnummer", - "SENSING_OF_BACKDROPNAME": "bakgrundsnamn", - "SENSING_OF_STAGE": "Scen", - "SENSING_CURRENT": "aktuell %1", - "SENSING_CURRENT_YEAR": "år ", - "SENSING_CURRENT_MONTH": "månad ", - "SENSING_CURRENT_DATE": "dag ", - "SENSING_CURRENT_DAYOFWEEK": "veckodag ", - "SENSING_CURRENT_HOUR": "timmar ", - "SENSING_CURRENT_MINUTE": "minuter ", - "SENSING_CURRENT_SECOND": "sekunder ", - "SENSING_DAYSSINCE2000": "dagar sedan år 2000", - "SENSING_USERNAME": "användarnamn ", - "SENSING_USERID": "användarnamn", - "SOUND_PLAY": "starta ljud %1", - "SOUND_PLAYUNTILDONE": "spela ljudet %1 tills färdigt", - "SOUND_STOPALLSOUNDS": "stoppa alla ljud", - "SOUND_SETEFFECTO": "sätt %1 effekten till %2", - "SOUND_CHANGEEFFECTBY": "ändra %1 effekten med %2", - "SOUND_CLEAREFFECTS": "ta bort ljudeffekter", - "SOUND_EFFECTS_PITCH": "tonhöjd", - "SOUND_EFFECTS_PAN": "panorera vänster/höger", - "SOUND_CHANGEVOLUMEBY": "ändra volymen med %1", - "SOUND_SETVOLUMETO": "sätt volymen till %1%", - "SOUND_VOLUME": "volym ", - "SOUND_RECORD": "spela in...", - "CATEGORY_MOTION": "Rörelse", - "CATEGORY_LOOKS": "Utseende", - "CATEGORY_SOUND": "Ljud", - "CATEGORY_EVENTS": "Händelser", - "CATEGORY_CONTROL": "Kontroll", - "CATEGORY_SENSING": "Känna av", - "CATEGORY_OPERATORS": "Operatorer", - "CATEGORY_VARIABLES": "Variabler", - "CATEGORY_MYBLOCKS": "Mina block", - "DUPLICATE": "Kopiera", - "DELETE": "Radera", - "ADD_COMMENT": "Lägg till kommentar", - "REMOVE_COMMENT": "Ta bort kommentar", - "DELETE_BLOCK": "Ta bort block", - "DELETE_X_BLOCKS": "Ta bort %1 block", - "DELETE_ALL_BLOCKS": "Ta bort alla %1 block?", - "CLEAN_UP": "Rensa block", - "HELP": "Hjälp", - "UNDO": "Ångra", - "REDO": "Gör om", - "EDIT_PROCEDURE": "Redigera", - "SHOW_PROCEDURE_DEFINITION": "Gå till definition", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Säg något...", - "COLOUR_HUE_LABEL": "Färg", - "COLOUR_SATURATION_LABEL": "Mättnad", - "COLOUR_BRIGHTNESS_LABEL": "Ljusstyrka", - "CHANGE_VALUE_TITLE": "Ändra värde:", - "RENAME_VARIABLE": "Döp om variabeln", - "RENAME_VARIABLE_TITLE": "Döp om alla \"%1\" variabler till:", - "RENAME_VARIABLE_MODAL_TITLE": "Döp om variabel", - "NEW_VARIABLE": "Skapa en variabel", - "NEW_VARIABLE_TITLE": "Nytt variabelnamn:", - "VARIABLE_MODAL_TITLE": "Ny variabel", - "VARIABLE_ALREADY_EXISTS": "En variabel \"%1\" finns redan.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "En variabel \"%1\" finns redan för en annan variabel av typ \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Ta bort %1 användningar av variabeln \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan inte ta bort variabel \"%1\" för att den är en del av definitionen av funktionen \"%2\"", - "DELETE_VARIABLE": "Ta bort \"%1\" variabeln", - "NEW_PROCEDURE": "Skapa ett Block", - "PROCEDURE_ALREADY_EXISTS": "En funktion \"%1\" finns redan.", - "PROCEDURE_DEFAULT_NAME": "blocknamn", - "NEW_LIST": "Skapa en lista", - "NEW_LIST_TITLE": "Nytt listnamn:", - "LIST_MODAL_TITLE": "Ny lista", - "LIST_ALREADY_EXISTS": "En lista \"%1\" finns redan.", - "RENAME_LIST_TITLE": "Döp om alla \"%1\" listor till:", - "RENAME_LIST_MODAL_TITLE": "Döp om lista", - "DEFAULT_LIST_ITEM": "grej", - "DELETE_LIST": "Radera \"%1\" listan", - "RENAME_LIST": "Döp om listan", - "NEW_BROADCAST_MESSAGE": "Nytt meddelande", - "NEW_BROADCAST_MESSAGE_TITLE": "Nytt namn på meddelande:", - "BROADCAST_MODAL_TITLE": "Nytt meddelande", - "DEFAULT_BROADCAST_MESSAGE_NAME": "meddelande1" -}; - -Blockly.ScratchMsgs.locales["vi"] = -{ - "CONTROL_FOREVER": "liên tục", - "CONTROL_REPEAT": "lặp lại %1", - "CONTROL_IF": "nếu %1 thì", - "CONTROL_ELSE": "nếu không thì ", - "CONTROL_STOP": "dừng lại", - "CONTROL_STOP_ALL": "tất cả", - "CONTROL_STOP_THIS": "kịch bản này", - "CONTROL_STOP_OTHER": "các kịch bản khác cho đối tượng ", - "CONTROL_WAIT": "đợi %1 giây", - "CONTROL_WAITUNTIL": "đợi đến khi %1", - "CONTROL_REPEATUNTIL": "lặp lại cho đến khi %1", - "CONTROL_WHILE": "trong khi %1", - "CONTROL_FOREACH": "với mỗi %1 trong %2", - "CONTROL_STARTASCLONE": "khi tôi bắt đầu là một bản sao", - "CONTROL_CREATECLONEOF": "tạo bản sao của %1", - "CONTROL_CREATECLONEOF_MYSELF": "bản thân tôi", - "CONTROL_DELETETHISCLONE": "xóa bản sao này", - "CONTROL_COUNTER": "bộ đếm", - "CONTROL_INCRCOUNTER": "bộ đếm tăng dần", - "CONTROL_CLEARCOUNTER": "xóa bộ đếm", - "CONTROL_ALLATONCE": "tất cả cùng một lúc", - "DATA_SETVARIABLETO": "đặt %1 thành %2", - "DATA_CHANGEVARIABLEBY": "thay đổi %1 một lượng %2", - "DATA_SHOWVARIABLE": "hiện biến số %1", - "DATA_HIDEVARIABLE": "ẩn biến số %1", - "DATA_ADDTOLIST": "thêm phần tử %1 vào trong %2", - "DATA_DELETEOFLIST": "xóa phần tử thứ %1 của %2", - "DATA_DELETEALLOFLIST": "Xóa hết tất cả trong liệt kê %1", - "DATA_INSERTATLIST": "thêm phần tử %1 tại vị trí %2 của %3", - "DATA_REPLACEITEMOFLIST": "thay thế phần tử thứ %1 của danh sách %2 bằng %3", - "DATA_ITEMOFLIST": "phần tử thứ %1 của %2", - "DATA_ITEMNUMOFLIST": "phần tử thứ %1 trong tợp hợp %2", - "DATA_LENGTHOFLIST": "kích thước của %1", - "DATA_LISTCONTAINSITEM": "%1 chứa phần tử %2?", - "DATA_SHOWLIST": "hiện danh sách %1", - "DATA_HIDELIST": "ăn danh sách %1", - "DATA_INDEX_ALL": "tất cả", - "DATA_INDEX_LAST": "cuối cùng", - "DATA_INDEX_RANDOM": "ngẫu nhiên", - "EVENT_WHENFLAGCLICKED": "Khi bấm vào %1", - "EVENT_WHENTHISSPRITECLICKED": "Khi bấm vào đối tượng này", - "EVENT_WHENSTAGECLICKED": "khi bấm vào phông nền", - "EVENT_WHENTOUCHINGOBJECT": "Khi đối tượng này chạm vào %1", - "EVENT_WHENBROADCASTRECEIVED": "khi nhận %1", - "EVENT_WHENBACKDROPSWITCHESTO": "khi phông nền chuyển thành %1", - "EVENT_WHENGREATERTHAN": "khi %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "đồng hồ bấm giờ", - "EVENT_WHENGREATERTHAN_LOUDNESS": "độ ồn", - "EVENT_BROADCAST": "phát tin %1", - "EVENT_BROADCASTANDWAIT": "phát tin %1 và đợi", - "EVENT_WHENKEYPRESSED": "khi bấm phím %1", - "EVENT_WHENKEYPRESSED_SPACE": "phím trắng", - "EVENT_WHENKEYPRESSED_LEFT": "mũi tên trái", - "EVENT_WHENKEYPRESSED_RIGHT": "mũi tên phải", - "EVENT_WHENKEYPRESSED_DOWN": "mũi tên xuống", - "EVENT_WHENKEYPRESSED_UP": "mũi tên lên", - "EVENT_WHENKEYPRESSED_ANY": "bất kỳ", - "LOOKS_SAYFORSECS": "nói %1 trong %2 giây", - "LOOKS_SAY": "nói %1", - "LOOKS_HELLO": "Xin chào!", - "LOOKS_THINKFORSECS": "nghĩ %1 trong %2 giây", - "LOOKS_THINK": "nghĩ %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "hiện", - "LOOKS_HIDE": "ẩn", - "LOOKS_HIDEALLSPRITES": "ẩn tất cả đối tượng", - "LOOKS_EFFECT_COLOR": "màu", - "LOOKS_EFFECT_FISHEYE": "gương cầu", - "LOOKS_EFFECT_WHIRL": "xoay", - "LOOKS_EFFECT_PIXELATE": "nhòe", - "LOOKS_EFFECT_MOSAIC": "khảm", - "LOOKS_EFFECT_BRIGHTNESS": "độ sáng", - "LOOKS_EFFECT_GHOST": "bóng ma", - "LOOKS_CHANGEEFFECTBY": "thay đổi hiệu ứng %1 một lượng %2", - "LOOKS_SETEFFECTTO": "thay đổi hiệu ứng %1 bằng %2", - "LOOKS_CLEARGRAPHICEFFECTS": "bỏ các hiệu ứng đồ họa", - "LOOKS_CHANGESIZEBY": "đổi kích thước một lượng %1", - "LOOKS_SETSIZETO": "đặt kích thước thành %1 %", - "LOOKS_SIZE": "kích thước", - "LOOKS_CHANGESTRETCHBY": "đổi kéo căng một lượng %1", - "LOOKS_SETSTRETCHTO": "đặt kéo căng thành %1 %", - "LOOKS_SWITCHCOSTUMETO": "chuyển sang thiết kế %1", - "LOOKS_NEXTCOSTUME": "trang phục kế tiếp", - "LOOKS_SWITCHBACKDROPTO": "đổi phông nền thành %1", - "LOOKS_GOTOFRONTBACK": "đi tới lớp %1", - "LOOKS_GOTOFRONTBACK_FRONT": "phía trên cùng", - "LOOKS_GOTOFRONTBACK_BACK": "phía sau cùng", - "LOOKS_GOFORWARDBACKWARDLAYERS": "đi %1 %2 lớp", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "tới", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "lùi", - "LOOKS_BACKDROPNUMBERNAME": "phông nền %1", - "LOOKS_COSTUMENUMBERNAME": "thiết kế %1", - "LOOKS_NUMBERNAME_NUMBER": "số", - "LOOKS_NUMBERNAME_NAME": "tên", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "đổi phông nền thành %1 và đợi", - "LOOKS_NEXTBACKDROP_BLOCK": "phông nền tiếp theo", - "LOOKS_NEXTBACKDROP": "phông nền tiếp theo", - "LOOKS_PREVIOUSBACKDROP": "phông nền trước", - "LOOKS_RANDOMBACKDROP": "phông nền ngẫu nhiên", - "MOTION_MOVESTEPS": "di chuyển %1 bước", - "MOTION_TURNLEFT": "xoay %1 %2 độ", - "MOTION_TURNRIGHT": "xoay %1 %2 độ", - "MOTION_POINTINDIRECTION": "hướng về phía %1", - "MOTION_POINTTOWARDS": "hướng về vị trí %1", - "MOTION_POINTTOWARDS_POINTER": "con trỏ chuột", - "MOTION_POINTTOWARDS_RANDOM": "random direction", - "MOTION_GOTO": "đi tới %1", - "MOTION_GOTO_POINTER": "con trỏ chuột", - "MOTION_GOTO_RANDOM": "vị trí ngẫu nhiên", - "MOTION_GOTOXY": "đi tới điểm x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "lướt trong %1 giây tới điểm x: %2 y: %3", - "MOTION_GLIDETO": "lướt trong %1 giây tới %2", - "MOTION_GLIDETO_POINTER": "con trỏ chuột", - "MOTION_GLIDETO_RANDOM": "vị trí ngẫu nhiên", - "MOTION_CHANGEXBY": "thay đổi hoành độ một lượng %1", - "MOTION_SETX": "đặt hoàng độ bằng %1", - "MOTION_CHANGEYBY": "thay đổi tung độ một lượng%1", - "MOTION_SETY": "đặt tung độ bằng %1", - "MOTION_IFONEDGEBOUNCE": "nếu tiếp xúc với cạnh, bật lại", - "MOTION_SETROTATIONSTYLE": "đặt kiểu xoay %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "trái - phải", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "không xoay", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "xung quanh", - "MOTION_XPOSITION": "hoành độ", - "MOTION_YPOSITION": "tung độ", - "MOTION_DIRECTION": "hướng", - "MOTION_SCROLLRIGHT": "cuộn phải %1", - "MOTION_SCROLLUP": "cuộn lên %1", - "MOTION_ALIGNSCENE": "căn chỉnh phân cảnh %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "góc trái dưới", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "góc phải dưới", - "MOTION_ALIGNSCENE_MIDDLE": "giữa", - "MOTION_ALIGNSCENE_TOPLEFT": "góc trái trên", - "MOTION_ALIGNSCENE_TOPRIGHT": "góc phải trên", - "MOTION_XSCROLL": "cuộn x", - "MOTION_YSCROLL": "cuộn y", - "MOTION_STAGE_SELECTED": "Đã chọn nền: không có khối lập trình chuyển động", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "lấy ngẫu nhiên từ %1 đến %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 và %2", - "OPERATORS_OR": "%1 hoặc %2", - "OPERATORS_NOT": "không phải %1", - "OPERATORS_JOIN": "kết hợp %1 %2", - "OPERATORS_JOIN_APPLE": "táo", - "OPERATORS_JOIN_BANANA": "chuối", - "OPERATORS_LETTEROF": "ký tự thứ %1 của chuỗi %2", - "OPERATORS_LETTEROF_APPLE": "t", - "OPERATORS_LENGTH": "độ dài của %1", - "OPERATORS_CONTAINS": "%1 chứa ký tự %2?", - "OPERATORS_MOD": "%1 chia lấy dư %2", - "OPERATORS_ROUND": "làm tròn %1", - "OPERATORS_MATHOP": "%1 của %2", - "OPERATORS_MATHOP_ABS": "giá trị tuyệt đối", - "OPERATORS_MATHOP_FLOOR": "làm tròn xuống", - "OPERATORS_MATHOP_CEILING": "trần", - "OPERATORS_MATHOP_SQRT": "căn bậc hai", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "trong", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "định nghĩa %1", - "SENSING_TOUCHINGOBJECT": "đang chạm %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "con trỏ chuột", - "SENSING_TOUCHINGOBJECT_EDGE": "cạnh", - "SENSING_TOUCHINGCOLOR": "đang chạm màu %1?", - "SENSING_COLORISTOUCHINGCOLOR": "màu %1 đang chạm %2?", - "SENSING_DISTANCETO": "khoảng cách đến %1", - "SENSING_DISTANCETO_POINTER": "con trỏ chuột", - "SENSING_ASKANDWAIT": "hỏi %1 và đợi", - "SENSING_ASK_TEXT": "Tên của bạn là gì?", - "SENSING_ANSWER": "trả lời", - "SENSING_KEYPRESSED": "phím %1 được bấm?", - "SENSING_MOUSEDOWN": "chuột được nhấn?", - "SENSING_MOUSEX": "hoành độ con trỏ chuột", - "SENSING_MOUSEY": "tung độ con trỏ chuột", - "SENSING_SETDRAGMODE": "đặt chế độ kéo %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "kéo thả được", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "không kéo thả được", - "SENSING_LOUDNESS": "độ ồn", - "SENSING_LOUD": "tiếng to?", - "SENSING_TIMER": "đồng hồ bấm giờ", - "SENSING_RESETTIMER": "đặt lại đống hồ bấm giờ", - "SENSING_OF": "%1 của %2", - "SENSING_OF_XPOSITION": "hoành độ", - "SENSING_OF_YPOSITION": "tung độ", - "SENSING_OF_DIRECTION": "hướng", - "SENSING_OF_COSTUMENUMBER": "thiết kế #", - "SENSING_OF_COSTUMENAME": "tên thiết kế", - "SENSING_OF_SIZE": "kích thước", - "SENSING_OF_VOLUME": "âm lượng", - "SENSING_OF_BACKDROPNUMBER": "phông nền #", - "SENSING_OF_BACKDROPNAME": "tên phông nền", - "SENSING_OF_STAGE": "Sân khấu", - "SENSING_CURRENT": "%1 hiện tại", - "SENSING_CURRENT_YEAR": "năm", - "SENSING_CURRENT_MONTH": "tháng", - "SENSING_CURRENT_DATE": "ngày", - "SENSING_CURRENT_DAYOFWEEK": "ngày trong tuần", - "SENSING_CURRENT_HOUR": "giờ", - "SENSING_CURRENT_MINUTE": "phút", - "SENSING_CURRENT_SECOND": "giây", - "SENSING_DAYSSINCE2000": "số ngày từ năm 2000", - "SENSING_USERNAME": "tên đăng nhập", - "SENSING_USERID": "id người dùng", - "SOUND_PLAY": "bắt đầu âm thanh %1", - "SOUND_PLAYUNTILDONE": "phát âm thanh %1 đến hết", - "SOUND_STOPALLSOUNDS": "ngừng mọi âm thanh", - "SOUND_SETEFFECTO": "đặt hiệu ứng %1 thành %2", - "SOUND_CHANGEEFFECTBY": "thay đổi hiệu ứng %1 một lượng %2", - "SOUND_CLEAREFFECTS": "xóa hiệu ứng âm thanh", - "SOUND_EFFECTS_PITCH": "cao độ", - "SOUND_EFFECTS_PAN": "pan trái/phải", - "SOUND_CHANGEVOLUMEBY": "thay đổi âm lượng một lượng %1", - "SOUND_SETVOLUMETO": "đặt âm lượng %1%", - "SOUND_VOLUME": "âm lượng", - "SOUND_RECORD": "lưu lại...", - "CATEGORY_MOTION": "Chuyển động", - "CATEGORY_LOOKS": "Hiển thị", - "CATEGORY_SOUND": "Âm thanh", - "CATEGORY_EVENTS": "Sự kiện", - "CATEGORY_CONTROL": "Điều khiển", - "CATEGORY_SENSING": "Cảm biến", - "CATEGORY_OPERATORS": "Các phép toán", - "CATEGORY_VARIABLES": "Các biến số", - "CATEGORY_MYBLOCKS": "Khối của tôi", - "DUPLICATE": "Nhân bản", - "DELETE": "Xóa", - "ADD_COMMENT": "Thêm chú thích", - "REMOVE_COMMENT": "Xóa chú thích", - "DELETE_BLOCK": "Xóa khối", - "DELETE_X_BLOCKS": "Xóa %1 khối", - "DELETE_ALL_BLOCKS": "Xóa toàn bộ %1 khối?", - "CLEAN_UP": "Xóa hết khối", - "HELP": "Trợ giúp", - "UNDO": "Hoàn tác", - "REDO": "Làm lại ", - "EDIT_PROCEDURE": "Chỉnh sửa", - "SHOW_PROCEDURE_DEFINITION": "Tìm định nghĩa", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Nói gì đó...", - "COLOUR_HUE_LABEL": "Màu sắc", - "COLOUR_SATURATION_LABEL": "Độ bão hòa", - "COLOUR_BRIGHTNESS_LABEL": "Độ sáng", - "CHANGE_VALUE_TITLE": "Thay đổi giá trị:", - "RENAME_VARIABLE": "Đặt tên cho biến", - "RENAME_VARIABLE_TITLE": "Đặt tên tất cả biến \"%1\" thành:", - "RENAME_VARIABLE_MODAL_TITLE": "Đặt tên biến", - "NEW_VARIABLE": "Tạo một biến", - "NEW_VARIABLE_TITLE": "Tên biến mới:", - "VARIABLE_MODAL_TITLE": "Biến mới", - "VARIABLE_ALREADY_EXISTS": "Một biến với tên\"%1\" đã tồn tại.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Một biến số tên là \"%1\" đã có ở trong một biến số khác tên \"%2\"", - "DELETE_VARIABLE_CONFIRMATION": "Xóa %1 cách dùng của biến số \"%2\"", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Không thể xóa biến số \"%1\" tại vì nó là một phần của chức vụ lập trình \"%2\"", - "DELETE_VARIABLE": "Xóa biến \"%1\"", - "NEW_PROCEDURE": "Tạo một khối", - "PROCEDURE_ALREADY_EXISTS": "Một thủ tục có tên \"%1\" đã tồn tại.", - "PROCEDURE_DEFAULT_NAME": "Tên khối", - "NEW_LIST": "Tạo một Danh sách", - "NEW_LIST_TITLE": "Tên danh sách mới:", - "LIST_MODAL_TITLE": "Danh sách mới", - "LIST_ALREADY_EXISTS": "Một danh sách có tên \"%1\" đã tồn tại.", - "RENAME_LIST_TITLE": "Đặt tên tất cả danh sách \"%1\" thành:", - "RENAME_LIST_MODAL_TITLE": "Đặt tên danh sách", - "DEFAULT_LIST_ITEM": "cụm", - "DELETE_LIST": "Delete the \"%1\" list", - "RENAME_LIST": "Rename list", - "NEW_BROADCAST_MESSAGE": "Thông báo mới", - "NEW_BROADCAST_MESSAGE_TITLE": "Tên thông báo mới:", - "BROADCAST_MODAL_TITLE": "Tin nhắn mới", - "DEFAULT_BROADCAST_MESSAGE_NAME": "tin nhắn 1" -}; - -Blockly.ScratchMsgs.locales["tr"] = -{ - "CONTROL_FOREVER": "sürekli tekrarla", - "CONTROL_REPEAT": "%1 defa tekrarla", - "CONTROL_IF": "eğer %1 ise", - "CONTROL_ELSE": "değilse", - "CONTROL_STOP": "durdur", - "CONTROL_STOP_ALL": "tümü", - "CONTROL_STOP_THIS": "bu dizi", - "CONTROL_STOP_OTHER": "Kukladaki diğer diziler", - "CONTROL_WAIT": "%1 saniye bekle", - "CONTROL_WAITUNTIL": "%1 olana kadar bekle", - "CONTROL_REPEATUNTIL": "%1 olana kadar tekrarla", - "CONTROL_WHILE": "%1 olduğu sürece tekrarla", - "CONTROL_FOREACH": "%2 deki her %1 için", - "CONTROL_STARTASCLONE": "ikiz olarak başladığımda", - "CONTROL_CREATECLONEOF": "%1'in ikizini yarat", - "CONTROL_CREATECLONEOF_MYSELF": "kendim", - "CONTROL_DELETETHISCLONE": "bu ikizi sil", - "CONTROL_COUNTER": "sayaç", - "CONTROL_INCRCOUNTER": "sayacı artır", - "CONTROL_CLEARCOUNTER": "sayacı sıfırla", - "CONTROL_ALLATONCE": "tümü tek seferde", - "DATA_SETVARIABLETO": "%1 i %2 yap", - "DATA_CHANGEVARIABLEBY": "%1 i %2 kadar değiştir", - "DATA_SHOWVARIABLE": "%1 değişkenini göster", - "DATA_HIDEVARIABLE": "%1 değişkenini gizle", - "DATA_ADDTOLIST": "%1 i %2 ye ekle", - "DATA_DELETEOFLIST": "%2 nin %1 ini sil", - "DATA_DELETEALLOFLIST": "%1'in herşeyini sil", - "DATA_INSERTATLIST": "%1 i %3 ün %2 pozisyonuna ekle", - "DATA_REPLACEITEMOFLIST": "%2 öğesinin %1 öğesini %3 ile değiştir", - "DATA_ITEMOFLIST": "%2 nin %1 öğesi", - "DATA_ITEMNUMOFLIST": "%2 nin %1 öğesi", - "DATA_LENGTHOFLIST": "%1'in uzunluğu", - "DATA_LISTCONTAINSITEM": "%1 %2'yi içeriyor mu? ", - "DATA_SHOWLIST": "%1 listesini göster", - "DATA_HIDELIST": "%1 listesini gizle", - "DATA_INDEX_ALL": "tümü", - "DATA_INDEX_LAST": "son", - "DATA_INDEX_RANDOM": "rastgele", - "EVENT_WHENFLAGCLICKED": "%1 tıklandığında", - "EVENT_WHENTHISSPRITECLICKED": "bu kukla tıklandığında", - "EVENT_WHENSTAGECLICKED": "sahne tıklandığında", - "EVENT_WHENTOUCHINGOBJECT": "bu kukla %1 e dokunduğunda", - "EVENT_WHENBROADCASTRECEIVED": "%1 haberini aldığımda", - "EVENT_WHENBACKDROPSWITCHESTO": "dekor %1 olarak değiştiğinde", - "EVENT_WHENGREATERTHAN": "%1 > %2 olduğunda", - "EVENT_WHENGREATERTHAN_TIMER": "zamanlayıcı", - "EVENT_WHENGREATERTHAN_LOUDNESS": "ses yüksekliği", - "EVENT_BROADCAST": "%1 haberini sal", - "EVENT_BROADCASTANDWAIT": "%1 haberini sal ve bekle", - "EVENT_WHENKEYPRESSED": "%1 tuşuna basılınca", - "EVENT_WHENKEYPRESSED_SPACE": "boşluk", - "EVENT_WHENKEYPRESSED_LEFT": "sol ok", - "EVENT_WHENKEYPRESSED_RIGHT": "sağ ok", - "EVENT_WHENKEYPRESSED_DOWN": "aşağı ok", - "EVENT_WHENKEYPRESSED_UP": "yukarı ok", - "EVENT_WHENKEYPRESSED_ANY": "herhangi", - "LOOKS_SAYFORSECS": "%2 saniye boyunca %1 de ", - "LOOKS_SAY": "%1 de", - "LOOKS_HELLO": "Merhaba!", - "LOOKS_THINKFORSECS": "%2 saniye boyunca %1 diye düşün", - "LOOKS_THINK": "%1 diye düşün", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "göster", - "LOOKS_HIDE": "gizle", - "LOOKS_HIDEALLSPRITES": "tüm kuklaları gizle", - "LOOKS_EFFECT_COLOR": "renk", - "LOOKS_EFFECT_FISHEYE": "balık gözü", - "LOOKS_EFFECT_WHIRL": "fırıl fırıl döndür", - "LOOKS_EFFECT_PIXELATE": "benekleştir", - "LOOKS_EFFECT_MOSAIC": "mozaik", - "LOOKS_EFFECT_BRIGHTNESS": "parlaklık", - "LOOKS_EFFECT_GHOST": "hayalet", - "LOOKS_CHANGEEFFECTBY": "%1 etkisini %2 değiştir", - "LOOKS_SETEFFECTTO": "%1 etkisini %2 yap", - "LOOKS_CLEARGRAPHICEFFECTS": "görsel etkileri temizle", - "LOOKS_CHANGESIZEBY": "boyutu %1 birim değiştir", - "LOOKS_SETSIZETO": "boyutu % %1 yap", - "LOOKS_SIZE": "büyüklük", - "LOOKS_CHANGESTRETCHBY": "esnekliği %1 kadar değiştir", - "LOOKS_SETSTRETCHTO": "esnekliği % %1 olarak ayarla", - "LOOKS_SWITCHCOSTUMETO": "%1 kılığına geç", - "LOOKS_NEXTCOSTUME": "sonraki kostüm", - "LOOKS_SWITCHBACKDROPTO": "%1 dekoruna geç", - "LOOKS_GOTOFRONTBACK": "%1 katmanına git", - "LOOKS_GOTOFRONTBACK_FRONT": "ön", - "LOOKS_GOTOFRONTBACK_BACK": "arka", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%2 katman %1 git", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "ileri", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "geri", - "LOOKS_BACKDROPNUMBERNAME": "dekor %1", - "LOOKS_COSTUMENUMBERNAME": "kostüm %1", - "LOOKS_NUMBERNAME_NUMBER": "sayı", - "LOOKS_NUMBERNAME_NAME": "isim", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "%1 dekoruna geç ve bekle", - "LOOKS_NEXTBACKDROP_BLOCK": "sonraki dekor", - "LOOKS_NEXTBACKDROP": "sonraki dekor", - "LOOKS_PREVIOUSBACKDROP": "önceki dekor", - "LOOKS_RANDOMBACKDROP": "Rastgele dekor", - "MOTION_MOVESTEPS": "%1 adım git", - "MOTION_TURNLEFT": "%1 %2 derece dön", - "MOTION_TURNRIGHT": "%1 %2 derece dön", - "MOTION_POINTINDIRECTION": "%1 yönüne yönel", - "MOTION_POINTTOWARDS": "%1 yönüne doğru yönel", - "MOTION_POINTTOWARDS_POINTER": "fare-imleci", - "MOTION_POINTTOWARDS_RANDOM": "rastgele yön", - "MOTION_GOTO": "%1'e git", - "MOTION_GOTO_POINTER": "fare-imleci", - "MOTION_GOTO_RANDOM": "rastgele konuma", - "MOTION_GOTOXY": "x: %1 y: %2 konumuna git", - "MOTION_GLIDESECSTOXY": "%1 sn.de x: %2 y: %3'a git", - "MOTION_GLIDETO": "%1 saniyede %2 noktasına git", - "MOTION_GLIDETO_POINTER": "fare-imleci", - "MOTION_GLIDETO_RANDOM": "rastgele konum", - "MOTION_CHANGEXBY": "x konumunu %1 değiştir", - "MOTION_SETX": "x konumunu %1 yap", - "MOTION_CHANGEYBY": "y konumunu %1 değiştir", - "MOTION_SETY": "y konumunu %1 yap", - "MOTION_IFONEDGEBOUNCE": "kenara geldiyse sektir", - "MOTION_SETROTATIONSTYLE": "dönüş stilini %1 yap", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "sol-sağ", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "döndürme", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "tüm yönlere", - "MOTION_XPOSITION": "x konumu", - "MOTION_YPOSITION": "y konumu", - "MOTION_DIRECTION": "yön", - "MOTION_SCROLLRIGHT": "sağa %1 kaydır", - "MOTION_SCROLLUP": "yukarı %1 kaydır", - "MOTION_ALIGNSCENE": "%1 sahnesini hizala", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "sol-alt", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "sağ-alt", - "MOTION_ALIGNSCENE_MIDDLE": "orta", - "MOTION_ALIGNSCENE_TOPLEFT": "sol-üst", - "MOTION_ALIGNSCENE_TOPRIGHT": "sağ-üst", - "MOTION_XSCROLL": "x ekseninde kaydır", - "MOTION_YSCROLL": "y ekseninde kaydır", - "MOTION_STAGE_SELECTED": "Sahne seçildi: Hareket blokları yok", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "%1 ile %2 arasında rastgele sayı seç", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 ve %2", - "OPERATORS_OR": "%1 veya %2", - "OPERATORS_NOT": "%1 değil", - "OPERATORS_JOIN": "%1 ve %2'i birleştir", - "OPERATORS_JOIN_APPLE": "elma", - "OPERATORS_JOIN_BANANA": "muz", - "OPERATORS_LETTEROF": "%2 in %1. harfi", - "OPERATORS_LETTEROF_APPLE": "bir", - "OPERATORS_LENGTH": "%1'in uzunluğu", - "OPERATORS_CONTAINS": "%1 %2'i içeriyor mu?", - "OPERATORS_MOD": "%1 mod %2", - "OPERATORS_ROUND": "%1'i yuvarla", - "OPERATORS_MATHOP": "%2 nin %1 i", - "OPERATORS_MATHOP_ABS": "mutlak değer", - "OPERATORS_MATHOP_FLOOR": "aşağı yuvarla", - "OPERATORS_MATHOP_CEILING": "yukarı yuvarla", - "OPERATORS_MATHOP_SQRT": "karekök", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "%1 tanımla", - "SENSING_TOUCHINGOBJECT": "%1 değiyor mu?", - "SENSING_TOUCHINGOBJECT_POINTER": "fare-imlecine", - "SENSING_TOUCHINGOBJECT_EDGE": "kenara", - "SENSING_TOUCHINGCOLOR": "%1 rengine dokunuyor mu?", - "SENSING_COLORISTOUCHINGCOLOR": "%1 rengi %2 rengine değiyor mu?", - "SENSING_DISTANCETO": "%1'e mesafe", - "SENSING_DISTANCETO_POINTER": "fare-imleci", - "SENSING_ASKANDWAIT": "%1 diye sor ve bekle", - "SENSING_ASK_TEXT": "Adın ne?", - "SENSING_ANSWER": "cevap", - "SENSING_KEYPRESSED": "%1 tuşuna basıldı mı?", - "SENSING_MOUSEDOWN": "fareye basılı mı?", - "SENSING_MOUSEX": "farenin x'i", - "SENSING_MOUSEY": "farenin y'si", - "SENSING_SETDRAGMODE": "sürükleme modunu %1 yap", - "SENSING_SETDRAGMODE_DRAGGABLE": "sürüklenebilir", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "sürüklenmez", - "SENSING_LOUDNESS": "ses yüksekliği", - "SENSING_LOUD": "yüksek ses?", - "SENSING_TIMER": "zamanlayıcı", - "SENSING_RESETTIMER": "zamanlayıcıyı sıfırla", - "SENSING_OF": "%2 nin %1 i", - "SENSING_OF_XPOSITION": "x konumu", - "SENSING_OF_YPOSITION": "y konumu", - "SENSING_OF_DIRECTION": "yön", - "SENSING_OF_COSTUMENUMBER": "kostüm #", - "SENSING_OF_COSTUMENAME": "kostüm ismi", - "SENSING_OF_SIZE": "büyüklük", - "SENSING_OF_VOLUME": "ses düzeyi", - "SENSING_OF_BACKDROPNUMBER": "dekor #", - "SENSING_OF_BACKDROPNAME": "dekorun adı", - "SENSING_OF_STAGE": "Sahne", - "SENSING_CURRENT": "şimdiki %1", - "SENSING_CURRENT_YEAR": "yıl", - "SENSING_CURRENT_MONTH": "ay", - "SENSING_CURRENT_DATE": "tarih", - "SENSING_CURRENT_DAYOFWEEK": "haftanın günü", - "SENSING_CURRENT_HOUR": "saat", - "SENSING_CURRENT_MINUTE": "dakika", - "SENSING_CURRENT_SECOND": "saniye", - "SENSING_DAYSSINCE2000": "2000 yılından beri geçen gün", - "SENSING_USERNAME": "kullanıcı adı", - "SENSING_USERID": "kullanıcı kimliği", - "SOUND_PLAY": "%1 sesini başlat", - "SOUND_PLAYUNTILDONE": "%1 sesini bitene kadar çal", - "SOUND_STOPALLSOUNDS": "tüm sesleri durdur", - "SOUND_SETEFFECTO": "%1 etkisini %2 yap", - "SOUND_CHANGEEFFECTBY": "%1 etkisini %2 değiştir", - "SOUND_CLEAREFFECTS": "ses etkilerini temizle", - "SOUND_EFFECTS_PITCH": "ses perdesi", - "SOUND_EFFECTS_PAN": "sağa-sola kaydır", - "SOUND_CHANGEVOLUMEBY": "ses düzeyini %1 değiştir", - "SOUND_SETVOLUMETO": "ses düzeyini %1% yap", - "SOUND_VOLUME": "ses düzeyi", - "SOUND_RECORD": "kaydet...", - "CATEGORY_MOTION": "Hareket", - "CATEGORY_LOOKS": "Görünüm", - "CATEGORY_SOUND": "Ses", - "CATEGORY_EVENTS": "Olaylar", - "CATEGORY_CONTROL": "Kontrol", - "CATEGORY_SENSING": "Algılama", - "CATEGORY_OPERATORS": "Operatörler", - "CATEGORY_VARIABLES": "Değişkenler", - "CATEGORY_MYBLOCKS": "Bloklarım", - "DUPLICATE": "Kopyasını çıkart", - "DELETE": "Sil", - "ADD_COMMENT": "Yorum Ekle", - "REMOVE_COMMENT": "Yorumu Sil", - "DELETE_BLOCK": "Bloğu Sil", - "DELETE_X_BLOCKS": "%1 Bloklarını Sil", - "DELETE_ALL_BLOCKS": "Tüm %1 blokları silinsin mi?", - "CLEAN_UP": "Blokları temizle", - "HELP": "Yardım", - "UNDO": "Geri Al", - "REDO": "İleri Al", - "EDIT_PROCEDURE": "Düzenle", - "SHOW_PROCEDURE_DEFINITION": "Tanımlamaya git", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Birşey söyle...", - "COLOUR_HUE_LABEL": "Renk", - "COLOUR_SATURATION_LABEL": "Doygunluk", - "COLOUR_BRIGHTNESS_LABEL": "Parlaklık", - "CHANGE_VALUE_TITLE": "Değeri değiştir:", - "RENAME_VARIABLE": "Değişkeni yeniden adlandır", - "RENAME_VARIABLE_TITLE": "Tüm \"%1\" değişkenlerini şununla adlandır:", - "RENAME_VARIABLE_MODAL_TITLE": "Değişkeni Yeniden Adlandır", - "NEW_VARIABLE": "Bir Değişken Oluştur", - "NEW_VARIABLE_TITLE": "Yeni değişken adı:", - "VARIABLE_MODAL_TITLE": "Yeni Değişken", - "VARIABLE_ALREADY_EXISTS": "\"%1\" adlı değişken zaten var.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "\"%1\" adlı değişken \"%2\" tipinde zaten var.", - "DELETE_VARIABLE_CONFIRMATION": "%2 değişkeninin %1 kullanımı silinsin mi?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "\"%1\" değişkenini \"%2\" fonksiyonunun bir parçası olduğundan dolayı silinemez", - "DELETE_VARIABLE": "\"%1\" değişkenini sil", - "NEW_PROCEDURE": "Bir Blok Oluştur", - "PROCEDURE_ALREADY_EXISTS": "\"%1\" adlı prosedür zaten var.", - "PROCEDURE_DEFAULT_NAME": "blok adı", - "NEW_LIST": "Bir Liste Oluştur", - "NEW_LIST_TITLE": "Yeni liste adı:", - "LIST_MODAL_TITLE": "Yeni Liste", - "LIST_ALREADY_EXISTS": "'%1' adlı liste mevcuttur", - "RENAME_LIST_TITLE": "Tüm \"%1\" listesini şöyle adlandır:", - "RENAME_LIST_MODAL_TITLE": "Listeyi Yeniden Adlandır", - "DEFAULT_LIST_ITEM": "şey", - "DELETE_LIST": "\"%1\" listesini sil", - "RENAME_LIST": "Listeyi yeniden adlandır", - "NEW_BROADCAST_MESSAGE": "Yeni haber", - "NEW_BROADCAST_MESSAGE_TITLE": "Yeni haber adı:", - "BROADCAST_MODAL_TITLE": "Yeni Haber", - "DEFAULT_BROADCAST_MESSAGE_NAME": "haber1" -}; - -Blockly.ScratchMsgs.locales["uk"] = -{ - "CONTROL_FOREVER": "завжди", - "CONTROL_REPEAT": "повторити %1", - "CONTROL_IF": "якщо %1 то", - "CONTROL_ELSE": "інакше", - "CONTROL_STOP": "зупинити", - "CONTROL_STOP_ALL": "все", - "CONTROL_STOP_THIS": "цей скрипт", - "CONTROL_STOP_OTHER": "інші скрипти цього спрайту", - "CONTROL_WAIT": "чекати %1 секунд", - "CONTROL_WAITUNTIL": "чекати поки %1", - "CONTROL_REPEATUNTIL": "повторити до %1", - "CONTROL_WHILE": "поки %1", - "CONTROL_FOREACH": "для кожного %1 в %2", - "CONTROL_STARTASCLONE": "коли я починаю як клон", - "CONTROL_CREATECLONEOF": "створити клон з %1", - "CONTROL_CREATECLONEOF_MYSELF": "мене", - "CONTROL_DELETETHISCLONE": "вилучити цей клон", - "CONTROL_COUNTER": "лічильник", - "CONTROL_INCRCOUNTER": "збільшити лічильник", - "CONTROL_CLEARCOUNTER": "очистити лічильник", - "CONTROL_ALLATONCE": "всі одночасно", - "DATA_SETVARIABLETO": "надати %1 значення %2", - "DATA_CHANGEVARIABLEBY": "змінити %1 на %2", - "DATA_SHOWVARIABLE": "показати змінну %1", - "DATA_HIDEVARIABLE": "сховати змінну %1", - "DATA_ADDTOLIST": "додати %1 до %2", - "DATA_DELETEOFLIST": "вилучити %1 з %2", - "DATA_DELETEALLOFLIST": "вилучити все з %1", - "DATA_INSERTATLIST": "вставити %1 на місці %2 списку %3", - "DATA_REPLACEITEMOFLIST": "замінити елемент %1 в %2 на %3", - "DATA_ITEMOFLIST": "елемент %1 з %2", - "DATA_ITEMNUMOFLIST": "елемент # %1 з %2", - "DATA_LENGTHOFLIST": "довжина %1", - "DATA_LISTCONTAINSITEM": "%1 містить %2?", - "DATA_SHOWLIST": "показати список %1", - "DATA_HIDELIST": "сховати список %1", - "DATA_INDEX_ALL": "все", - "DATA_INDEX_LAST": "останні", - "DATA_INDEX_RANDOM": "випадково", - "EVENT_WHENFLAGCLICKED": "коли %1 натиснуто", - "EVENT_WHENTHISSPRITECLICKED": "коли спрайт натиснуто", - "EVENT_WHENSTAGECLICKED": "коли сцену натиснуто", - "EVENT_WHENTOUCHINGOBJECT": "коли цей спрайт торкнеться %1", - "EVENT_WHENBROADCASTRECEIVED": "коли я отримую %1", - "EVENT_WHENBACKDROPSWITCHESTO": "коли тло зміниться на %1", - "EVENT_WHENGREATERTHAN": "коли %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "таймер", - "EVENT_WHENGREATERTHAN_LOUDNESS": "гучність", - "EVENT_BROADCAST": "оповістити %1", - "EVENT_BROADCASTANDWAIT": "оповістити %1 і чекати", - "EVENT_WHENKEYPRESSED": "коли клавішу %1 натиснуто ", - "EVENT_WHENKEYPRESSED_SPACE": "пропуск", - "EVENT_WHENKEYPRESSED_LEFT": "стрілка ліворуч", - "EVENT_WHENKEYPRESSED_RIGHT": "стрілка праворуч", - "EVENT_WHENKEYPRESSED_DOWN": "стрілка вниз", - "EVENT_WHENKEYPRESSED_UP": "стрілка вгору", - "EVENT_WHENKEYPRESSED_ANY": "будь-яка", - "LOOKS_SAYFORSECS": "говорити %1 %2 сек", - "LOOKS_SAY": "говорити %1", - "LOOKS_HELLO": "Привіт!", - "LOOKS_THINKFORSECS": "подумати %1 %2 сек", - "LOOKS_THINK": "подумати %1", - "LOOKS_HMM": "Хмм...", - "LOOKS_SHOW": "показати", - "LOOKS_HIDE": "сховати", - "LOOKS_HIDEALLSPRITES": "сховати усі спрайти", - "LOOKS_EFFECT_COLOR": "колір", - "LOOKS_EFFECT_FISHEYE": "роздуття", - "LOOKS_EFFECT_WHIRL": "закручування", - "LOOKS_EFFECT_PIXELATE": "пікселями", - "LOOKS_EFFECT_MOSAIC": "мозаїка", - "LOOKS_EFFECT_BRIGHTNESS": "яскравість", - "LOOKS_EFFECT_GHOST": "привид", - "LOOKS_CHANGEEFFECTBY": "змінити ефект %1 на %2", - "LOOKS_SETEFFECTTO": "встановити ефект %1 в %2", - "LOOKS_CLEARGRAPHICEFFECTS": "очистити графічні ефекти", - "LOOKS_CHANGESIZEBY": "змінити розмір на %1", - "LOOKS_SETSIZETO": "задати розмір %1", - "LOOKS_SIZE": "розмір", - "LOOKS_CHANGESTRETCHBY": "змінити розтяг на %1", - "LOOKS_SETSTRETCHTO": "задати розтяг %1 %", - "LOOKS_SWITCHCOSTUMETO": "змінити образ на %1", - "LOOKS_NEXTCOSTUME": "наступний образ", - "LOOKS_SWITCHBACKDROPTO": "змінити тло на %1", - "LOOKS_GOTOFRONTBACK": "помістити на %1 план", - "LOOKS_GOTOFRONTBACK_FRONT": "передній", - "LOOKS_GOTOFRONTBACK_BACK": "задній", - "LOOKS_GOFORWARDBACKWARDLAYERS": "перемістити %1 на %2 шар", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "вперед", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "назад", - "LOOKS_BACKDROPNUMBERNAME": "тло %1", - "LOOKS_COSTUMENUMBERNAME": "образ %1", - "LOOKS_NUMBERNAME_NUMBER": "номер", - "LOOKS_NUMBERNAME_NAME": "назва", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "змінити тло на %1 та чекати", - "LOOKS_NEXTBACKDROP_BLOCK": "наступне тло", - "LOOKS_NEXTBACKDROP": "наступне тло", - "LOOKS_PREVIOUSBACKDROP": "попереднє тло", - "LOOKS_RANDOMBACKDROP": "випадкове тло", - "MOTION_MOVESTEPS": "перемістити на %1 кроків", - "MOTION_TURNLEFT": "поворот %1 на %2 градусів", - "MOTION_TURNRIGHT": "поворот %1 на %2 градусів", - "MOTION_POINTINDIRECTION": "повернути в напрямку %1", - "MOTION_POINTTOWARDS": "слідувати за %1", - "MOTION_POINTTOWARDS_POINTER": "вказівник", - "MOTION_POINTTOWARDS_RANDOM": "випадковий напрям", - "MOTION_GOTO": "перейти до %1", - "MOTION_GOTO_POINTER": "вказівник", - "MOTION_GOTO_RANDOM": "випадкова позиція", - "MOTION_GOTOXY": "перемістити в x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "ковзати %1 сек до x: %2 y: %3", - "MOTION_GLIDETO": "ковзати %1 сек до %2", - "MOTION_GLIDETO_POINTER": "вказівник", - "MOTION_GLIDETO_RANDOM": "випадкова позиція", - "MOTION_CHANGEXBY": "змінити x на %1", - "MOTION_SETX": "задати x %1", - "MOTION_CHANGEYBY": "змінити y на %1", - "MOTION_SETY": "задати y %1", - "MOTION_IFONEDGEBOUNCE": "якщо на межі, відбити", - "MOTION_SETROTATIONSTYLE": "стиль обертання %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "зліва-направо", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "не обертати", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "навколо", - "MOTION_XPOSITION": "значення x", - "MOTION_YPOSITION": "значення y", - "MOTION_DIRECTION": "напрям", - "MOTION_SCROLLRIGHT": "прокрутити праворуч %1", - "MOTION_SCROLLUP": "прокрутити вгору %1", - "MOTION_ALIGNSCENE": "вирівняти сцену %1", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "внизу-ліворуч", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "вниз-праворуч", - "MOTION_ALIGNSCENE_MIDDLE": "посередині", - "MOTION_ALIGNSCENE_TOPLEFT": "зверху-ліворуч", - "MOTION_ALIGNSCENE_TOPRIGHT": "зверху-праворуч", - "MOTION_XSCROLL": "x прокрутка", - "MOTION_YSCROLL": "y прокрутка", - "MOTION_STAGE_SELECTED": "Обрано Сцену: немає блоків руху", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "випадкове від %1 до %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 і %2", - "OPERATORS_OR": "%1 або %2", - "OPERATORS_NOT": "не %1", - "OPERATORS_JOIN": "з'єднати %1 %2", - "OPERATORS_JOIN_APPLE": "яблуко", - "OPERATORS_JOIN_BANANA": "банан", - "OPERATORS_LETTEROF": "символ %1 у %2", - "OPERATORS_LETTEROF_APPLE": "я", - "OPERATORS_LENGTH": "довжина %1", - "OPERATORS_CONTAINS": "%1 містить %2?", - "OPERATORS_MOD": "остача %1 на %2", - "OPERATORS_ROUND": "округлити %1", - "OPERATORS_MATHOP": "%1 з %2", - "OPERATORS_MATHOP_ABS": "abs", - "OPERATORS_MATHOP_FLOOR": "менше ціле", - "OPERATORS_MATHOP_CEILING": "більше ціле", - "OPERATORS_MATHOP_SQRT": "sqrt", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "визначити %1", - "SENSING_TOUCHINGOBJECT": "торкається %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "вказівник", - "SENSING_TOUCHINGOBJECT_EDGE": "межа", - "SENSING_TOUCHINGCOLOR": "торкається кольору %1?", - "SENSING_COLORISTOUCHINGCOLOR": "колір %1 торкається %2?", - "SENSING_DISTANCETO": "відстань до %1", - "SENSING_DISTANCETO_POINTER": "вказівник", - "SENSING_ASKANDWAIT": "запитати %1 і чекати", - "SENSING_ASK_TEXT": "Як вас звати?", - "SENSING_ANSWER": "відповідь", - "SENSING_KEYPRESSED": "клавішу %1 натиснуто?", - "SENSING_MOUSEDOWN": "мишку натиснуто?", - "SENSING_MOUSEX": "мишка x", - "SENSING_MOUSEY": "мишка y", - "SENSING_SETDRAGMODE": "перетягувати %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "дозволено", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "не дозволено", - "SENSING_LOUDNESS": "гучність", - "SENSING_LOUD": "гучно?", - "SENSING_TIMER": "таймер", - "SENSING_RESETTIMER": "перезапустити таймер", - "SENSING_OF": "%1 з %2", - "SENSING_OF_XPOSITION": "значення x", - "SENSING_OF_YPOSITION": "значення y", - "SENSING_OF_DIRECTION": "напрям", - "SENSING_OF_COSTUMENUMBER": "образ #", - "SENSING_OF_COSTUMENAME": "ім’я образу", - "SENSING_OF_SIZE": "розмір", - "SENSING_OF_VOLUME": "гучність", - "SENSING_OF_BACKDROPNUMBER": "тло #", - "SENSING_OF_BACKDROPNAME": "ім’я тла", - "SENSING_OF_STAGE": "Сцена", - "SENSING_CURRENT": "сьогодні %1", - "SENSING_CURRENT_YEAR": "рік", - "SENSING_CURRENT_MONTH": "місяць", - "SENSING_CURRENT_DATE": "дата", - "SENSING_CURRENT_DAYOFWEEK": "день тижня", - "SENSING_CURRENT_HOUR": "година", - "SENSING_CURRENT_MINUTE": "хвилина ", - "SENSING_CURRENT_SECOND": "секунда", - "SENSING_DAYSSINCE2000": "днів після 2000", - "SENSING_USERNAME": "користувач", - "SENSING_USERID": "користувач ID", - "SOUND_PLAY": "відтворити звук %1", - "SOUND_PLAYUNTILDONE": "відтворити звук %1 до кінця", - "SOUND_STOPALLSOUNDS": "зупинити всі звуки", - "SOUND_SETEFFECTO": "встановити ефект %1 в %2", - "SOUND_CHANGEEFFECTBY": "змінити ефект %1 на %2", - "SOUND_CLEAREFFECTS": "очистити звукові ефекти", - "SOUND_EFFECTS_PITCH": "висота", - "SOUND_EFFECTS_PAN": "панорама", - "SOUND_CHANGEVOLUMEBY": "змінити гучність на %1", - "SOUND_SETVOLUMETO": "встановити гучність %1%", - "SOUND_VOLUME": "гучність", - "SOUND_RECORD": "запис...", - "CATEGORY_MOTION": "Рух", - "CATEGORY_LOOKS": "Вигляд", - "CATEGORY_SOUND": "Звук", - "CATEGORY_EVENTS": "Події", - "CATEGORY_CONTROL": "Керування", - "CATEGORY_SENSING": "Датчики", - "CATEGORY_OPERATORS": "Оператори", - "CATEGORY_VARIABLES": "Змінні", - "CATEGORY_MYBLOCKS": "Мої блоки", - "DUPLICATE": "Дублювати", - "DELETE": "Вилучити", - "ADD_COMMENT": "Додати коментар", - "REMOVE_COMMENT": "Вилучити коментар", - "DELETE_BLOCK": "Вилучити блок", - "DELETE_X_BLOCKS": "Вилучити %1 блоки", - "DELETE_ALL_BLOCKS": "Вилучити всі %1 блоки?", - "CLEAN_UP": "Впорядкувати блоки", - "HELP": "Допомога", - "UNDO": "Скасувати", - "REDO": "Повернути", - "EDIT_PROCEDURE": "Правка", - "SHOW_PROCEDURE_DEFINITION": "Перейти до визначення", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "Скажіть щось...", - "COLOUR_HUE_LABEL": "Колір", - "COLOUR_SATURATION_LABEL": "Насиченість", - "COLOUR_BRIGHTNESS_LABEL": "Яскравість", - "CHANGE_VALUE_TITLE": "Змінити значення:", - "RENAME_VARIABLE": "Перейменувати змінну", - "RENAME_VARIABLE_TITLE": "Перейменувати усі \"%1\" змінні на:", - "RENAME_VARIABLE_MODAL_TITLE": "Перейменувати змінну", - "NEW_VARIABLE": "Створити змінну", - "NEW_VARIABLE_TITLE": "Нове ім'я змінної:", - "VARIABLE_MODAL_TITLE": "Нова змінна", - "VARIABLE_ALREADY_EXISTS": "Змінна з іменем \"%1\" вже існує.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Ім'я змінної \"%1\" вже використано для змінної з типом \"%2\".", - "DELETE_VARIABLE_CONFIRMATION": "Вилучити %1 використання змінної \"%2\"?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Не можна вилучити змінну \"%1\" оскільки вона визначена у функції \"%2\"", - "DELETE_VARIABLE": "Вилучити змінну '%1'", - "NEW_PROCEDURE": "Створити блок", - "PROCEDURE_ALREADY_EXISTS": "Процедура з іменем '%1' вже існує", - "PROCEDURE_DEFAULT_NAME": "назва блоку", - "NEW_LIST": "Створити список", - "NEW_LIST_TITLE": "Нове ім’я списку:", - "LIST_MODAL_TITLE": "Новий список", - "LIST_ALREADY_EXISTS": "Список з іменем '%1' вже існує", - "RENAME_LIST_TITLE": "Перейменувати усі списки \"%1\" на:", - "RENAME_LIST_MODAL_TITLE": "Перейменувати список", - "DEFAULT_LIST_ITEM": "щось", - "DELETE_LIST": "Вилучити список \"%1\"", - "RENAME_LIST": "Перейменувати список", - "NEW_BROADCAST_MESSAGE": "Нове повідомлення", - "NEW_BROADCAST_MESSAGE_TITLE": "Нове ім’я повідомлення:", - "BROADCAST_MODAL_TITLE": "Нове повідомлення", - "DEFAULT_BROADCAST_MESSAGE_NAME": "повідомлення1" -}; - -Blockly.ScratchMsgs.locales["zh-cn"] = -{ - "CONTROL_FOREVER": "重复执行", - "CONTROL_REPEAT": "重复执行 %1 次", - "CONTROL_IF": "如果 %1 那么", - "CONTROL_ELSE": "否则", - "CONTROL_STOP": "停止", - "CONTROL_STOP_ALL": "全部脚本", - "CONTROL_STOP_THIS": "这个脚本", - "CONTROL_STOP_OTHER": "该角色的其他脚本", - "CONTROL_WAIT": "等待 %1 秒", - "CONTROL_WAITUNTIL": "等待 %1", - "CONTROL_REPEATUNTIL": "重复执行直到 %1", - "CONTROL_WHILE": "当 %1 重复执行", - "CONTROL_FOREACH": "对于 %2 中的每个 %1", - "CONTROL_STARTASCLONE": "当作为克隆体启动时", - "CONTROL_CREATECLONEOF": "克隆 %1", - "CONTROL_CREATECLONEOF_MYSELF": "自己", - "CONTROL_DELETETHISCLONE": "删除此克隆体", - "CONTROL_COUNTER": "计数器", - "CONTROL_INCRCOUNTER": "计数器加一", - "CONTROL_CLEARCOUNTER": "计数器归零", - "CONTROL_ALLATONCE": "所有脚本", - "DATA_SETVARIABLETO": "将 %1 设为 %2", - "DATA_CHANGEVARIABLEBY": "将 %1 增加 %2", - "DATA_SHOWVARIABLE": "显示变量 %1", - "DATA_HIDEVARIABLE": "隐藏变量 %1", - "DATA_ADDTOLIST": "将 %1 加入 %2", - "DATA_DELETEOFLIST": "删除 %2 的第 %1 项", - "DATA_DELETEALLOFLIST": "删除 %1 的全部项目", - "DATA_INSERTATLIST": "在 %3 的第 %2 项前插入 %1", - "DATA_REPLACEITEMOFLIST": "将 %2 的第 %1 项替换为 %3", - "DATA_ITEMOFLIST": "%2 的第 %1 项", - "DATA_ITEMNUMOFLIST": "%2 中第一个 %1 的编号", - "DATA_LENGTHOFLIST": "%1 的项目数", - "DATA_LISTCONTAINSITEM": "%1 包含 %2 ?", - "DATA_SHOWLIST": "显示列表 %1", - "DATA_HIDELIST": "隐藏列表 %1", - "DATA_INDEX_ALL": "全部", - "DATA_INDEX_LAST": "末尾", - "DATA_INDEX_RANDOM": "随机", - "EVENT_WHENFLAGCLICKED": "当 %1 被点击", - "EVENT_WHENTHISSPRITECLICKED": "当角色被点击", - "EVENT_WHENSTAGECLICKED": "当舞台被点击", - "EVENT_WHENTOUCHINGOBJECT": "当该角色碰到 %1", - "EVENT_WHENBROADCASTRECEIVED": "当接收到 %1", - "EVENT_WHENBACKDROPSWITCHESTO": "当背景换成 %1", - "EVENT_WHENGREATERTHAN": "当 %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "计时器", - "EVENT_WHENGREATERTHAN_LOUDNESS": "响度", - "EVENT_BROADCAST": "广播 %1", - "EVENT_BROADCASTANDWAIT": "广播 %1 并等待", - "EVENT_WHENKEYPRESSED": "当按下 %1 键", - "EVENT_WHENKEYPRESSED_SPACE": "空格", - "EVENT_WHENKEYPRESSED_LEFT": "←", - "EVENT_WHENKEYPRESSED_RIGHT": "→", - "EVENT_WHENKEYPRESSED_DOWN": "↓", - "EVENT_WHENKEYPRESSED_UP": "↑", - "EVENT_WHENKEYPRESSED_ANY": "任意", - "LOOKS_SAYFORSECS": "说 %1 %2 秒", - "LOOKS_SAY": "说 %1", - "LOOKS_HELLO": "你好!", - "LOOKS_THINKFORSECS": "思考 %1 %2 秒", - "LOOKS_THINK": "思考 %1", - "LOOKS_HMM": "嗯……", - "LOOKS_SHOW": "显示", - "LOOKS_HIDE": "隐藏", - "LOOKS_HIDEALLSPRITES": "隐藏所有角色", - "LOOKS_EFFECT_COLOR": "颜色", - "LOOKS_EFFECT_FISHEYE": "鱼眼", - "LOOKS_EFFECT_WHIRL": "漩涡", - "LOOKS_EFFECT_PIXELATE": "像素化", - "LOOKS_EFFECT_MOSAIC": "马赛克", - "LOOKS_EFFECT_BRIGHTNESS": "亮度", - "LOOKS_EFFECT_GHOST": "虚像", - "LOOKS_CHANGEEFFECTBY": "将 %1 特效增加 %2", - "LOOKS_SETEFFECTTO": "将 %1 特效设定为 %2", - "LOOKS_CLEARGRAPHICEFFECTS": "清除图形特效", - "LOOKS_CHANGESIZEBY": "将大小增加 %1", - "LOOKS_SETSIZETO": "将大小设为 %1", - "LOOKS_SIZE": "大小", - "LOOKS_CHANGESTRETCHBY": "伸缩%1", - "LOOKS_SETSTRETCHTO": "设置伸缩为%1 %", - "LOOKS_SWITCHCOSTUMETO": "换成 %1 造型", - "LOOKS_NEXTCOSTUME": "下一个造型", - "LOOKS_SWITCHBACKDROPTO": "换成 %1 背景", - "LOOKS_GOTOFRONTBACK": "移到最 %1 ", - "LOOKS_GOTOFRONTBACK_FRONT": "前面", - "LOOKS_GOTOFRONTBACK_BACK": "后面", - "LOOKS_GOFORWARDBACKWARDLAYERS": "%1 %2 层", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "前移", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "后移", - "LOOKS_BACKDROPNUMBERNAME": "背景 %1", - "LOOKS_COSTUMENUMBERNAME": "造型 %1", - "LOOKS_NUMBERNAME_NUMBER": "编号", - "LOOKS_NUMBERNAME_NAME": "名称", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "换成 %1 背景并等待", - "LOOKS_NEXTBACKDROP_BLOCK": "下一个背景", - "LOOKS_NEXTBACKDROP": "下一个背景", - "LOOKS_PREVIOUSBACKDROP": "上一个背景", - "LOOKS_RANDOMBACKDROP": "随机背景", - "MOTION_MOVESTEPS": "移动 %1 步", - "MOTION_TURNLEFT": "左转 %1 %2 度", - "MOTION_TURNRIGHT": "右转 %1 %2 度", - "MOTION_POINTINDIRECTION": "面向 %1 方向", - "MOTION_POINTTOWARDS": "面向 %1", - "MOTION_POINTTOWARDS_POINTER": "鼠标指针", - "MOTION_POINTTOWARDS_RANDOM": "随机方向", - "MOTION_GOTO": "移到 %1", - "MOTION_GOTO_POINTER": "鼠标指针", - "MOTION_GOTO_RANDOM": "随机位置", - "MOTION_GOTOXY": "移到 x: %1 y: %2", - "MOTION_GLIDESECSTOXY": "在 %1 秒内滑行到 x: %2 y: %3", - "MOTION_GLIDETO": "在 %1 秒内滑行到 %2", - "MOTION_GLIDETO_POINTER": "鼠标指针", - "MOTION_GLIDETO_RANDOM": "随机位置", - "MOTION_CHANGEXBY": "将x坐标增加 %1", - "MOTION_SETX": "将x坐标设为 %1", - "MOTION_CHANGEYBY": "将y坐标增加 %1", - "MOTION_SETY": "将y坐标设为 %1", - "MOTION_IFONEDGEBOUNCE": "碰到边缘就反弹", - "MOTION_SETROTATIONSTYLE": "将旋转方式设为 %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "左右翻转", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "不可旋转", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "任意旋转", - "MOTION_XPOSITION": "x 坐标", - "MOTION_YPOSITION": "y 坐标", - "MOTION_DIRECTION": "方向", - "MOTION_SCROLLRIGHT": "向右滚动 %1", - "MOTION_SCROLLUP": "向上滚动 %1", - "MOTION_ALIGNSCENE": "和场景 %1 对齐", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "左下角", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "右下角", - "MOTION_ALIGNSCENE_MIDDLE": "中间", - "MOTION_ALIGNSCENE_TOPLEFT": "左上角", - "MOTION_ALIGNSCENE_TOPRIGHT": "右上角", - "MOTION_XSCROLL": "x滚动位置", - "MOTION_YSCROLL": "y滚动位置", - "MOTION_STAGE_SELECTED": "选中了舞台:不可使用运动类积木", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "在 %1 和 %2 之间取随机数", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 与 %2", - "OPERATORS_OR": "%1 或 %2", - "OPERATORS_NOT": "%1 不成立", - "OPERATORS_JOIN": "连接 %1 和 %2", - "OPERATORS_JOIN_APPLE": "苹果", - "OPERATORS_JOIN_BANANA": "香蕉", - "OPERATORS_LETTEROF": "%2 的第 %1 个字符", - "OPERATORS_LETTEROF_APPLE": "果", - "OPERATORS_LENGTH": "%1 的字符数", - "OPERATORS_CONTAINS": "%1 包含 %2 ?", - "OPERATORS_MOD": "%1 除以 %2 的余数", - "OPERATORS_ROUND": "四舍五入 %1", - "OPERATORS_MATHOP": "%1 %2", - "OPERATORS_MATHOP_ABS": "绝对值", - "OPERATORS_MATHOP_FLOOR": "向下取整", - "OPERATORS_MATHOP_CEILING": "向上取整", - "OPERATORS_MATHOP_SQRT": "平方根", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "定义 %1", - "SENSING_TOUCHINGOBJECT": "碰到 %1 ?", - "SENSING_TOUCHINGOBJECT_POINTER": "鼠标指针", - "SENSING_TOUCHINGOBJECT_EDGE": "舞台边缘", - "SENSING_TOUCHINGCOLOR": "碰到颜色 %1 ?", - "SENSING_COLORISTOUCHINGCOLOR": "颜色 %1 碰到 %2 ?", - "SENSING_DISTANCETO": "到 %1 的距离", - "SENSING_DISTANCETO_POINTER": "鼠标指针", - "SENSING_ASKANDWAIT": "询问 %1 并等待", - "SENSING_ASK_TEXT": "你叫什么名字?", - "SENSING_ANSWER": "回答", - "SENSING_KEYPRESSED": "按下 %1 键?", - "SENSING_MOUSEDOWN": "按下鼠标?", - "SENSING_MOUSEX": "鼠标的x坐标", - "SENSING_MOUSEY": "鼠标的y坐标", - "SENSING_SETDRAGMODE": "将拖动模式设为 %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "可拖动", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "不可拖动", - "SENSING_LOUDNESS": "响度", - "SENSING_LOUD": "响声?", - "SENSING_TIMER": "计时器", - "SENSING_RESETTIMER": "计时器归零", - "SENSING_OF": "%2 的 %1", - "SENSING_OF_XPOSITION": "x 坐标", - "SENSING_OF_YPOSITION": "y 坐标", - "SENSING_OF_DIRECTION": "方向", - "SENSING_OF_COSTUMENUMBER": "造型编号", - "SENSING_OF_COSTUMENAME": "造型名称", - "SENSING_OF_SIZE": "大小", - "SENSING_OF_VOLUME": "音量", - "SENSING_OF_BACKDROPNUMBER": "背景编号", - "SENSING_OF_BACKDROPNAME": "背景名称", - "SENSING_OF_STAGE": "舞台", - "SENSING_CURRENT": "当前时间的 %1", - "SENSING_CURRENT_YEAR": "年", - "SENSING_CURRENT_MONTH": "月", - "SENSING_CURRENT_DATE": "日", - "SENSING_CURRENT_DAYOFWEEK": "星期", - "SENSING_CURRENT_HOUR": "时", - "SENSING_CURRENT_MINUTE": "分", - "SENSING_CURRENT_SECOND": "秒", - "SENSING_DAYSSINCE2000": "2000年至今的天数", - "SENSING_USERNAME": "用户名", - "SENSING_USERID": "用户id", - "SOUND_PLAY": "播放声音 %1", - "SOUND_PLAYUNTILDONE": "播放声音 %1 等待播完", - "SOUND_STOPALLSOUNDS": "停止所有声音", - "SOUND_SETEFFECTO": "将 %1 音效设为 %2", - "SOUND_CHANGEEFFECTBY": "将 %1 音效增加 %2", - "SOUND_CLEAREFFECTS": "清除音效", - "SOUND_EFFECTS_PITCH": "音调", - "SOUND_EFFECTS_PAN": "左右平衡", - "SOUND_CHANGEVOLUMEBY": "将音量增加 %1", - "SOUND_SETVOLUMETO": "将音量设为 %1%", - "SOUND_VOLUME": "音量", - "SOUND_RECORD": "录制…", - "CATEGORY_MOTION": "运动", - "CATEGORY_LOOKS": "外观", - "CATEGORY_SOUND": "声音", - "CATEGORY_EVENTS": "事件", - "CATEGORY_CONTROL": "控制", - "CATEGORY_SENSING": "侦测", - "CATEGORY_OPERATORS": "运算", - "CATEGORY_VARIABLES": "变量", - "CATEGORY_MYBLOCKS": "自制积木", - "DUPLICATE": "复制", - "DELETE": "删除", - "ADD_COMMENT": "添加注释", - "REMOVE_COMMENT": "删除注释", - "DELETE_BLOCK": "删除", - "DELETE_X_BLOCKS": "删除 %1 积木", - "DELETE_ALL_BLOCKS": "删除全部 %1 积木?", - "CLEAN_UP": "整理积木", - "HELP": "帮助", - "UNDO": "撤销", - "REDO": "重做", - "EDIT_PROCEDURE": "编辑", - "SHOW_PROCEDURE_DEFINITION": "查看定义", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "说些什么……", - "COLOUR_HUE_LABEL": "颜色", - "COLOUR_SATURATION_LABEL": "饱和度", - "COLOUR_BRIGHTNESS_LABEL": "亮度", - "CHANGE_VALUE_TITLE": "更改变量:", - "RENAME_VARIABLE": "修改变量名", - "RENAME_VARIABLE_TITLE": "将所有的「%1」变量名改为:", - "RENAME_VARIABLE_MODAL_TITLE": "修改变量名", - "NEW_VARIABLE": "建立一个变量", - "NEW_VARIABLE_TITLE": "新变量名:", - "VARIABLE_MODAL_TITLE": "新建变量", - "VARIABLE_ALREADY_EXISTS": "已经存在名为「%1」的变量。", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "已经存在一个名为「%1」的变量,其类型为「%2」。", - "DELETE_VARIABLE_CONFIRMATION": "删除%1处「%2」变量吗?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "无法删除变量「%1」,因为函数「%2」的定义中用到了它", - "DELETE_VARIABLE": "删除变量「%1」", - "NEW_PROCEDURE": "制作新的积木", - "PROCEDURE_ALREADY_EXISTS": "已经存在名为「%1」的程序。", - "PROCEDURE_DEFAULT_NAME": "积木名称", - "NEW_LIST": "建立一个列表", - "NEW_LIST_TITLE": "新的列表名:", - "LIST_MODAL_TITLE": "新建列表", - "LIST_ALREADY_EXISTS": "名为 「%1」 的列表已存在。", - "RENAME_LIST_TITLE": "将所有的「%1」列表改名为:", - "RENAME_LIST_MODAL_TITLE": "修改列表名", - "DEFAULT_LIST_ITEM": "东西", - "DELETE_LIST": "删除「%1」列表", - "RENAME_LIST": "修改列表名", - "NEW_BROADCAST_MESSAGE": "新消息", - "NEW_BROADCAST_MESSAGE_TITLE": "新消息的名称:", - "BROADCAST_MODAL_TITLE": "新消息", - "DEFAULT_BROADCAST_MESSAGE_NAME": "消息1" -}; - -Blockly.ScratchMsgs.locales["zh-tw"] = -{ - "CONTROL_FOREVER": "重複無限次", - "CONTROL_REPEAT": "重複 %1 次", - "CONTROL_IF": "如果 %1 那麼", - "CONTROL_ELSE": "否則", - "CONTROL_STOP": "停止", - "CONTROL_STOP_ALL": "全部", - "CONTROL_STOP_THIS": "這個程式", - "CONTROL_STOP_OTHER": "這個物件的其它程式", - "CONTROL_WAIT": "等待 %1 秒", - "CONTROL_WAITUNTIL": "等待直到 %1", - "CONTROL_REPEATUNTIL": "重複直到 %1", - "CONTROL_WHILE": "當 %1", - "CONTROL_FOREACH": "計數 %1 於 %2", - "CONTROL_STARTASCLONE": "當分身產生", - "CONTROL_CREATECLONEOF": "建立 %1 的分身", - "CONTROL_CREATECLONEOF_MYSELF": "自己", - "CONTROL_DELETETHISCLONE": "分身刪除", - "CONTROL_COUNTER": "計數器", - "CONTROL_INCRCOUNTER": "計數器累計", - "CONTROL_CLEARCOUNTER": "計數器重置", - "CONTROL_ALLATONCE": "全部一起", - "DATA_SETVARIABLETO": "變數 %1 設為 %2", - "DATA_CHANGEVARIABLEBY": "變數 %1 改變 %2", - "DATA_SHOWVARIABLE": "變數 %1 顯示", - "DATA_HIDEVARIABLE": "變數 %1 隱藏", - "DATA_ADDTOLIST": "添加 %1 到 %2", - "DATA_DELETEOFLIST": "刪除 %2 的第 %1 項", - "DATA_DELETEALLOFLIST": "刪除 %1 的所有項目", - "DATA_INSERTATLIST": "插入 %1 到 %3 的第 %2 項", - "DATA_REPLACEITEMOFLIST": "替換 %2 的第 %1 項為 %3", - "DATA_ITEMOFLIST": "%2 的第 %1 項", - "DATA_ITEMNUMOFLIST": "%1 在 %2 裡的項目編號", - "DATA_LENGTHOFLIST": "清單 %1 的長度", - "DATA_LISTCONTAINSITEM": "清單 %1 包含 %2?", - "DATA_SHOWLIST": "清單 %1 顯示", - "DATA_HIDELIST": "清單 %1 隱藏", - "DATA_INDEX_ALL": "全部", - "DATA_INDEX_LAST": "末", - "DATA_INDEX_RANDOM": "隨機", - "EVENT_WHENFLAGCLICKED": "當 %1 被點擊", - "EVENT_WHENTHISSPRITECLICKED": "當角色被點擊", - "EVENT_WHENSTAGECLICKED": "當舞台被點擊", - "EVENT_WHENTOUCHINGOBJECT": "當角色碰到 %1", - "EVENT_WHENBROADCASTRECEIVED": "當收到訊息 %1", - "EVENT_WHENBACKDROPSWITCHESTO": "當背景換成 %1", - "EVENT_WHENGREATERTHAN": "當 %1 > %2", - "EVENT_WHENGREATERTHAN_TIMER": "計時器", - "EVENT_WHENGREATERTHAN_LOUDNESS": "聲音響度", - "EVENT_BROADCAST": "廣播訊息 %1", - "EVENT_BROADCASTANDWAIT": "廣播訊息 %1 並等待", - "EVENT_WHENKEYPRESSED": "當 %1 鍵被按下", - "EVENT_WHENKEYPRESSED_SPACE": "空白", - "EVENT_WHENKEYPRESSED_LEFT": "向左", - "EVENT_WHENKEYPRESSED_RIGHT": "向右", - "EVENT_WHENKEYPRESSED_DOWN": "向下", - "EVENT_WHENKEYPRESSED_UP": "向上", - "EVENT_WHENKEYPRESSED_ANY": "任何", - "LOOKS_SAYFORSECS": "說出 %1 持續 %2 秒", - "LOOKS_SAY": "說出 %1", - "LOOKS_HELLO": "Hello!", - "LOOKS_THINKFORSECS": "想著 %1 持續 %2 秒", - "LOOKS_THINK": "想著 %1", - "LOOKS_HMM": "Hmm...", - "LOOKS_SHOW": "顯示", - "LOOKS_HIDE": "隱藏", - "LOOKS_HIDEALLSPRITES": "隱藏所有角色", - "LOOKS_EFFECT_COLOR": "顏色", - "LOOKS_EFFECT_FISHEYE": "魚眼", - "LOOKS_EFFECT_WHIRL": "漩渦", - "LOOKS_EFFECT_PIXELATE": "像素化", - "LOOKS_EFFECT_MOSAIC": "馬賽克", - "LOOKS_EFFECT_BRIGHTNESS": "亮度", - "LOOKS_EFFECT_GHOST": "幻影", - "LOOKS_CHANGEEFFECTBY": "圖像效果 %1 改變 %2", - "LOOKS_SETEFFECTTO": "圖像效果 %1 設為 %2", - "LOOKS_CLEARGRAPHICEFFECTS": "圖像效果清除", - "LOOKS_CHANGESIZEBY": "尺寸改變 %1", - "LOOKS_SETSIZETO": "尺寸設為 %1 %", - "LOOKS_SIZE": "尺寸", - "LOOKS_CHANGESTRETCHBY": "伸縮改變 %1", - "LOOKS_SETSTRETCHTO": "伸縮設為 %1 %", - "LOOKS_SWITCHCOSTUMETO": "造型換成 %1", - "LOOKS_NEXTCOSTUME": "造型換成下一個", - "LOOKS_SWITCHBACKDROPTO": "背景換成 %1", - "LOOKS_GOTOFRONTBACK": "圖層移到 %1 層", - "LOOKS_GOTOFRONTBACK_FRONT": "最上", - "LOOKS_GOTOFRONTBACK_BACK": "最下", - "LOOKS_GOFORWARDBACKWARDLAYERS": "圖層 %1 移 %2 層", - "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD": "上", - "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD": "下", - "LOOKS_BACKDROPNUMBERNAME": "背景 %1", - "LOOKS_COSTUMENUMBERNAME": "造型 %1", - "LOOKS_NUMBERNAME_NUMBER": "編號", - "LOOKS_NUMBERNAME_NAME": "名稱", - "LOOKS_SWITCHBACKDROPTOANDWAIT": "背景換成 %1 並等待", - "LOOKS_NEXTBACKDROP_BLOCK": "背景換成下一個", - "LOOKS_NEXTBACKDROP": "下一個背景", - "LOOKS_PREVIOUSBACKDROP": "上一個背景", - "LOOKS_RANDOMBACKDROP": "任一個背景", - "MOTION_MOVESTEPS": "移動 %1 點", - "MOTION_TURNLEFT": "左轉 %1 %2 度", - "MOTION_TURNRIGHT": "右轉 %1 %2 度", - "MOTION_POINTINDIRECTION": "面朝 %1 度", - "MOTION_POINTTOWARDS": "面朝 %1 向", - "MOTION_POINTTOWARDS_POINTER": "鼠標", - "MOTION_POINTTOWARDS_RANDOM": "隨機", - "MOTION_GOTO": "定位到 %1 位置", - "MOTION_GOTO_POINTER": "鼠標", - "MOTION_GOTO_RANDOM": "隨機", - "MOTION_GOTOXY": "定位到 x:%1 y:%2", - "MOTION_GLIDESECSTOXY": "滑行 %1 秒到 x:%2 y:%3", - "MOTION_GLIDETO": "滑行 %1 秒到 %2 位置", - "MOTION_GLIDETO_POINTER": "鼠標", - "MOTION_GLIDETO_RANDOM": "隨機", - "MOTION_CHANGEXBY": "x 改變 %1", - "MOTION_SETX": "x 設為 %1", - "MOTION_CHANGEYBY": "y 改變 %1", - "MOTION_SETY": "y 設為 %1", - "MOTION_IFONEDGEBOUNCE": "碰到邊緣就反彈", - "MOTION_SETROTATIONSTYLE": "迴轉方式設為 %1", - "MOTION_SETROTATIONSTYLE_LEFTRIGHT": "左-右", - "MOTION_SETROTATIONSTYLE_DONTROTATE": "不旋轉", - "MOTION_SETROTATIONSTYLE_ALLAROUND": "不設限", - "MOTION_XPOSITION": "x 座標", - "MOTION_YPOSITION": "y 座標", - "MOTION_DIRECTION": "方向", - "MOTION_SCROLLRIGHT": "滾動向右 %1", - "MOTION_SCROLLUP": "滾動向上 %1", - "MOTION_ALIGNSCENE": "場景 %1 對齊", - "MOTION_ALIGNSCENE_BOTTOMLEFT": "左下", - "MOTION_ALIGNSCENE_BOTTOMRIGHT": "右下", - "MOTION_ALIGNSCENE_MIDDLE": "中間", - "MOTION_ALIGNSCENE_TOPLEFT": "左上", - "MOTION_ALIGNSCENE_TOPRIGHT": "右上", - "MOTION_XSCROLL": "x 捲軸", - "MOTION_YSCROLL": "y 捲軸", - "MOTION_STAGE_SELECTED": "目前選擇的物件是「舞台」:無可用的動作積木", - "OPERATORS_ADD": "%1 + %2", - "OPERATORS_SUBTRACT": "%1 - %2", - "OPERATORS_MULTIPLY": "%1 * %2", - "OPERATORS_DIVIDE": "%1 / %2", - "OPERATORS_RANDOM": "隨機取數 %1 到 %2", - "OPERATORS_GT": "%1 > %2", - "OPERATORS_LT": "%1 < %2", - "OPERATORS_EQUALS": "%1 = %2", - "OPERATORS_AND": "%1 且 %2", - "OPERATORS_OR": "%1 或 %2", - "OPERATORS_NOT": "%1 不成立", - "OPERATORS_JOIN": "字串組合 %1 %2", - "OPERATORS_JOIN_APPLE": "apple", - "OPERATORS_JOIN_BANANA": "banana", - "OPERATORS_LETTEROF": "字串 %2 的第 %1 字", - "OPERATORS_LETTEROF_APPLE": "a", - "OPERATORS_LENGTH": "字串 %1 的長度", - "OPERATORS_CONTAINS": "字串 %1 包含 %2?", - "OPERATORS_MOD": "%1 除以 %2 的餘數", - "OPERATORS_ROUND": "四捨五入數值 %1", - "OPERATORS_MATHOP": "%1 數值 %2", - "OPERATORS_MATHOP_ABS": "絕對值", - "OPERATORS_MATHOP_FLOOR": "無條件捨去", - "OPERATORS_MATHOP_CEILING": "無條件進位", - "OPERATORS_MATHOP_SQRT": "平方根", - "OPERATORS_MATHOP_SIN": "sin", - "OPERATORS_MATHOP_COS": "cos", - "OPERATORS_MATHOP_TAN": "tan", - "OPERATORS_MATHOP_ASIN": "asin", - "OPERATORS_MATHOP_ACOS": "acos", - "OPERATORS_MATHOP_ATAN": "atan", - "OPERATORS_MATHOP_LN": "ln", - "OPERATORS_MATHOP_LOG": "log", - "OPERATORS_MATHOP_EEXP": "e ^", - "OPERATORS_MATHOP_10EXP": "10 ^", - "PROCEDURES_DEFINITION": "定義 %1", - "SENSING_TOUCHINGOBJECT": "碰到 %1?", - "SENSING_TOUCHINGOBJECT_POINTER": "鼠標", - "SENSING_TOUCHINGOBJECT_EDGE": "邊緣", - "SENSING_TOUCHINGCOLOR": "碰到顏色 %1?", - "SENSING_COLORISTOUCHINGCOLOR": "顏色 %1 碰到 顏色 %2?", - "SENSING_DISTANCETO": "與 %1 的間距", - "SENSING_DISTANCETO_POINTER": "鼠標", - "SENSING_ASKANDWAIT": "詢問 %1 並等待", - "SENSING_ASK_TEXT": "你的名字是?", - "SENSING_ANSWER": "詢問的答案", - "SENSING_KEYPRESSED": "%1 鍵被按下?", - "SENSING_MOUSEDOWN": "滑鼠鍵被按下?", - "SENSING_MOUSEX": "鼠標的 x", - "SENSING_MOUSEY": "鼠標的 y", - "SENSING_SETDRAGMODE": "拖曳方式設為 %1", - "SENSING_SETDRAGMODE_DRAGGABLE": "可拖曳", - "SENSING_SETDRAGMODE_NOTDRAGGABLE": "不可拖曳", - "SENSING_LOUDNESS": "聲音響度", - "SENSING_LOUD": "大聲?", - "SENSING_TIMER": "計時器", - "SENSING_RESETTIMER": "計時器重置", - "SENSING_OF": "%2 的 %1", - "SENSING_OF_XPOSITION": "x 座標", - "SENSING_OF_YPOSITION": "y 座標", - "SENSING_OF_DIRECTION": "方向", - "SENSING_OF_COSTUMENUMBER": "造型編號", - "SENSING_OF_COSTUMENAME": "造型名稱", - "SENSING_OF_SIZE": "尺寸", - "SENSING_OF_VOLUME": "音量", - "SENSING_OF_BACKDROPNUMBER": "背景編號", - "SENSING_OF_BACKDROPNAME": "背景名稱", - "SENSING_OF_STAGE": "舞台", - "SENSING_CURRENT": "目前時間的 %1", - "SENSING_CURRENT_YEAR": "年", - "SENSING_CURRENT_MONTH": "月", - "SENSING_CURRENT_DATE": "日", - "SENSING_CURRENT_DAYOFWEEK": "週", - "SENSING_CURRENT_HOUR": "時", - "SENSING_CURRENT_MINUTE": "分", - "SENSING_CURRENT_SECOND": "秒", - "SENSING_DAYSSINCE2000": "2000年迄今日數", - "SENSING_USERNAME": "用戶名稱", - "SENSING_USERID": "用戶 ID", - "SOUND_PLAY": "播放音效 %1", - "SOUND_PLAYUNTILDONE": "播放音效 %1 直到結束", - "SOUND_STOPALLSOUNDS": "停播所有音效", - "SOUND_SETEFFECTO": "聲音效果 %1 設為 %2", - "SOUND_CHANGEEFFECTBY": "聲音效果 %1 改變 %2", - "SOUND_CLEAREFFECTS": "聲音效果清除", - "SOUND_EFFECTS_PITCH": "音高", - "SOUND_EFFECTS_PAN": "聲道左/右", - "SOUND_CHANGEVOLUMEBY": "音量改變 %1", - "SOUND_SETVOLUMETO": "音量設為 %1%", - "SOUND_VOLUME": "音量", - "SOUND_RECORD": "錄音…", - "CATEGORY_MOTION": "動作", - "CATEGORY_LOOKS": "外觀", - "CATEGORY_SOUND": "音效", - "CATEGORY_EVENTS": "事件", - "CATEGORY_CONTROL": "控制", - "CATEGORY_SENSING": "偵測", - "CATEGORY_OPERATORS": "運算", - "CATEGORY_VARIABLES": "變數", - "CATEGORY_MYBLOCKS": "函式積木", - "DUPLICATE": "複製", - "DELETE": "刪除", - "ADD_COMMENT": "添加註解", - "REMOVE_COMMENT": "移除註解", - "DELETE_BLOCK": "刪除積木", - "DELETE_X_BLOCKS": "刪除 %1 個積木", - "DELETE_ALL_BLOCKS": "要刪除全部(%1 個)積木?", - "CLEAN_UP": "整理積木", - "HELP": "幫助", - "UNDO": "復原", - "REDO": "重做", - "EDIT_PROCEDURE": "編輯", - "SHOW_PROCEDURE_DEFINITION": "移至定義", - "WORKSPACE_COMMENT_DEFAULT_TEXT": "說些什麼…", - "COLOUR_HUE_LABEL": "顏色", - "COLOUR_SATURATION_LABEL": "彩度", - "COLOUR_BRIGHTNESS_LABEL": "亮度", - "CHANGE_VALUE_TITLE": "改成:", - "RENAME_VARIABLE": "重新命名變數", - "RENAME_VARIABLE_TITLE": "將變數 %1 重新命名為:", - "RENAME_VARIABLE_MODAL_TITLE": "重新命名變數", - "NEW_VARIABLE": "建立一個變數", - "NEW_VARIABLE_TITLE": "新變數的名稱", - "VARIABLE_MODAL_TITLE": "新的變數", - "VARIABLE_ALREADY_EXISTS": "變數名稱「%1」已經被使用。", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "變數名稱「%1」已經被使用在 %2 型別了。", - "DELETE_VARIABLE_CONFIRMATION": "刪除正在使用的變數 %2 的 %1 個地方?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "無法刪除變數 %1,因為它是函式 %2 定義中的一部分。", - "DELETE_VARIABLE": "刪除變數 %1", - "NEW_PROCEDURE": "建立一個積木", - "PROCEDURE_ALREADY_EXISTS": "程序名稱「%1」已經被使用。", - "PROCEDURE_DEFAULT_NAME": "積木名稱", - "NEW_LIST": "建立一個清單", - "NEW_LIST_TITLE": "新清單的名稱", - "LIST_MODAL_TITLE": "新的清單", - "LIST_ALREADY_EXISTS": "清單名稱「%1」已經被使用。", - "RENAME_LIST_TITLE": "將清單 %1 重新命名為:", - "RENAME_LIST_MODAL_TITLE": "重新命名清單", - "DEFAULT_LIST_ITEM": "thing", - "DELETE_LIST": "刪除清單 %1", - "RENAME_LIST": "重新命名清單", - "NEW_BROADCAST_MESSAGE": "新的訊息", - "NEW_BROADCAST_MESSAGE_TITLE": "新訊息的名稱", - "BROADCAST_MODAL_TITLE": "新的訊息", - "DEFAULT_BROADCAST_MESSAGE_NAME": "message1" -}; -// End of combined translations diff --git a/packages/scratch-blocks/package-lock.json b/packages/scratch-blocks/package-lock.json deleted file mode 100644 index 2de0a89bc..000000000 --- a/packages/scratch-blocks/package-lock.json +++ /dev/null @@ -1,7000 +0,0 @@ -{ - "name": "scratch-blocks", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/cli": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.8.0.tgz", - "integrity": "sha512-/zOi56gIH3jBmnrfUvVf8MOMqf3hfFou2ONRYdRRpgnBSi0dUkiO+usu44YHsOEJqqwPkijBsiDKscQizouoag==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.13", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "commander": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", - "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.0" - } - }, - "@babel/core": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", - "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helpers": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", - "dev": true, - "requires": { - "@babel/types": "^7.8.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", - "dev": true, - "requires": { - "@babel/types": "^7.8.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.0" - } - }, - "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", - "dev": true, - "requires": { - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", - "dev": true - }, - "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "13.1.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.6.tgz", - "integrity": "sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "^4.14.0" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", - "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "babel-plugin-react-intl": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-3.5.1.tgz", - "integrity": "sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/helper-plugin-utils": "^7.0.0", - "@types/babel__core": "^7.1.2", - "fs-extra": "^8.0.1", - "intl-messageformat-parser": "^1.8.1" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "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": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "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" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "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" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "chromedriver": { - "version": "75.1.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-75.1.0.tgz", - "integrity": "sha512-N2P0fg6FS4c+tTG0R7cCOD5qiVo+E6uAz6xVjmbZesYv1xs1iGdcCUo0IqOY+ppD/4OOObG+XWV1CFWXT6UIgA==", - "dev": true, - "requires": { - "del": "^4.1.1", - "extract-zip": "^1.6.7", - "mkdirp": "^0.5.1", - "request": "^2.88.0", - "tcp-port-used": "^1.0.1" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "collections": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", - "integrity": "sha1-HyMCay7zb5J+7MkB6ZxfDUj6M04=", - "dev": true, - "requires": { - "weak-map": "1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz", - "integrity": "sha512-OlTo6DYg0XfTKOF8eLf79wcHm4Ut10xU2cRBRPMW/NA5F9VMjZGTfRHWDIYC3s+1kObGYrBLshXWU1K0hILkNQ==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "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": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "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-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "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" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "exports-loader": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz", - "integrity": "sha1-V9x4kX9wm5byR/qR5ptVTIVQE8g=", - "requires": { - "loader-utils": "0.2.x", - "source-map": "0.1.x" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - } - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "gh-pages": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-0.12.0.tgz", - "integrity": "sha1-2VHj7Zi4VpnUsEGOsaFbGgSYjcE=", - "dev": true, - "requires": { - "async": "2.1.2", - "commander": "2.9.0", - "globby": "^6.1.0", - "graceful-fs": "4.1.10", - "q": "1.4.1", - "q-io": "1.13.2", - "rimraf": "^2.5.4" - }, - "dependencies": { - "async": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.2.tgz", - "integrity": "sha1-YSpKtF70KnDN6Aa62G7m2wR+g4U=", - "dev": true, - "requires": { - "lodash": "^4.14.0" - } - }, - "graceful-fs": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.10.tgz", - "integrity": "sha1-8tcgwiCS90Mih3XHXjYSYyUB8TE=", - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "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" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "google-closure-compiler": { - "version": "20180402.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180402.0.0.tgz", - "integrity": "sha1-uVFuWMz3Owr3HoeGnhXvuAWlsGc=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "vinyl": "^2.0.1", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "google-closure-library": { - "version": "20180204.0.0", - "resolved": "https://registry.npmjs.org/google-closure-library/-/google-closure-library-20180204.0.0.tgz", - "integrity": "sha1-rTxaGN/XMcYUnFIg0pkcDJEpcYo=", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imports-loader": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", - "integrity": "sha1-rnRlMDHVnjezwvslRKxhrq41MKY=", - "requires": { - "loader-utils": "0.2.x", - "source-map": "0.1.x" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "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" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "is2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", - "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^2.1.0", - "is-url": "^1.2.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/json/-/json-9.0.4.tgz", - "integrity": "sha1-0NvyQEwShXKpNeyvrfx4LsgREs4=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "mimeparse": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", - "integrity": "sha1-2vsCdSNw/SJgk64xUsJxrwGsJUo=", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", - "dev": true - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "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": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "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" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "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" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "q-io": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.2.tgz", - "integrity": "sha1-7qEw1IHdteGqG8WmaFX3OR0G8AM=", - "dev": true, - "requires": { - "collections": "^0.2.0", - "mime": "^1.2.11", - "mimeparse": "^0.1.4", - "q": "^1.0.1", - "qs": "^1.2.1", - "url2": "^0.0.0" - }, - "dependencies": { - "qs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", - "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", - "dev": true - } - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - } - } - }, - "scratch-l10n": { - "version": "3.7.20200108141814", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.7.20200108141814.tgz", - "integrity": "sha512-96XEoJGqmR3f/394hcyBjHdyc3VNapaU6hQ+3/4TAvfD/8keYsJuSVkHHMD+UpodHKkkSTyQZIjbDKc9T60UMQ==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "transifex": "1.6.6" - } - }, - "selenium-webdriver": { - "version": "4.0.0-alpha.5", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.5.tgz", - "integrity": "sha512-hktl3DSrhzM59yLhWzDGHIX9o56DvA+cVK7Dw6FcJR6qQ4CGzkaHeXQPcdrslkWMTeq0Ci9AmCxq0EMOvm2Rkg==", - "dev": true, - "requires": { - "jszip": "^3.1.5", - "rimraf": "^2.6.3", - "tmp": "0.0.30", - "xml2js": "^0.4.19" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": ">=0.0.4" - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "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": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "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" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tcp-port-used": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", - "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", - "dev": true, - "requires": { - "debug": "4.1.0", - "is2": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "terser": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", - "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "transifex": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/transifex/-/transifex-1.6.6.tgz", - "integrity": "sha512-uHeRvhfLfZN+JdH+X0zR1jkQAbMGkgExZgcXm31CzaVVd4kq98YaPr4MCgCU0LwA7cgOuB97d2HZQ/WikOAxlg==", - "dev": true, - "requires": { - "commander": "^2.9.0", - "lodash": "^4.17.1", - "mkpath": "^1.0.0", - "mocha": "^4.0.0", - "request": "^2.34.0", - "should": "^13.0.0" - } - }, - "travis-after-all": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/travis-after-all/-/travis-after-all-1.4.4.tgz", - "integrity": "sha1-xaOW8YQEr2NKZQV7LAcdpYkj5Js=", - "dev": true - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url2": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", - "integrity": "sha1-Tqq9HVw6yQ1iq0SFyZhCKGWgSxo=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "weak-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", - "integrity": "sha1-tm5Wqd8L0lp2u/G1FNsSkIBhSjc=", - "dev": true - }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - } - } -} diff --git a/packages/scratch-blocks/package.json b/packages/scratch-blocks/package.json deleted file mode 100644 index 4c7fd2b45..000000000 --- a/packages/scratch-blocks/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "scratch-blocks", - "version": "0.1.0", - "description": "Scratch Blocks is a library for building creative computing interfaces.", - "author": "Massachusetts Institute of Technology", - "license": "Apache-2.0", - "homepage": "https://github.com/LLK/scratch-blocks#readme", - "repository": { - "type": "git", - "url": "https://github.com/LLK/scratch-blocks.git" - }, - "main": "./dist/vertical.js", - "browser": "./shim/vertical.js", - "scripts": { - "deploy": "rimraf gh-pages/closure-library/scripts/ci/CloseAdobeDialog.exe && gh-pages -t -d gh-pages -m \"Build for $(git log --pretty=format:%H -n1)\"", - "prepublish": "python build.py && webpack", - "test:unit": "node tests/jsunit/test_runner.js", - "test:lint": "eslint .", - "test:messages": "npm run translate && node i18n/test_scratch_msgs.js", - "test": "npm run test:lint && npm run test:messages && npm run test:unit", - "version": "json -f package.json -I -e \"this.repository.sha = '$(git log -n1 --pretty=format:%H)'\"", - "translate": "node i18n/js_to_json.js && node i18n/json_to_js.js", - "translate:sync:src": "tx-push-src scratch-editor blocks msg/json/en.json", - "translate:sync:translations": "node i18n/sync_tx_translations.js", - "translate:update": "npm run translate:sync:src && npm run translate:sync:translations" - }, - "dependencies": { - "exports-loader": "0.6.3", - "imports-loader": "0.6.5" - }, - "devDependencies": { - "async": "2.6.0", - "chromedriver": "^75.0", - "copy-webpack-plugin": "4.5.1", - "eslint": "^4.16", - "event-stream": "3.3.4", - "gh-pages": "0.12.0", - "glob": "7.1.2", - "google-closure-compiler": "20180402.0.0", - "google-closure-library": "20180204.0.0", - "graceful-fs": "4.1.11", - "json": "9.0.4", - "rimraf": "2.6.2", - "scratch-l10n": "^3.7.20191219145348", - "selenium-webdriver": "^4.0.0-alpha.1", - "transifex": "1.6.6", - "travis-after-all": "1.4.4", - "uglifyjs-webpack-plugin": "^1.2.5", - "webpack": "^4.22.0", - "webpack-cli": "^3.1.1" - } -} diff --git a/packages/scratch-blocks/pull_from_blockly.sh b/packages/scratch-blocks/pull_from_blockly.sh deleted file mode 100755 index fe3dcb867..000000000 --- a/packages/scratch-blocks/pull_from_blockly.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/bin/bash - -# Pull from Blockly into Scratch Blocks and do basic cleanup. -# Rachel Fenichel (fenichel@google.com) - -BOLD='\e[1m' -NOBOLD='\e[21m' - -# Formatting helper. -empty_lines() { printf '\n\n'; } -bold_echo() { - echo -e "${BOLD}$1${NOBOLD}" -} - -stop_on_fail() { - # Fail if any command fails. - set -e - # Even if you're piping the output. - set -o pipefail -} - -# Undo the effects of start_failing. -continue_on_fail() { - set +e - set +o pipefail -} - -# Prompt for y/n and put the result in $prompt_result -# The first argument specifies the text to use in the prompt. -# The second argument specifies which value to use if we're skipping prompts. -prompt() { - if [ $with_prompts ] - then - if [ $2 = true ] - then - paren_text="(Y/n)" - else - paren_text="(y/N)" - fi - # Prompt the user and retry if they try any funny business. - while true; do - read -p "$1 $paren_text > " yn - case $yn in - [Yy]* ) prompt_result=true; break;; - [Nn]* ) prompt_result=false; break;; - * ) echo "Please answer yes or no.";; - esac - done - else - # Running without prompts. Use the default value. - prompt_result=$2; - fi -} - - -# Ask the user for confirmation, then pull from Blockly's develop branch. -# The default is to do the pull. -pull_from_develop_fn() { - empty_lines - prompt "Do you want to pull from develop?" true - if [ $prompt_result = false ] - then - bold_echo "You don't want to pull from develop. Why are you running this script?" - exit - fi - - bold_echo "Pulling from Blockly's develop branch" - sleep .5 - # This pull will likely fail with merge conflicts, but that's okay. - # However, this means that we won't fail on errors other than merge conflicts. - continue_on_fail - git pull https://github.com/google/blockly.git develop - stop_on_fail -} - -# Ask the user for confirmation, then run cleanup. -# The default is to run cleanup. -run_cleanup_fn() { - empty_lines - prompt "Ready to run cleanup.sh. Continue?" true - if [ $prompt_result = false ] - then - bold_echo "Skipping cleanup.sh" - prompt_for_merge_abort - empty_lines - bold_echo "Done" - exit - fi - - bold_echo "Running cleanup.sh" - sleep .5 - # Cleanup.sh resolves common conflicts. - ./cleanup.sh -} - -# Ask the user for confirmation, then possibly abort the merge. -# The default is to *not* abort the merge. -# Used to clean up the repo instead of leaving it in a bad state. -prompt_for_merge_abort() { - empty_lines - prompt "Do you want to abort this merge?" false - if [ $prompt_result = false ] - then - bold_echo "Continuing with merge..." - else - bold_echo "Running git merge --abort" - git merge --abort - display_status_fn - bold_echo "Done" - exit - fi -} - -# Ask the user for confirmation, then show the current repo status. -# The default to to show status. -display_status_fn() { - empty_lines - prompt "Do you want to display the current status?" true - if [ $prompt_result = true ] - then - # Tell the user the current state. - bold_echo "Current status" - sleep .5 - git status - else - bold_echo "Skipping status display." - fi -} - -# Give the user one more chance to abort the merge, then tell them what their -# next steps should be. -finish_fn() { - prompt_for_merge_abort - bold_echo "Done. You may need to manually resolve conflicts." - # Helpful tips about what to do next. - empty_lines - sleep .5 - echo "Fix conflicts and run 'git commit'." - echo "Use 'git add ' to mark resolution." - echo "Use 'git merge --abort' to abort this merge." -} - -# Check whether we're running with prompts. If unset, we'll skip all prompts. -with_prompts=$1 - -# Here we go! -stop_on_fail -pull_from_develop_fn -run_cleanup_fn -display_status_fn -finish_fn diff --git a/packages/scratch-blocks/shim/blockly_compressed_horizontal-blocks_compressed.js b/packages/scratch-blocks/shim/blockly_compressed_horizontal-blocks_compressed.js deleted file mode 100644 index 32675cc41..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_horizontal-blocks_compressed.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=./shim/blockly_compressed_horizontal.Blockly!exports-loader?Blockly!../blocks_compressed'); diff --git a/packages/scratch-blocks/shim/blockly_compressed_horizontal.Blockly.js b/packages/scratch-blocks/shim/blockly_compressed_horizontal.Blockly.js deleted file mode 100644 index f481649d8..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_horizontal.Blockly.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./blockly_compressed_horizontal').Blockly; diff --git a/packages/scratch-blocks/shim/blockly_compressed_horizontal.goog.js b/packages/scratch-blocks/shim/blockly_compressed_horizontal.goog.js deleted file mode 100644 index 1bc78ca5a..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_horizontal.goog.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./blockly_compressed_horizontal').goog; diff --git a/packages/scratch-blocks/shim/blockly_compressed_horizontal.js b/packages/scratch-blocks/shim/blockly_compressed_horizontal.js deleted file mode 100644 index ed83a6747..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_horizontal.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?this=>window!exports-loader?Blockly&goog!../blockly_compressed_horizontal'); diff --git a/packages/scratch-blocks/shim/blockly_compressed_vertical-blocks_compressed.js b/packages/scratch-blocks/shim/blockly_compressed_vertical-blocks_compressed.js deleted file mode 100644 index 8eec1f68a..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_vertical-blocks_compressed.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=./shim/blockly_compressed_vertical.Blockly!exports-loader?Blockly!../blocks_compressed'); diff --git a/packages/scratch-blocks/shim/blockly_compressed_vertical.Blockly.js b/packages/scratch-blocks/shim/blockly_compressed_vertical.Blockly.js deleted file mode 100644 index 041f4e131..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_vertical.Blockly.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./blockly_compressed_vertical').Blockly; diff --git a/packages/scratch-blocks/shim/blockly_compressed_vertical.goog.js b/packages/scratch-blocks/shim/blockly_compressed_vertical.goog.js deleted file mode 100644 index 22ccbfdd7..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_vertical.goog.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./blockly_compressed_vertical').goog; diff --git a/packages/scratch-blocks/shim/blockly_compressed_vertical.js b/packages/scratch-blocks/shim/blockly_compressed_vertical.js deleted file mode 100644 index dce46a9de..000000000 --- a/packages/scratch-blocks/shim/blockly_compressed_vertical.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?this=>window!exports-loader?Blockly&goog!../blockly_compressed_vertical'); diff --git a/packages/scratch-blocks/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js b/packages/scratch-blocks/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js deleted file mode 100644 index 609080e29..000000000 --- a/packages/scratch-blocks/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=../shim/blocks_compressed_horizontal,goog=../shim/blockly_compressed_horizontal.goog!exports-loader?Blockly!../msg/messages'); diff --git a/packages/scratch-blocks/shim/blocks_compressed_horizontal.js b/packages/scratch-blocks/shim/blocks_compressed_horizontal.js deleted file mode 100644 index 0c4272ae0..000000000 --- a/packages/scratch-blocks/shim/blocks_compressed_horizontal.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=./shim/blockly_compressed_horizontal-blocks_compressed!exports-loader?Blockly!../blocks_compressed_horizontal'); diff --git a/packages/scratch-blocks/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js b/packages/scratch-blocks/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js deleted file mode 100644 index 65449c83b..000000000 --- a/packages/scratch-blocks/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=../shim/blocks_compressed_vertical,goog=../shim/blockly_compressed_vertical.goog!exports-loader?Blockly!../msg/messages'); diff --git a/packages/scratch-blocks/shim/blocks_compressed_vertical.js b/packages/scratch-blocks/shim/blocks_compressed_vertical.js deleted file mode 100644 index 3368c09d0..000000000 --- a/packages/scratch-blocks/shim/blocks_compressed_vertical.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?goog=./shim/blockly_compressed_vertical.goog,Blockly=./shim/blockly_compressed_vertical-blocks_compressed!exports-loader?Blockly!../blocks_compressed_vertical'); diff --git a/packages/scratch-blocks/shim/gh-pages.js b/packages/scratch-blocks/shim/gh-pages.js deleted file mode 100644 index 36db4933d..000000000 --- a/packages/scratch-blocks/shim/gh-pages.js +++ /dev/null @@ -1 +0,0 @@ -// intentionally left empty diff --git a/packages/scratch-blocks/shim/horizontal.js b/packages/scratch-blocks/shim/horizontal.js deleted file mode 100644 index 9416cada6..000000000 --- a/packages/scratch-blocks/shim/horizontal.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=../shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages,goog=../shim/blockly_compressed_horizontal.goog!exports-loader?Blockly!../msg/scratch_msgs'); diff --git a/packages/scratch-blocks/shim/index.js b/packages/scratch-blocks/shim/index.js deleted file mode 100644 index cd27975de..000000000 --- a/packages/scratch-blocks/shim/index.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Webpack shim module - * - * Uses webpack imports-loader and exports-loader to provide the horizontal and - * vertical flavors of Blockly. All of the other files in this directory shim - * Blockly and goog between blockly_compressed_* and blocks_compressed*. - * - * Horizontal and Vertical export Blockly out of - * blockly_compressed_[horizontal, vertical] + - * blocks_compressed + - * blocks_compressed_[horizontal, vertical] + - * msg/messages -**/ -module.exports = { - Horizontal: require('./horizontal'), - Vertical: require('./vertical') -}; diff --git a/packages/scratch-blocks/shim/vertical.js b/packages/scratch-blocks/shim/vertical.js deleted file mode 100644 index 7990fe5b6..000000000 --- a/packages/scratch-blocks/shim/vertical.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('imports-loader?Blockly=../shim/blocks_compressed_vertical-blockly_compressed_vertical-messages,goog=../shim/blockly_compressed_vertical.goog!exports-loader?Blockly!../msg/scratch_msgs'); diff --git a/packages/scratch-blocks/tests/blocks/index.html b/packages/scratch-blocks/tests/blocks/index.html deleted file mode 100644 index b528a85f5..000000000 --- a/packages/scratch-blocks/tests/blocks/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Unit Tests for Blockly Blocks - - - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/tests/blocks/logic_ternary_test.js b/packages/scratch-blocks/tests/blocks/logic_ternary_test.js deleted file mode 100644 index 0157c5eed..000000000 --- a/packages/scratch-blocks/tests/blocks/logic_ternary_test.js +++ /dev/null @@ -1,316 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function test_logic_ternary_structure() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - assertEquals(3, block.inputList && block.inputList.length); - assertEquals(1, block.getInput('IF').connection.check_.length); - assertEquals('Boolean', block.getInput('IF').connection.check_[0]); - assertTrue(!!block.onchangeWrapper_); // Has onchange handler - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachSameTypeCheckInThenAndElseWithoutParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - - var string1 = workspace.newBlock('text'); - var string2 = workspace.newBlock('text_charAt'); - - block.getInput('THEN').connection.connect(string1.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string1.getRootBlock()); - block.getInput('ELSE').connection.connect(string2.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string1.getRootBlock()); // Still connected. - assertEquals(block, string2.getRootBlock()); - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachDifferectTypeChecksInThenAndElseWithoutParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - - var string = workspace.newBlock('text'); - var number = workspace.newBlock('math_number'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); - block.getInput('ELSE').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); // Input THEN still connected. - assertEquals(block, number.getRootBlock()); - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachSameTypeCheckInThenAndElseWithMatchingParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var parent = workspace.newBlock('text_trim'); - - parent.getInput('TEXT').connection.connect(block.outputConnection); - assertEquals(parent, block.getRootBlock()); - - var string1 = workspace.newBlock('text'); - var string2 = workspace.newBlock('text_charAt'); - - block.getInput('THEN').connection.connect(string1.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string1.getRootBlock()); - block.getInput('ELSE').connection.connect(string2.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string1.getRootBlock()); // Input THEN still connected. - assertEquals(parent, string2.getRootBlock()); - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachDifferectTypeChecksInThenAndElseWithUncheckedParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var parent = workspace.newBlock('text_print'); - - parent.getInput('TEXT').connection.connect(block.outputConnection); - assertEquals(parent, block.parentBlock_); - - var string = workspace.newBlock('text'); - var number = workspace.newBlock('math_number'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string.getRootBlock()); - block.getInput('ELSE').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string.getRootBlock()); // Input THEN still connected. - assertEquals(parent, number.getRootBlock()); - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachDifferectTypeChecksInThenAndElseWithPermissiveParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var parent = workspace.newBlock('text_length'); // Allows String or Array - - parent.getInput('VALUE').connection.connect(block.outputConnection); - assertEquals(parent, block.parentBlock_); - - var string = workspace.newBlock('text'); - var array = workspace.newBlock('lists_create_empty'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string.getRootBlock()); - block.getInput('ELSE').connection.connect(array.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string.getRootBlock()); // Input THEN still connected. - assertEquals(parent, array.getRootBlock()); - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachMismatchTypeToThen_breakWithParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var parent = workspace.newBlock('text_length'); // Allows String or Array - - parent.getInput('VALUE').connection.connect(block.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.parentBlock_); - - var string = workspace.newBlock('text'); - var number = workspace.newBlock('math_number'); - - block.getInput('ELSE').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string.getRootBlock()); - - // Adding mismatching number. - block.getInput('THEN').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, block.getRootBlock()); // Disconnected from parent. - assertEquals(block, number.getRootBlock()); - assertEquals(block, string.getRootBlock()); // ELSE string still connected. - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachMismatchTypeToElse_breakWithParent() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var parent = workspace.newBlock('text_length'); // Allows String or Array - - parent.getInput('VALUE').connection.connect(block.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.parentBlock_); - - var string = workspace.newBlock('text'); - var number = workspace.newBlock('math_number'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Still connected to parent. - assertEquals(parent, string.getRootBlock()); - - // Adding mismatching number. - block.getInput('ELSE').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, block.getRootBlock()); // Disconnected from parent. - assertEquals(block, number.getRootBlock()); - assertEquals(block, string.getRootBlock()); // THEN string still connected. - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachToUncheckedParentWithDifferentTypes() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var string = workspace.newBlock('text'); - var number = workspace.newBlock('math_number'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); - block.getInput('ELSE').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); // Input THEN still connected. - assertEquals(block, number.getRootBlock()); - - // Attaching to parent. - var parent = workspace.newBlock('text_print'); - parent.getInput('TEXT').connection.connect(block.outputConnection); - assertEquals(parent, block.getRootBlock()); - assertEquals(parent, string.getRootBlock()); // Input THEN still connected. - assertEquals(parent, number.getRootBlock()); // Input ELSE still connected. - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachToPermissiveParentWithDifferentTypes() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var string = workspace.newBlock('text'); - var array = workspace.newBlock('lists_create_empty'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); - block.getInput('ELSE').connection.connect(array.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); // Input THEN still connected. - assertEquals(block, array.getRootBlock()); - - // Attaching to parent. - var parent = workspace.newBlock('text_print'); - parent.getInput('TEXT').connection.connect(block.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); - assertEquals(parent, string.getRootBlock()); // Input THEN still connected. - assertEquals(parent, array.getRootBlock()); // Input ELSE still connected. - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachToParentWithMismatchingThen_disconnectThen() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var number = workspace.newBlock('math_number'); - var string = workspace.newBlock('text'); - - block.getInput('THEN').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, number.getRootBlock()); - block.getInput('ELSE').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, number.getRootBlock()); // Input THEN still connected. - assertEquals(block, string.getRootBlock()); - - // Attaching to parent. - var parent = workspace.newBlock('text_trim'); - parent.getInput('TEXT').connection.connect(block.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Successful connection to parent. - assertEquals(parent, string.getRootBlock()); // Input ELSE still connected. - assertEquals(number, number.getRootBlock()); // Input THEN disconnected. - } finally { - workspace.dispose(); - } -} - -function test_logic_ternary_attachToParentWithMismatchingElse_disconnectElse() { - var workspace = new Blockly.Workspace(); - try { - var block = workspace.newBlock('logic_ternary'); - var string = workspace.newBlock('text'); - var number = workspace.newBlock('math_number'); - - block.getInput('THEN').connection.connect(string.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); - block.getInput('ELSE').connection.connect(number.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(block, string.getRootBlock()); // Input THEN still connected. - assertEquals(block, number.getRootBlock()); - - // Attaching to parent. - var parent = workspace.newBlock('text_trim'); - parent.getInput('TEXT').connection.connect(block.outputConnection); - Blockly.Events.fireNow_(); // Force synchronous onchange() call. - assertEquals(parent, block.getRootBlock()); // Successful connection to parent. - assertEquals(parent, string.getRootBlock()); // Input THEN still connected. - assertEquals(number, number.getRootBlock()); // Input ELSE disconnected. - } finally { - workspace.dispose(); - } -} diff --git a/packages/scratch-blocks/tests/custom_procedure_playground.html b/packages/scratch-blocks/tests/custom_procedure_playground.html deleted file mode 100644 index 3e89fef6f..000000000 --- a/packages/scratch-blocks/tests/custom_procedure_playground.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - Custom Procedure Playground - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - - - - -
- - - - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/tests/horizontal_playground.html b/packages/scratch-blocks/tests/horizontal_playground.html deleted file mode 100644 index 056860626..000000000 --- a/packages/scratch-blocks/tests/horizontal_playground.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - Horizontal Playground - - - - - - - - - - - - - - - -
-
- - -

Horizontal Blocks

-

- Show - - Hide -

- -
- - - -
- -

- -   - -
- -

- -

- Log events:   - -

- -

- Log flyout events:   - -

- -

- Enable sounds (after refresh):   - -

- -

- Stress test:   - - - -

- -

- Glows:   - - - - -

- -

- - -

- - diff --git a/packages/scratch-blocks/tests/jsunit/block_test.js b/packages/scratch-blocks/tests/jsunit/block_test.js deleted file mode 100644 index bb7940690..000000000 --- a/packages/scratch-blocks/tests/jsunit/block_test.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function test_appendField_FieldIconMenu() { - var workspace = new Blockly.Workspace(); - var block_name = 'test_jsonInit_FieldIconMenu'; - var field_name = 'TEST_FIELD'; - var dropdown_options = [{ - value: 'VALUE' - }]; - - Blockly.Blocks[block_name] = { - init: function() { - this.appendDummyInput() - .appendField(new Blockly.FieldIconMenu(dropdown_options), - field_name); - this.setOutput(true); - } - }; - - var block = workspace.newBlock(block_name); - assertTrue('IconMenu field not added to block by appendField', - block.getField(field_name) instanceof Blockly.FieldIconMenu); -} - -function test_jsonInit_FieldIconMenu() { - var workspace = new Blockly.Workspace(); - var block_name = 'test_jsonInit_FieldIconMenu'; - var field_name = 'TEST_FIELD'; - var dropdown_options = [{ - value: 'VALUE' - }]; - - Blockly.Blocks[block_name] = { - init: function() { - this.jsonInit({ - message0: '%1', - args0: [{ - type: 'field_iconmenu', - name: field_name, - options: dropdown_options - }], - output: null - }); - } - }; - - var block = workspace.newBlock(block_name); - assertTrue('IconMenu field not added to block by jsonInit', - block.getField(field_name) instanceof Blockly.FieldIconMenu); -} diff --git a/packages/scratch-blocks/tests/jsunit/connection_db_test.js b/packages/scratch-blocks/tests/jsunit/connection_db_test.js deleted file mode 100644 index b7e087558..000000000 --- a/packages/scratch-blocks/tests/jsunit/connection_db_test.js +++ /dev/null @@ -1,310 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2015 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function verify_DB_(msg, expected, db) { - var equal = (expected.length == db.connections_.length); - if (equal) { - for (var i = 0; i < expected.length; i++) { - if (expected[i] != db.connections_[i]) { - equal = false; - break; - } - } - } - if (equal) { - assertTrue(msg, true); - } else { - assertEquals(msg, expected, db.connections_); - } -} - -function test_DB_addConnection() { - var db = new Blockly.ConnectionDB(); - var o2 = {y_: 2, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - db.addConnection(o2); - verify_DB_('Adding connection #2', [o2], db); - - var o4 = {y_: 4, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - db.addConnection(o4); - verify_DB_('Adding connection #4', [o2, o4], db); - - var o1 = {y_: 1, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - db.addConnection(o1); - verify_DB_('Adding connection #1', [o1, o2, o4], db); - - var o3a = {y_: 3, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - db.addConnection(o3a); - verify_DB_('Adding connection #3a', [o1, o2, o3a, o4], db); - - var o3b = {y_: 3, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - db.addConnection(o3b); - verify_DB_('Adding connection #3b', [o1, o2, o3b, o3a, o4], db); -} - -function test_DB_removeConnection() { - var db = new Blockly.ConnectionDB(); - var o1 = {y_: 1, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - var o2 = {y_: 2, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - var o3a = {y_: 3, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - var o3b = {y_: 3, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - var o3c = {y_: 3, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - var o4 = {y_: 4, sourceBlock_: {}, - getSourceBlock: Blockly.Connection.prototype.getSourceBlock}; - db.addConnection(o1); - db.addConnection(o2); - db.addConnection(o3c); - db.addConnection(o3b); - db.addConnection(o3a); - db.addConnection(o4); - verify_DB_('Adding connections 1-4', [o1, o2, o3a, o3b, o3c, o4], db); - - db.removeConnection_(o2); - verify_DB_('Removing connection #2', [o1, o3a, o3b, o3c, o4], db); - - db.removeConnection_(o4); - verify_DB_('Removing connection #4', [o1, o3a, o3b, o3c], db); - - db.removeConnection_(o1); - verify_DB_('Removing connection #1', [o3a, o3b, o3c], db); - - db.removeConnection_(o3a); - verify_DB_('Removing connection #3a', [o3b, o3c], db); - - db.removeConnection_(o3c); - verify_DB_('Removing connection #3c', [o3b], db); - - db.removeConnection_(o3b); - verify_DB_('Removing connection #3b', [], db); -} - -function test_DB_getNeighbours() { - var db = new Blockly.ConnectionDB(); - - // Search an empty list. - assertEquals(helper_getNeighbours(db, - 10 /* x */, 10 /* y */, 100 /* radius */).length, 0); - - // Set up some connections. - for (var i = 0; i < 10; i++) { - db.addConnection(helper_createConnection(0, i, - Blockly.PREVIOUS_STATEMENT, null, true)); - } - - // Test block belongs at beginning. - var result = helper_getNeighbours(db, 0, 0, 4); - assertEquals(5, result.length); - for (i = 0; i < result.length; i++) { - assertNotEquals(result.indexOf(db.connections_[i]), -1); // contains - } - - // Test block belongs at middle. - result = helper_getNeighbours(db, 0, 4, 2); - assertEquals(5, result.length); - for (i = 0; i < result.length; i++) { - assertNotEquals(result.indexOf(db.connections_[i + 2]), -1); // contains - } - - // Test block belongs at end. - result = helper_getNeighbours(db, 0, 9, 4); - assertEquals(5, result.length); - for (i = 0; i < result.length; i++) { - assertNotEquals(result.indexOf(db.connections_[i + 5]), -1); // contains - } - - // Test block has no neighbours due to being out of range in the x direction. - result = helper_getNeighbours(db, 10, 9, 4); - assertEquals(result.length, 0); - - // Test block has no neighbours due to being out of range in the y direction. - result = helper_getNeighbours(db, 0, 19, 4); - assertEquals(result.length, 0); - - // Test block has no neighbours due to being out of range diagonally. - result = helper_getNeighbours(db, -2, -2, 2); - assertEquals(result.length, 0); -} - -function test_DB_findPositionForConnection() { - var db = new Blockly.ConnectionDB(); - db.addConnection(helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT, - null, true)); - db.addConnection(helper_createConnection(0, 1, Blockly.PREVIOUS_STATEMENT, - null, true)); - db.addConnection(helper_createConnection(0, 2, Blockly.PREVIOUS_STATEMENT, - null, true)); - db.addConnection(helper_createConnection(0, 4, Blockly.PREVIOUS_STATEMENT, - null, true)); - db.addConnection(helper_createConnection(0, 5, Blockly.PREVIOUS_STATEMENT, - null, true)); - - assertEquals(5, db.connections_.length); - var conn = helper_createConnection(0, 3, Blockly.PREVIOUS_STATEMENT, null, - true); - assertEquals(3, db.findPositionForConnection_(conn)); -} - -function test_DB_findConnection() { - var db = new Blockly.ConnectionDB(); - for (var i = 0; i < 10; i++) { - db.addConnection(helper_createConnection(i, 0, - Blockly.PREVIOUS_STATEMENT, null, true)); - db.addConnection(helper_createConnection(0, i, - Blockly.PREVIOUS_STATEMENT, null, true)); - } - - var conn = helper_createConnection(3, 3, Blockly.PREVIOUS_STATEMENT, null, - true); - db.addConnection(conn); - assertEquals(conn, db.connections_[db.findConnection(conn)]); - - conn = helper_createConnection(3, 3, Blockly.PREVIOUS_STATEMENT, null, true); - assertEquals(-1, db.findConnection(conn)); -} - -function test_DB_ordering() { - var db = new Blockly.ConnectionDB(); - for (var i = 0; i < 10; i++) { - db.addConnection(helper_createConnection(0, 9 - i, - Blockly.PREVIOUS_STATEMENT), null, true); - } - - for (i = 0; i < 10; i++) { - assertEquals(i, db.connections_[i].y_); - } - - // quasi-random - var xCoords = [-29, -47, -77, 2, 43, 34, -59, -52, -90, -36, -91, 38, 87, -20, - 60, 4, -57, 65, -37, -81, 57, 58, -96, 1, 67, -79, 34, 93, -90, -99, -62, - 4, 11, -36, -51, -72, 3, -50, -24, -45, -92, -38, 37, 24, -47, -73, 79, - -20, 99, 43, -10, -87, 19, 35, -62, -36, 49, 86, -24, -47, -89, 33, -44, - 25, -73, -91, 85, 6, 0, 89, -94, 36, -35, 84, -9, 96, -21, 52, 10, -95, 7, - -67, -70, 62, 9, -40, -95, -9, -94, 55, 57, -96, 55, 8, -48, -57, -87, 81, - 23, 65]; - var yCoords = [-81, 82, 5, 47, 30, 57, -12, 28, 38, 92, -25, -20, 23, -51, 73, - -90, 8, 28, -51, -15, 81, -60, -6, -16, 77, -62, -42, -24, 35, 95, -46, - -7, 61, -16, 14, 91, 57, -38, 27, -39, 92, 47, -98, 11, -33, -72, 64, 38, - -64, -88, -35, -59, -76, -94, 45, -25, -100, -95, 63, -97, 45, 98, 99, 34, - 27, 52, -18, -45, 66, -32, -38, 70, -73, -23, 5, -2, -13, -9, 48, 74, -97, - -11, 35, -79, -16, -77, 83, -57, -53, 35, -44, 100, -27, -15, 5, 39, 33, - -19, -20, -95]; - for (i = 0; i < xCoords.length; i++) { - db.addConnection(helper_createConnection(xCoords[i], yCoords[i], - Blockly.PREVIOUS_STATEMENT), null, true); - } - - for (i = 1; i < xCoords.length; i++) { - assertTrue(db.connections_[i].y_ >= db.connections_[i - 1].y_); - } -} - -function test_SearchForClosest() { - var db = new Blockly.ConnectionDB(); - var sharedWorkspace = {id: "Shared workspace"}; - - // Search an empty list. - assertEquals(null, helper_searchDB(db, 10 /* x */, 10 /* y */, - 100 /* radius */)); - - db.addConnection(helper_createConnection(100, 0, Blockly.PREVIOUS_STATEMENT, - sharedWorkspace, true)); - assertEquals(null, helper_searchDB(db, 0, 0, 5, sharedWorkspace)); - - db = new Blockly.ConnectionDB(); - for (var i = 0; i < 10; i++) { - var tempConn = helper_createConnection(0, i, Blockly.PREVIOUS_STATEMENT, - sharedWorkspace, true); - tempConn.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - db.addConnection(tempConn); - } - - // Should be at 0, 9. - var last = db.connections_[db.connections_.length - 1]; - // Correct connection is last in db; many connections in radius. - assertEquals(last, helper_searchDB(db, 0, 10, 15, sharedWorkspace)); - // Nothing nearby. - assertEquals(null, helper_searchDB(db, 100, 100, 3, sharedWorkspace)); - // First in db, exact match. - assertEquals(db.connections_[0], helper_searchDB(db, 0, 0, 0, sharedWorkspace)); - - tempConn = helper_createConnection(6, 6, Blockly.PREVIOUS_STATEMENT, - sharedWorkspace, true); - tempConn.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - db.addConnection(tempConn); - tempConn = helper_createConnection(5, 5, Blockly.PREVIOUS_STATEMENT, - sharedWorkspace, true); - tempConn.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - db.addConnection(tempConn); - - var result = helper_searchDB(db, 4, 6, 3, sharedWorkspace); - assertEquals(5, result.x_); - assertEquals(5, result.y_); -} - - -function helper_getNeighbours(db, x, y, radius) { - return db.getNeighbours(helper_createConnection(x, y, Blockly.NEXT_STATEMENT, - null, true), - radius); -} - -function helper_searchDB(db, x, y, radius, shared_workspace) { - var tempConn = helper_createConnection(x, y, - Blockly.NEXT_STATEMENT, shared_workspace, true); - tempConn.sourceBlock_ = helper_makeSourceBlock(shared_workspace); - tempConn.sourceBlock_.nextConnection = tempConn; - var closest = db.searchForClosest(tempConn, radius, {x: 0, y: 0}); - return closest.connection; -} - -function helper_makeSourceBlock(sharedWorkspace) { - return {workspace: sharedWorkspace, - parentBlock_: null, - getParent: function() { return null; }, - movable_: true, - isMovable: function() { return true; }, - isShadow: function() { return false; }, - isInsertionMarker: function() { return false; }, - getFirstStatementConnection: function() { return null; } - }; -} - -function helper_createConnection(x, y, type, opt_shared_workspace, - opt_rendered) { - var workspace = opt_shared_workspace ? opt_shared_workspace : {}; - if (opt_rendered) { - var conn = new Blockly.RenderedConnection({workspace: workspace}, type); - } else { - var conn = new Blockly.Connection({workspace: workspace}, type); - } - conn.x_ = x; - conn.y_ = y; - return conn; -} diff --git a/packages/scratch-blocks/tests/jsunit/connection_test.js b/packages/scratch-blocks/tests/jsunit/connection_test.js deleted file mode 100644 index 480817da0..000000000 --- a/packages/scratch-blocks/tests/jsunit/connection_test.js +++ /dev/null @@ -1,404 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Tests for connection logic. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -var input; -var output; -var previous; -var next; - -var dummyWorkspace; - -function connectionTest_setUp() { - dummyWorkspace = {}; - function createDummyBlock() { - return { - workspace: dummyWorkspace, - isShadow: function() {return false;} - }; - } - input = new Blockly.Connection(createDummyBlock(), - Blockly.INPUT_VALUE); - output = new Blockly.Connection(createDummyBlock(), - Blockly.OUTPUT_VALUE); - previous = new Blockly.Connection(createDummyBlock(), - Blockly.PREVIOUS_STATEMENT); - next = new Blockly.Connection(createDummyBlock(), - Blockly.NEXT_STATEMENT); -} - -function connectionTest_tearDown() { - input = null; - output = null; - previous = null; - next = null; - dummyWorkspace = null; -} - -var isMovableFn = function() { return true; }; -/** - * These tests check that the reasons for failures to connect are consistent - * (internal view of error states). - */ -function testCanConnectWithReason_TargetNull() { - connectionTest_setUp(); - - assertEquals(Blockly.Connection.REASON_TARGET_NULL, - input.canConnectWithReason_(null)); - - connectionTest_tearDown(); -} - -function testCanConnectWithReason_Disconnect() { - connectionTest_setUp(); - - var tempConnection = new Blockly.Connection({workspace: dummyWorkspace, isMovable: isMovableFn}, - Blockly.OUTPUT_VALUE); - Blockly.Connection.connectReciprocally_(input, tempConnection); - assertEquals(Blockly.Connection.CAN_CONNECT, - input.canConnectWithReason_(output)); - - connectionTest_tearDown(); -} - -function testCanConnectWithReason_DifferentWorkspaces() { - connectionTest_setUp(); - - input = new Blockly.Connection({workspace: {}}, Blockly.INPUT_VALUE); - output = new Blockly.Connection({workspace: dummyWorkspace}, - Blockly.OUTPUT_VALUE); - - assertEquals(Blockly.Connection.REASON_DIFFERENT_WORKSPACES, - input.canConnectWithReason_(output)); - - connectionTest_tearDown(); -} - - -function testCanConnectWithReason_Self() { - connectionTest_setUp(); - - var block = {type_: "test block"}; - input.sourceBlock_ = block; - assertEquals(Blockly.Connection.REASON_SELF_CONNECTION, - input.canConnectWithReason_(input)); - - connectionTest_tearDown(); -} - -function testCanConnectWithReason_Type() { - connectionTest_setUp(); - - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - input.canConnectWithReason_(previous)); - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - input.canConnectWithReason_(next)); - - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - output.canConnectWithReason_(previous)); - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - output.canConnectWithReason_(next)); - - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - previous.canConnectWithReason_(input)); - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - previous.canConnectWithReason_(output)); - - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - next.canConnectWithReason_(input)); - assertEquals(Blockly.Connection.REASON_WRONG_TYPE, - next.canConnectWithReason_(output)); - - connectionTest_tearDown(); -} - -function testCanConnectWithReason_CanConnect() { - connectionTest_setUp(); - - assertEquals(Blockly.Connection.CAN_CONNECT, - previous.canConnectWithReason_(next)); - assertEquals(Blockly.Connection.CAN_CONNECT, - next.canConnectWithReason_(previous)); - assertEquals(Blockly.Connection.CAN_CONNECT, - input.canConnectWithReason_(output)); - assertEquals(Blockly.Connection.CAN_CONNECT, - output.canConnectWithReason_(input)); - - connectionTest_tearDown(); -} - -/** - * The next set of tests checks that exceptions are being thrown at the correct - * times (external view of errors). - */ -function testCheckConnection_Self() { - connectionTest_setUp(); - var block = {type_: "test block"}; - input.sourceBlock_ = block; - try { - input.checkConnection_(input); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypeInputPrev() { - connectionTest_setUp(); - try { - input.checkConnection_(previous); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypeInputNext() { - connectionTest_setUp(); - try { - input.checkConnection_(next); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypeOutputPrev() { - connectionTest_setUp(); - try { - output.checkConnection_(previous); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypePrevInput() { - connectionTest_setUp(); - try { - previous.checkConnection_(input); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypePrevOutput() { - connectionTest_setUp(); - try { - previous.checkConnection_(output); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypeNextInput() { - connectionTest_setUp(); - try { - next.checkConnection_(input); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function testCheckConnection_TypeNextOutput() { - connectionTest_setUp(); - try { - next.checkConnection_(output); - fail(); - } catch (e) { - // expected - } - - connectionTest_tearDown(); -} - -function test_isConnectionAllowed_Distance() { - var sharedWorkspace = {}; - // Two connections of opposite types near each other. - var one = helper_createConnection(5 /* x */, 10 /* y */, - Blockly.INPUT_VALUE, null, true); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - - var two = helper_createConnection(10 /* x */, 15 /* y */, - Blockly.OUTPUT_VALUE, null, true); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - - assertTrue(two.isConnectionAllowed(one, 20.0)); - // Move connections farther apart. - two.x_ = 100; - two.y_ = 100; - assertFalse(two.isConnectionAllowed(one, 20.0)); -} - -function test_isConnectionAllowed_Unrendered() { - var sharedWorkspace = {}; - - var one = helper_createConnection(5 /* x */, 10 /* y */, - Blockly.INPUT_VALUE); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - - // Don't offer to connect a left (male) value plug to - // an available right (female) value plug. - // Unlike in Blockly, you can't do this even if the left value plug isn't - // already connected. - var two = helper_createConnection(0, 0, Blockly.OUTPUT_VALUE); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - - assertFalse(one.isConnectionAllowed(two)); - var three = helper_createConnection(0, 0, Blockly.INPUT_VALUE); - three.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - - Blockly.Connection.connectReciprocally_(two, three); - assertFalse(one.isConnectionAllowed(two)); - - // Don't connect two connections on the same block. - two.sourceBlock_ = one.sourceBlock_; - assertFalse(one.isConnectionAllowed(two)); -} - -function test_isConnectionAllowed_NoNext() { - var sharedWorkspace = {}; - var one = helper_createConnection(0, 0, Blockly.NEXT_STATEMENT); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - one.sourceBlock_.nextConnection = one; - - var two = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - two.sourceBlock_.previousConnection = two; - - assertTrue(two.isConnectionAllowed(one)); - - var three = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); - three.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - three.sourceBlock_.previousConnection = three; - Blockly.Connection.connectReciprocally_(one, three); - - // A terminal block is allowed to replace another terminal block. - assertTrue(two.isConnectionAllowed(one)); -} - -function test_isConnectionAllowed_InsertionMarker() { - var sharedWorkspace = {}; - // Two connections of opposite types near each other. - var one = helper_createConnection(5 /* x */, 10 /* y */, - Blockly.INPUT_VALUE); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - - // The second one is an insertion marker. - var two = helper_createConnection(10 /* x */, 15 /* y */, - Blockly.OUTPUT_VALUE); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - two.sourceBlock_.isInsertionMarker = function() { - return true; - }; - - assertFalse(one.isConnectionAllowed(two, 20.0)); -} - -function testCheckConnection_Okay() { - connectionTest_setUp(); - previous.checkConnection_(next); - next.checkConnection_(previous); - input.checkConnection_(output); - output.checkConnection_(input); - - connectionTest_tearDown(); -} - -function test_canConnectWithReason_Procedures_WrongBlockType() { - var sharedWorkspace = {}; - var one = helper_createConnection(0, 0, Blockly.NEXT_STATEMENT); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - one.sourceBlock_.type = Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE; - // Make one be the connection on its source block's input. - one.sourceBlock_.getInput = function() { - return { - connection: one - }; - }; - - var two = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - // Fail because two's source block is the wrong type. - two.sourceBlock_.type = 'wrong_type'; - assertEquals(Blockly.Connection.REASON_CUSTOM_PROCEDURE, - one.canConnectWithReason_(two)); -} - -function test_canConnectWithReason_Procedures_Pass() { - var sharedWorkspace = {}; - var one = helper_createConnection(0, 0, Blockly.NEXT_STATEMENT); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - one.sourceBlock_.type = Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE; - // Make one be the connection on its source block's input. - one.sourceBlock_.getInput = function() { - return { - connection: one - }; - }; - var two = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - two.sourceBlock_.type = Blockly.PROCEDURES_PROTOTYPE_BLOCK_TYPE; - assertEquals(Blockly.Connection.CAN_CONNECT, - one.canConnectWithReason_(two)); -} - -function test_canConnectWithReason_Procedures_NextConnection() { - var sharedWorkspace = {}; - var one = helper_createConnection(0, 0, Blockly.NEXT_STATEMENT); - one.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - one.sourceBlock_.type = Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE; - // One is the next connection, not an input connection - one.sourceBlock_.nextConnection = one; - one.sourceBlock_.getInput = function() { - return { - connection: null - }; - }; - var two = helper_createConnection(0, 0, Blockly.PREVIOUS_STATEMENT); - two.sourceBlock_ = helper_makeSourceBlock(sharedWorkspace); - // It should be okay, even if two's source block has the wrong type, because - // it's not trying to connect to the input. - two.sourceBlock_.type = 'wrong_type'; - assertEquals(Blockly.Connection.CAN_CONNECT, - one.canConnectWithReason_(two)); -} diff --git a/packages/scratch-blocks/tests/jsunit/db_test.js b/packages/scratch-blocks/tests/jsunit/db_test.js deleted file mode 100644 index 45fc62a4b..000000000 --- a/packages/scratch-blocks/tests/jsunit/db_test.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function test_DB_getNeighbours() { - var db = new Blockly.ConnectionDB(); - - // Search an empty list. - assertEquals(helper_getNeighbours(db, 10 /* x */, 10 /* y */, 100 /* radius */).length, 0); - - // Set up some connections. - for (var i = 0; i < 10; i++) { - db.addConnection_(helper_createConnection(0, i, Blockly.PREVIOUS_STATEMENT)); - } - - // Test block belongs at beginning - var result = helper_getNeighbours(db, 0, 0, 4); - assertEquals(5, result.length); - for (i = 0; i < result.length; i++) { - assertNotEquals(result.indexOf(db[i]), -1); // contains - } - - // Test block belongs at middle - result = helper_getNeighbours(db, 0, 4, 2); - assertEquals(5, result.length); - for (i = 0; i < result.length; i++) { - assertNotEquals(result.indexOf(db[i + 2]), -1); // contains - } - - // Test block belongs at end - result = helper_getNeighbours(db, 0, 9, 4); - assertEquals(5, result.length); - for (i = 0; i < result.length; i++) { - assertNotEquals(result.indexOf(db[i + 5]), -1); // contains - } - - // Test block has no neighbours due to being out of range in the x direction - result = helper_getNeighbours(db, 10, 9, 4); - assertEquals(result.length, 0); - - // Test block has no neighbours due to being out of range in the y direction - result = helper_getNeighbours(db, 0, 19, 4); - assertEquals(result.length, 0); - - // Test block has no neighbours due to being out of range diagonally - result = helper_getNeighbours(db, -2, -2, 2); - assertEquals(result.length, 0); -} - -function helper_getNeighbours(db, x, y, radius) { - return db.getNeighbours(helper_createConnection(x, y, Blockly.NEXT_STATEMENT), radius); -} - -function helper_createConnection(x, y, type) { - var conn = new Blockly.Connection({workspace: {}}, type); - conn.x_ = x; - conn.y_ = y; - return conn; -} \ No newline at end of file diff --git a/packages/scratch-blocks/tests/jsunit/event_test.js b/packages/scratch-blocks/tests/jsunit/event_test.js deleted file mode 100644 index 883c8ef25..000000000 --- a/packages/scratch-blocks/tests/jsunit/event_test.js +++ /dev/null @@ -1,560 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.Events - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -var mockControl_; -var workspace; - -function eventTest_setUp() { - workspace = new Blockly.Workspace(); - mockControl_ = new goog.testing.MockControl(); -} - -function eventTest_setUpWithMockBlocks() { - eventTest_setUp(); - // TODO: Replace with defineGetVarBlock(); - Blockly.defineBlocksWithJsonArray([{ - 'type': 'field_variable_test_block', - 'message0': '%1', - 'args0': [ - { - 'type': 'field_variable', - 'name': 'VAR', - 'variable': 'item' - } - ], - }, - { - 'type': 'simple_test_block', - 'message0': 'simple test block' - }]); -} - -function eventTest_tearDown() { - delete Blockly.Blocks['field_variable_test_block']; - delete Blockly.Blocks['simple_test_block']; - mockControl_.$tearDown(); - workspace.dispose(); -} - -function eventTest_tearDownWithMockBlocks() { - eventTest_tearDown(); - delete Blockly.Blocks.field_variable_test_block; -} - -function test_block_base_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, '1'); - try { - var block = createSimpleTestBlock(workspace); - - // Here's the event we care about. - var event = new Blockly.Events.BlockBase(block); - assertUndefined(event.varId); - checkExactEventValues(event, {'blockId': '1', 'workspaceId': workspace.id, - 'group': '', 'recordUndo': true}); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_var_base_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, '1'); - try { - var variable = workspace.createVariable('name1', 'type1', 'id1'); - - var event = new Blockly.Events.VarBase(variable); - assertUndefined(event.blockId); - checkExactEventValues(event, {'varId': 'id1', - 'workspaceId': workspace.id, 'group': '', 'recordUndo': true}); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_abstract_constructor() { - eventTest_setUpWithMockBlocks(); - try { - var event = new Blockly.Events.Abstract(); - assertUndefined(event.blockId); - assertUndefined(event.workspaceId); - assertUndefined(event.varId); - checkExactEventValues(event, {'group': '', 'recordUndo': true}); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -// Test util -function checkCreateEventValues(event, block, ids, type) { - var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block)); - var result_xml = Blockly.Xml.domToText(event.xml); - assertEquals(expected_xml, result_xml); - isEqualArrays(ids, event.ids); - assertEquals(type, event.type); -} - -// Test util -function checkDeleteEventValues(event, block, ids, type) { - var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block)); - var result_xml = Blockly.Xml.domToText(event.oldXml); - assertEquals(expected_xml, result_xml); - isEqualArrays(ids, event.ids); - assertEquals(type, event.type); -} - -// Test util -function checkExactEventValues(event, values) { - var keys = Object.keys(values); - for (var i = 0, field; field = keys[i]; i++) { - assertEquals(values[field], event[field]); - } -} - -// Test util -function createSimpleTestBlock(workspace) { - // Disable events while constructing the block: this is a test of the - // Blockly.Event constructors, not the block constructor. - Blockly.Events.disable(); - var block = new Blockly.Block(workspace, 'simple_test_block'); - Blockly.Events.enable(); - return block; -} - -function test_create_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - var block = createSimpleTestBlock(workspace); - - var event = new Blockly.Events.Create(block); - checkCreateEventValues(event, block, ['1'], 'create'); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_blockCreate_constructor() { - // expect that blockCreate behaves the same as create. - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - var block = createSimpleTestBlock(workspace); - - var event = new Blockly.Events.BlockCreate(block); - checkCreateEventValues(event, block, ['1'], 'create'); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_delete_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - var block = createSimpleTestBlock(workspace); - var event = new Blockly.Events.Delete(block); - checkDeleteEventValues(event, block, ['1'], 'delete'); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_blockDelete_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - var block = createSimpleTestBlock(workspace); - var event = new Blockly.Events.BlockDelete(block); - checkDeleteEventValues(event, block, ['1'], 'delete'); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_change_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - Blockly.Events.disable(); - var block = new Blockly.Block(workspace, 'field_variable_test_block'); - Blockly.Events.enable(); - - var event = new Blockly.Events.Change(block, 'field', 'VAR', 'id1', 'id2'); - checkExactEventValues(event, {'element': 'field', 'name': 'VAR', - 'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'}); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_blockChange_constructor() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - Blockly.Events.disable(); - var block = new Blockly.Block(workspace, 'field_variable_test_block'); - Blockly.Events.enable(); - - var event = new Blockly.Events.BlockChange(block, 'field', 'VAR', 'id1', - 'id2'); - checkExactEventValues(event, {'element': 'field', 'name': 'VAR', - 'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'}); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_move_constructorCoordinate() { - // Expect the oldCoordinate to be set. - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '2']); - try { - var block1 = createSimpleTestBlock(workspace); - var coordinate = new goog.math.Coordinate(3,4); - block1.xy_ = coordinate; - - var event = new Blockly.Events.Move(block1); - // Need to check for individual equality of the coordinate values since - // the move event creates a new goog.math.Coordinate object - assertEquals(event.oldCoordinate.x, coordinate.x); - assertEquals(event.oldCoordinate.y, coordinate.y); - assertEquals(event.type, 'move'); - - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_move_constructoroldParentId() { - // Expect the oldParentId to be set but not the oldCoordinate to be set. - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '2']); - try { - var block1 = createSimpleTestBlock(workspace); - var block2 = createSimpleTestBlock(workspace); - block1.parentBlock_ = block2; - block1.xy_ = new goog.math.Coordinate(3,4); - - var event = new Blockly.Events.Move(block1); - checkExactEventValues(event, {'oldCoordinate': undefined, - 'oldParentId': '2', 'type': 'move'}); - block1.parentBlock_ = null; - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_blockMove_constructorCoordinate() { - // Expect the oldCoordinate to be set. - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '2']); - try { - var block1 = createSimpleTestBlock(workspace); - var coordinate = new goog.math.Coordinate(3,4); - block1.xy_ = coordinate; - - var event = new Blockly.Events.BlockMove(block1); - // Need to check for individual equality of the coordinate values since - // the move event creates a new goog.math.Coordinate object - assertEquals(event.oldCoordinate.x, coordinate.x); - assertEquals(event.oldCoordinate.y, coordinate.y); - assertEquals(event.type, 'move'); - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_blockMove_constructoroldParentId() { - // Expect the oldParentId to be set but not the oldCoordinate to be set. - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '2']); - try { - var block1 = createSimpleTestBlock(workspace); - var block2 = createSimpleTestBlock(workspace); - block1.parentBlock_ = block2; - block1.xy_ = new goog.math.Coordinate(3,4); - - var event = new Blockly.Events.BlockMove(block1); - checkExactEventValues(event, {'oldCoordinate': undefined, - 'oldParentId': '2', 'type': 'move'}); - block1.parentBlock_ = null; - } finally { - eventTest_tearDownWithMockBlocks(); - } -} - -function test_uiEvent_constructor_null() { - try { - Blockly.Events.setGroup('testGroup'); - var event = new Blockly.Events.Ui(null, 'foo', 'bar', 'baz'); - checkExactEventValues(event, - { - 'blockId': null, - 'workspaceId': null, - 'type': 'ui', - 'oldValue': 'bar', - 'newValue': 'baz', - 'element': 'foo', - 'recordUndo': false, - 'group': 'testGroup' - } - ); - } finally { - Blockly.Events.setGroup(false); - } -} - -function test_uiEvent_constructor_block() { - eventTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - try { - var block1 = createSimpleTestBlock(workspace); - Blockly.Events.setGroup('testGroup'); - var event = new Blockly.Events.Ui(block1, 'foo', 'bar', 'baz'); - checkExactEventValues(event, - { - 'blockId': '1', - 'workspaceId': workspace.id, - 'type': 'ui', - 'oldValue': 'bar', - 'newValue': 'baz', - 'element': 'foo', - 'recordUndo': false, - 'group': 'testGroup' - } - ); - } finally { - Blockly.Events.setGroup(false); - eventTest_tearDownWithMockBlocks(); - } -} - -function test_varCreate_constructor() { - eventTest_setUp(); - try { - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarCreate(variable); - checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1', - 'type': 'var_create'}); - } finally { - eventTest_tearDown(); - } -} - -function test_varCreate_toJson() { - eventTest_setUp(); - try { - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarCreate(variable); - var json = event.toJson(); - var expectedJson = ({type: "var_create", varId: "id1", varType: "type1", - varName: "name1", isLocal: false, isCloud: false}); - - assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); - - var localVariable = workspace.createVariable('name2', 'type2', 'id2', true); - var event2 = new Blockly.Events.VarCreate(localVariable); - var json2 = event2.toJson(); - var expectedJson2 = ({type: "var_create", varId: "id2", varType: "type2", - varName: "name2", isLocal: true, isCloud: false}); - - assertEquals(JSON.stringify(expectedJson2), JSON.stringify(json2)); - - var cloudVariable = workspace.createVariable('name3', 'type3', 'id3', false, true); - var event3 = new Blockly.Events.VarCreate(cloudVariable); - var json3 = event3.toJson(); - var expectedJson3 = ({type: "var_create", varId: "id3", varType: "type3", - varName: "name3", isLocal: false, isCloud: true}); - - assertEquals(JSON.stringify(expectedJson3), JSON.stringify(json3)); - - } finally { - eventTest_tearDown(); - } -} - -function test_varCreate_fromJson() { - eventTest_setUp(); - try { - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarCreate(variable); - var event2 = new Blockly.Events.VarCreate(null); - var json = event.toJson(); - event2.fromJson(json); - - assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); - } finally { - eventTest_tearDown(); - } -} - -function test_varCreate_runForward() { - eventTest_setUp(); - var json = {type: "var_create", varId: "id1", varType: "type1", - varName: "name1"}; - var event = Blockly.Events.fromJson(json, workspace); - assertNull(workspace.getVariableById('id1')); - event.run(true); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - eventTest_tearDown(); -} - -function test_varCreate_runBackwards() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarCreate(variable); - assertNotNull(workspace.getVariableById('id1')); - event.run(false); - assertNull(workspace.getVariableById('id1')); - eventTest_tearDown(); -} - -function test_varDelete_constructor() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarDelete(variable); - checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1', - 'varId':'id1', 'type': 'var_delete'}); - eventTest_tearDown(); -} - -function test_varDelete_toJson() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarDelete(variable); - var json = event.toJson(); - var expectedJson = ({type: "var_delete", varId: "id1", varType: "type1", - varName: "name1", isLocal: false, isCloud: false}); - - assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); - - var localVariable = workspace.createVariable('name2', 'type2', 'id2', true); - var event2 = new Blockly.Events.VarDelete(localVariable); - var json2 = event2.toJson(); - var expectedJson2 = ({type: "var_delete", varId: "id2", varType: "type2", - varName: "name2", isLocal: true, isCloud: false}); - - assertEquals(JSON.stringify(expectedJson2), JSON.stringify(json2)); - - var cloudVariable = workspace.createVariable('name3', 'type3', 'id3', false, true); - var event3 = new Blockly.Events.VarDelete(cloudVariable); - var json3 = event3.toJson(); - var expectedJson3 = ({type: "var_delete", varId: "id3", varType: "type3", - varName: "name3", isLocal: false, isCloud: true}); - - assertEquals(JSON.stringify(expectedJson2), JSON.stringify(json2)); - eventTest_tearDown(); -} - -function test_varDelete_fromJson() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarDelete(variable); - var event2 = new Blockly.Events.VarDelete(null); - var json = event.toJson(); - event2.fromJson(json); - - assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); - eventTest_tearDown(); -} - -function test_varDelete_runForwards() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarDelete(variable); - assertNotNull(workspace.getVariableById('id1')); - event.run(true); - assertNull(workspace.getVariableById('id1')); - eventTest_tearDown(); -} - -function test_varDelete_runBackwards() { - eventTest_setUp(); - var json = {type: "var_delete", varId: "id1", varType: "type1", - varName: "name1"}; - var event = Blockly.Events.fromJson(json, workspace); - assertNull(workspace.getVariableById('id1')); - event.run(false); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - eventTest_tearDown(); -} - -function test_varRename_constructor() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarRename(variable, 'name2'); - checkExactEventValues(event, {'varId': 'id1', 'oldName': 'name1', - 'newName': 'name2', 'type': 'var_rename'}); - eventTest_tearDown(); -} - -function test_varRename_toJson() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarRename(variable, 'name2'); - var json = event.toJson(); - var expectedJson = ({type: "var_rename", varId: "id1", oldName: "name1", - newName: "name2"}); - - assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); - eventTest_tearDown(); -} - -function test_varRename_fromJson() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarRename(variable, ''); - var event2 = new Blockly.Events.VarRename(null); - var json = event.toJson(); - event2.fromJson(json); - - assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); - eventTest_tearDown(); -} - -function test_varRename_runForward() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarRename(variable, 'name2'); - event.run(true); - assertNull(workspace.getVariable('name1')); - checkVariableValues(workspace, 'name2', 'type1', 'id1'); - eventTest_tearDown(); -} - -function test_varBackard_runForward() { - eventTest_setUp(); - var variable = workspace.createVariable('name1', 'type1', 'id1'); - var event = new Blockly.Events.VarRename(variable, 'name2'); - event.run(false); - assertNull(workspace.getVariable('name2')); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - eventTest_tearDown(); -} diff --git a/packages/scratch-blocks/tests/jsunit/extensions_test.js b/packages/scratch-blocks/tests/jsunit/extensions_test.js deleted file mode 100644 index c93f5cff1..000000000 --- a/packages/scratch-blocks/tests/jsunit/extensions_test.js +++ /dev/null @@ -1,659 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.Extensions - * @author Anm@anm.me (Andrew n marshall) - */ -'use strict'; - -function test_extension() { - var workspace = new Blockly.Workspace(); - var block; - try { - assertUndefined(Blockly.Extensions.ALL_['extensions_test']); - - var numCallsToBefore = 0; - var numCallsToAfter = 0; - - // Extension defined before the block type is defined. - Blockly.Extensions.register('extensions_test_before', function () { - numCallsToBefore++; - this.extendedWithBefore = true; - }); - - Blockly.defineBlocksWithJsonArray([{ - "type": "extension_test_block", - "message0": "extension_test_block", - "extensions": ["extensions_test_before", "extensions_test_after"] - }]); - - // Extension defined after the block type (but before instantiation). - Blockly.Extensions.register('extensions_test_after', function () { - numCallsToAfter++; - this.extendedWithAfter = true; - }); - - assert(goog.isFunction(Blockly.Extensions.ALL_['extensions_test_before'])); - assert(goog.isFunction(Blockly.Extensions.ALL_['extensions_test_after'])); - assertEquals(0, numCallsToBefore); - assertEquals(0, numCallsToAfter); - - block = new Blockly.Block(workspace, 'extension_test_block'); - - assertEquals(1, numCallsToBefore); - assertEquals(1, numCallsToAfter); - assert(block.extendedWithBefore); - assert(block.extendedWithAfter); - } finally { - block && block.dispose(); - workspace.dispose(); - - delete Blockly.Extensions.ALL_['extensions_test_before']; - delete Blockly.Extensions.ALL_['extensions_test_after']; - delete Blockly.Blocks['extension_test_block']; - } -} - -function test_extension_missing() { - var workspace = new Blockly.Workspace(); - var block; - var exceptionWasThrown = false; - try { - assertUndefined(Blockly.Extensions.ALL_['missing_extension']); - Blockly.defineBlocksWithJsonArray([{ - "type": "missing_extension_block", - "message0": "missing_extension_block", - "extensions": ["missing_extension"] - }]); - - block = new Blockly.Block(workspace, 'missing_extension_block'); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - block && block.dispose(); - workspace.dispose(); - delete Blockly.Blocks['missing_extension_block']; - } - assert(exceptionWasThrown); -} - -function test_extension_not_a_function() { - var exceptionWasThrown = false; - try { - assertUndefined(Blockly.Extensions.ALL_['extension_just_a_string']); - Blockly.Extensions.register('extension_just_a_string', 'extension_just_a_string'); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['extension_just_a_string']; - } - assert(exceptionWasThrown); - - var exceptionWasThrown = false; - try { - assertUndefined(Blockly.Extensions.ALL_['extension_is_null']); - Blockly.Extensions.register('extension_is_null', null); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['extension_is_null']; - } - assert(exceptionWasThrown); - - var exceptionWasThrown = false; - try { - assertUndefined(Blockly.Extensions.ALL_['extension_is_undefined']); - Blockly.Extensions.register('extension_is_undefined'); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['extension_is_undefined']; - } - assert(exceptionWasThrown); -} - -function test_parent_tooltip_when_inline() { - var defaultTooltip = "defaultTooltip"; - var parentTooltip = "parentTooltip"; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([ - { - "type": "test_parent_tooltip_when_inline", - "message0": "test_parent_tooltip_when_inline", - "output": true, - "tooltip": defaultTooltip, - "extensions": ["parent_tooltip_when_inline"] - }, - { - "type": "test_parent", - "message0": "%1", - "args0": [ - { - "type": "input_value", - "name": "INPUT" - } - ], - "tooltip": parentTooltip - } - ]); - - block = new Blockly.Block(workspace, 'test_parent_tooltip_when_inline'); - - // Tooltip is dynamic after extension initialization. - assert(goog.isFunction(block.tooltip)); - assertEquals(block.tooltip(), defaultTooltip); - - // Tooltip is normal before connected to parent. - var parent = new Blockly.Block(workspace, 'test_parent'); - // Inputs default to inline in scratch-blocks. - parent.setInputsInline(false); - assertEquals(parent.tooltip, parentTooltip); - assertFalse(!!parent.inputsInline); - - // Tooltip is normal when parent is not inline. - parent.getInput('INPUT').connection.connect(block.outputConnection); - assertEquals(block.getParent(), parent); - assertEquals(block.tooltip(), defaultTooltip); - - // Tooltip is parent's when parent is inline. - parent.setInputsInline(true); - assertEquals(block.tooltip(), parentTooltip); - - // Tooltip revert when disconnected. - parent.getInput('INPUT').connection.disconnect(); - assert(!block.getParent()); - assertEquals(block.tooltip(), defaultTooltip); - } finally { - block && block.dispose(); - workspace.dispose(); - - delete Blockly.Blocks['test_parent_tooltip_when_inline']; - delete Blockly.Blocks['test_parent']; - } -} - -function test_mixin_extension() { - var TEST_MIXIN = { - field: 'FIELD', - method: function() { - console.log('TEXT_MIXIN method()'); - } - }; - - var workspace = new Blockly.Workspace(); - var block; - try { - assertUndefined(Blockly.Extensions.ALL_['mixin_test']); - - // Extension defined before the block type is defined. - Blockly.Extensions.registerMixin('mixin_test', TEST_MIXIN); - assert(goog.isFunction(Blockly.Extensions.ALL_['mixin_test'])); - - Blockly.defineBlocksWithJsonArray([{ - "type": "test_block_mixin", - "message0": "test_block_mixin", - "extensions": ["mixin_test"] - }]); - - block = new Blockly.Block(workspace, 'test_block_mixin'); - - assertEquals(TEST_MIXIN.field, block.field); - assertEquals(TEST_MIXIN.method, block.method); - } finally { - block && block.dispose(); - workspace.dispose(); - - delete Blockly.Extensions.ALL_['mixin_test']; - delete Blockly.Blocks['test_block_mixin']; - } -} - -function test_bad_mixin_overwrites_local_value() { - var TEST_MIXIN_BAD_INPUTLIST = { - inputList: 'bad inputList' // Defined in constructor - }; - - var workspace = new Blockly.Workspace(); - var block; - try { - assertUndefined(Blockly.Extensions.ALL_['mixin_bad_inputList']); - - // Extension defined before the block type is defined. - Blockly.Extensions.registerMixin('mixin_bad_inputList', TEST_MIXIN_BAD_INPUTLIST); - assert(goog.isFunction(Blockly.Extensions.ALL_['mixin_bad_inputList'])); - - Blockly.defineBlocksWithJsonArray([{ - "type": "test_block_bad_inputList", - "message0": "test_block_bad_inputList", - "extensions": ["mixin_bad_inputList"] - }]); - - try { - block = new Blockly.Block(workspace, 'test_block_bad_inputList'); - } catch (e) { - // Expected Error - assert(e.message.indexOf('inputList') >= 0); // Reference the conflict - return; - } - fail('Expected error when constructing block'); - } finally { - block && block.dispose(); - workspace.dispose(); - - delete Blockly.Extensions.ALL_['mixin_bad_inputList']; - delete Blockly.Blocks['test_block_bad_inputList']; - } -} - -function test_bad_mixin_overwrites_prototype() { - var TEST_MIXIN_BAD_COLOUR = { - colour_: 'bad colour_' // Defined on prototype - }; - - var workspace = new Blockly.Workspace(); - var block; - try { - assertUndefined(Blockly.Extensions.ALL_['mixin_bad_colour_']); - - // Extension defined before the block type is defined. - Blockly.Extensions.registerMixin('mixin_bad_colour_', TEST_MIXIN_BAD_COLOUR); - assert(goog.isFunction(Blockly.Extensions.ALL_['mixin_bad_colour_'])); - - Blockly.defineBlocksWithJsonArray([{ - "type": "test_block_bad_colour", - "message0": "test_block_bad_colour", - "extensions": ["mixin_bad_colour_"] - }]); - - try { - block = new Blockly.Block(workspace, 'test_block_bad_colour'); - } catch (e) { - // Expected Error - assert(e.message.indexOf('colour_') >= 0); // Reference the conflict - return; - } - fail('Expected error when constructing block'); - } finally { - block && block.dispose(); - workspace.dispose(); - - delete Blockly.Extensions.ALL_['mixin_bad_colour_']; - delete Blockly.Blocks['test_block_bad_colour']; - } -} - -function test_mutator_mixin() { - var workspace = new Blockly.Workspace(); - var block; - - try { - Blockly.defineBlocksWithJsonArray([{ - "type": "mutator_test_block", - "message0": "mutator_test_block", - "mutator": "mutator_test" - }]); - - // Events code calls mutationToDom and expects it to give back a meaningful - // value. - Blockly.Events.disable(); - Blockly.Extensions.registerMutator('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - }, - compose: function() { - return 'composeFn'; - }, - decompose: function() { - return 'decomposeFn'; - } - }); - - block = new Blockly.Block(workspace, 'mutator_test_block'); - - // Make sure all of the functions were installed correctly. - assertEquals(block.domToMutation(), 'domToMutationFn'); - assertEquals(block.mutationToDom(), 'mutationToDomFn'); - assertEquals(block.compose(), 'composeFn'); - assertEquals(block.decompose(), 'decomposeFn'); - } finally { - if (block) { - block.dispose(); - } - workspace.dispose(); - Blockly.Events.enable(); - delete Blockly.Extensions.ALL_['mutator_test']; - } -} - -function test_mutator_mixin_no_dialog() { - var workspace = new Blockly.Workspace(); - var block; - - try { - Blockly.defineBlocksWithJsonArray([{ - "type": "mutator_test_block", - "message0": "mutator_test_block", - "mutator": "mutator_test" - }]); - - // Events code calls mutationToDom and expects it to give back a meaningful - // value. - Blockly.Events.disable(); - assertUndefined(Blockly.Extensions.ALL_['mutator_test']); - Blockly.Extensions.registerMutator('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - } - }); - - block = new Blockly.Block(workspace, 'mutator_test_block'); - - // Make sure all of the functions were installed correctly. - assertEquals(block.domToMutation(), 'domToMutationFn'); - assertEquals(block.mutationToDom(), 'mutationToDomFn'); - assertFalse(block.hasOwnProperty('compose')); - assertFalse(block.hasOwnProperty('decompose')); - } finally { - if (block) { - block.dispose(); - } - workspace.dispose(); - Blockly.Events.enable(); - delete Blockly.Extensions.ALL_['mutator_test']; - } -} - -// Explicitly check all four things that could be missing. -function test_mutator_mixin_no_decompose_fails() { - var exceptionWasThrown = false; - try { - Blockly.Extensions.registerMutator('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - }, - compose: function() { - return 'composeFn'; - } - }); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['mutator_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_mutator_mixin_no_compose_fails() { - var exceptionWasThrown = false; - try { - Blockly.Extensions.registerMutator('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - }, - decompose: function() { - return 'decomposeFn'; - } - }); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['mutator_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_mutator_mixin_no_domToMutation_fails() { - var exceptionWasThrown = false; - try { - Blockly.Extensions.registerMutator('mutator_test', - { - mutationToDom: function() { - return 'mutationToDomFn'; - }, - compose: function() { - return 'composeFn'; - }, - decompose: function() { - return 'decomposeFn'; - } - }); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['mutator_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_mutator_mixin_no_mutationToDom_fails() { - var exceptionWasThrown = false; - try { - Blockly.Extensions.registerMutator('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - compose: function() { - return 'composeFn'; - }, - decompose: function() { - return 'decomposeFn'; - } - }); - } catch (e) { - // Expected. - exceptionWasThrown = true; - } finally { - delete Blockly.Extensions.ALL_['mutator_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_use_mutator_as_extension_fails() { - var workspace = new Blockly.Workspace(); - var block; - var exceptionWasThrown = false; - - try { - Blockly.defineBlocksWithJsonArray([{ - "type": "mutator_test_block", - "message0": "mutator_test_block", - "extensions": ["mutator_test"] - }]); - - Blockly.Events.disable(); - assertUndefined(Blockly.Extensions.ALL_['mutator_test']); - Blockly.Extensions.registerMutator('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - } - }); - - // Events code calls mutationToDom and expects it to give back a meaningful - // value. - block = new Blockly.Block(workspace, 'mutator_test_block'); - } catch (e) { - // Expected - exceptionWasThrown = true; - // Should have failed on apply, not on register. - assertNotNull(Blockly.Extensions.ALL_['mutator_test']); - } finally { - if (block) { - block.dispose(); - } - workspace.dispose(); - Blockly.Events.enable(); - delete Blockly.Extensions.ALL_['mutator_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_use_mutator_mixin_as_extension_fails() { - var workspace = new Blockly.Workspace(); - var block; - var exceptionWasThrown = false; - - try { - Blockly.defineBlocksWithJsonArray([{ - "type": "mutator_test_block", - "message0": "mutator_test_block", - "extensions": ["mutator_test"] - }]); - - // Events code calls mutationToDom and expects it to give back a meaningful - // value. - Blockly.Events.disable(); - assertUndefined(Blockly.Extensions.ALL_['mutator_test']); - Blockly.Extensions.registerMixin('mutator_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - } - }); - - block = new Blockly.Block(workspace, 'mutator_test_block'); - } catch (e) { - // Expected - exceptionWasThrown = true; - // Should have failed on apply, not on register. - assertNotNull(Blockly.Extensions.ALL_['mutator_test']); - } finally { - if (block) { - block.dispose(); - } - workspace.dispose(); - Blockly.Events.enable(); - delete Blockly.Extensions.ALL_['mutator_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_use_extension_as_mutator_fails() { - var workspace = new Blockly.Workspace(); - var block; - var exceptionWasThrown = false; - - try { - Blockly.defineBlocksWithJsonArray([{ - "type": "mutator_test_block", - "message0": "mutator_test_block", - "mutator": ["extensions_test"] - }]); - - // Events code calls mutationToDom and expects it to give back a meaningful - // value. - Blockly.Events.disable(); - assertUndefined(Blockly.Extensions.ALL_['extensions_test']); - Blockly.Extensions.register('extensions_test', function() { - return 'extensions_test_fn'; - }); - - block = new Blockly.Block(workspace, 'mutator_test_block'); - } catch (e) { - // Expected - exceptionWasThrown = true; - // Should have failed on apply, not on register. - assertNotNull(Blockly.Extensions.ALL_['extensions_test']); - } finally { - if (block) { - block.dispose(); - } - workspace.dispose(); - Blockly.Events.enable(); - delete Blockly.Extensions.ALL_['extensions_test']; - } - assertTrue(exceptionWasThrown); -} - -function test_mutator_mixin_plus_function() { - var workspace = new Blockly.Workspace(); - var block; - var fnWasCalled = false; - - try { - Blockly.defineBlocksWithJsonArray([{ - "type": "mutator_test_block", - "message0": "mutator_test_block", - "mutator": ["extensions_test"] - }]); - - Blockly.Events.disable(); - assertUndefined(Blockly.Extensions.ALL_['extensions_test']); - Blockly.Extensions.registerMutator('extensions_test', - { - domToMutation: function() { - return 'domToMutationFn'; - }, - mutationToDom: function() { - return 'mutationToDomFn'; - } - }, - function() { - fnWasCalled = true; - } - ); - - // Events code calls mutationToDom and expects it to give back a meaningful - // value. - block = new Blockly.Block(workspace, 'mutator_test_block'); - } finally { - if (block) { - block.dispose(); - } - workspace.dispose(); - Blockly.Events.enable(); - delete Blockly.Extensions.ALL_['extensions_test']; - } - assertTrue(fnWasCalled); -} diff --git a/packages/scratch-blocks/tests/jsunit/field_angle_test.js b/packages/scratch-blocks/tests/jsunit/field_angle_test.js deleted file mode 100644 index 66b6ab009..000000000 --- a/packages/scratch-blocks/tests/jsunit/field_angle_test.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.FieldAngle - * @author Anm@anm.me (Andrew n marshall) - */ -'use strict'; - -function test_fieldangle_constructor() { - assertEquals(new Blockly.FieldAngle().getValue(), '0'); - assertEquals(new Blockly.FieldAngle(null).getValue(), '0'); - assertEquals(new Blockly.FieldAngle(undefined).getValue(), '0'); - assertEquals(new Blockly.FieldAngle(1).getValue(), '1'); - assertEquals(new Blockly.FieldAngle(1.5).getValue(), '1.5'); - assertEquals(new Blockly.FieldAngle('2').getValue(), '2'); - assertEquals(new Blockly.FieldAngle('2.5').getValue(), '2.5'); - - // Bad values - assertEquals(new Blockly.FieldAngle('bad').getValue(), '0'); - assertEquals(new Blockly.FieldAngle(NaN).getValue(), '0'); -} - -function test_fieldangle_fromJson() { - assertEquals(Blockly.FieldAngle.fromJson({}).getValue(), '0'); - assertEquals(Blockly.FieldAngle.fromJson({ angle: 1 }).getValue(), '1'); -} diff --git a/packages/scratch-blocks/tests/jsunit/field_number_test.js b/packages/scratch-blocks/tests/jsunit/field_number_test.js deleted file mode 100644 index ce40191d6..000000000 --- a/packages/scratch-blocks/tests/jsunit/field_number_test.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.FieldNumber - * @author Anm@anm.me (Andrew n marshall) - */ -'use strict'; - -function test_fieldnumber_constructor() { - // No arguments - var field = new Blockly.FieldNumber(); - assertEquals(field.getValue(), '0'); - - // Unlike blockly, scratch-blocks doesn't store min, max, and precision. - // TODO: Update this to check the restrictor, based on min, max, and precision. - assertEquals(field.min_, undefined); - assertEquals(field.max_, undefined); - assertEquals(field.precision_, undefined); - - // Numeric values - field = new Blockly.FieldNumber(1); - assertEquals(field.getValue(), '1'); - field = new Blockly.FieldNumber(1.5); - assertEquals(field.getValue(), '1.5'); - - // String value - field = new Blockly.FieldNumber('2'); - assertEquals(field.getValue(), '2'); - field = new Blockly.FieldNumber('2.5'); - assertEquals(field.getValue(), '2.5'); - - // All values - field = new Blockly.FieldNumber( - /* value */ 0, - /* min */ -128, - /* max */ 127, - /* precision */ 1); - // Unlike blockly, scratch-blocks doesn't store min, max, and precision. - assertEquals(field.getValue(), '0'); - assertEquals(field.min_, undefined); - assertEquals(field.max_, undefined); - assertEquals(field.precision_, undefined); - - // Bad value defaults to '0' - field = new Blockly.FieldNumber('bad'); - assertEquals(field.getValue(), '0'); - field = new Blockly.FieldNumber(NaN); - assertEquals(field.getValue(), '0'); -} - -function test_fieldnumber_fromJson() { - assertEquals(Blockly.FieldNumber.fromJson({}).getValue(), '0'); - assertEquals(Blockly.FieldNumber.fromJson({ value: 1 }).getValue(), '1'); - - // All options, but scratch-blocks parses min/max/precision differently from - // Blockly. See notes in field_number.js. - var field = Blockly.FieldNumber.fromJson({ - value: 0, - min: -128, - max: 127, - precision: 1 - }); - assertEquals(field.getValue(), '0'); -} diff --git a/packages/scratch-blocks/tests/jsunit/field_test.js b/packages/scratch-blocks/tests/jsunit/field_test.js deleted file mode 100644 index 2da04834d..000000000 --- a/packages/scratch-blocks/tests/jsunit/field_test.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.Field - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -function test_field_isEditable_simple() { - var field = new Blockly.Field("Dummy text"); - // EDITABLE is true by default, but without a source block a field can't be - // edited. - assertFalse('Field without a block is not editable', - field.isCurrentlyEditable()); -} - -function test_field_isEditable_false() { - // Setting EDITABLE to false doesn't matter. - var field = new Blockly.Field("Dummy text"); - field.EDITABLE = false; - assertFalse('Field without a block is not editable', - field.isCurrentlyEditable()); -} - -function test_field_isEditable_editableBlock() { - var editableBlock = { - isEditable: function() { - return true; - } - }; - - var field = new Blockly.Field("Dummy text"); - field.sourceBlock_ = editableBlock; - - assertTrue('Editable field with editable block is editable', - field.isCurrentlyEditable()); -} - -function test_field_isEditable_editableBlock_false() { - var editableBlock = { - isEditable: function() { - return true; - } - }; - - var field = new Blockly.Field("Dummy text"); - field.sourceBlock_ = editableBlock; - field.EDITABLE = false; - - assertFalse('Non-editable field with editable block is not editable', - field.isCurrentlyEditable()); -} - -function test_field_isEditable_nonEditableBlock() { - var nonEditableBlock = { - isEditable: function() { - return false; - } - }; - - var field = new Blockly.Field("Dummy text"); - field.sourceBlock_ = nonEditableBlock; - - assertFalse('Editable field with non-editable block is not editable', - field.isCurrentlyEditable()); -} - -function test_field_isEditable_nonEditableBlock_false() { - var nonEditableBlock = { - isEditable: function() { - return false; - } - }; - - var field = new Blockly.Field("Dummy text"); - field.sourceBlock_ = nonEditableBlock; - field.EDITABLE = false; - - assertFalse('Non-editable field with non-editable block is not editable', - field.isCurrentlyEditable()); -} - -function test_field_register_with_custom_field() { - var CustomFieldType = function(value) { - CustomFieldType.superClass_.constructor.call(this, value); - }; - goog.inherits(CustomFieldType, Blockly.Field); - - CustomFieldType.fromJson = function(options) { - return new CustomFieldType(options['value']); - }; - - var json = { - type: 'field_custom_test', - value: 'ok' - }; - - // before registering - var field = Blockly.Field.fromJson(json); - assertNull(field); - - Blockly.Field.register('field_custom_test', CustomFieldType); - - // after registering - field = Blockly.Field.fromJson(json); - assertNotNull(field); - assertEquals(field.getValue(), 'ok'); -} diff --git a/packages/scratch-blocks/tests/jsunit/field_variable_getter_test.js b/packages/scratch-blocks/tests/jsunit/field_variable_getter_test.js deleted file mode 100644 index 162e04580..000000000 --- a/packages/scratch-blocks/tests/jsunit/field_variable_getter_test.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.FieldVariableGetter - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -function test_fieldvariablegetter_constructor() { - var field = new Blockly.FieldVariableGetter('text', 'name'); - // The field does not have a variable until after init() is called. - assertEquals(field.getText(), ''); - assertEquals(field.getValue(), ''); -} - -function test_fieldvariablegetter_isEditable() { - var field = new Blockly.FieldVariableGetter('text', 'name'); - // EDITABLE is true by default, but without a source block a field can't be - // edited. - assertFalse('Field without a block is not editable', - field.isCurrentlyEditable()); -} - -function test_fieldvariablegetter_isEditableBlock() { - var field = new Blockly.FieldVariableGetter('text', 'name'); - - var editableBlock = { - isEditable: function() { - return true; - } - }; - - field.sourceBlock_ = editableBlock; - - // Variable getter fields aren't user editable. - assertFalse('Variable getter field should not be editable', - field.isCurrentlyEditable()); -} - -function test_fieldvariablegetter_isSerializable() { - var field = new Blockly.FieldVariableGetter('text', 'name'); - // Variable getter fields are serializable by default. - assertTrue('Variable getter field should be serializable', - field.SERIALIZABLE); -} diff --git a/packages/scratch-blocks/tests/jsunit/field_variable_test.js b/packages/scratch-blocks/tests/jsunit/field_variable_test.js deleted file mode 100644 index bc36b7d69..000000000 --- a/packages/scratch-blocks/tests/jsunit/field_variable_test.js +++ /dev/null @@ -1,202 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.FieldVariable - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -var workspace; -var mockControl_; - -function fieldVariableTestWithMocks_setUp() { - workspace = new Blockly.Workspace(); - mockControl_ = new goog.testing.MockControl(); -} - -function fieldVariableTestWithMocks_tearDown() { - mockControl_.$tearDown(); - workspace.dispose(); -} - -function fieldVariable_mockBlock(workspace) { - return {'workspace': workspace, 'isShadow': function(){return false;}}; -} - -function fieldVariable_createAndInitField(workspace) { - var fieldVariable = new Blockly.FieldVariable('name1'); - var mockBlock = fieldVariable_mockBlock(workspace); - fieldVariable.setSourceBlock(mockBlock); - // No view to initialize, but the model still needs work. - fieldVariable.initModel(); - return fieldVariable; -} - -function test_fieldVariable_Constructor() { - workspace = new Blockly.Workspace(); - var fieldVariable = new Blockly.FieldVariable('name1'); - // The field does not have a variable until after init() is called. - assertEquals('', fieldVariable.getText()); - workspace.dispose(); -} - -function test_fieldVariable_setValueMatchId() { - // Expect the fieldVariable value to be set to variable name - fieldVariableTestWithMocks_setUp(); - workspace.createVariable('name2', null, 'id2'); - - var fieldVariable = fieldVariable_createAndInitField(workspace); - - var oldId = fieldVariable.getValue(); - var event = new Blockly.Events.BlockChange( - fieldVariable.sourceBlock_, 'field', undefined, oldId, 'id2'); - setUpMockMethod(mockControl_, Blockly.Events, 'fire', [event], null); - - fieldVariable.setValue('id2'); - assertEquals('name2', fieldVariable.getText()); - assertEquals('id2', fieldVariable.getValue()); - fieldVariableTestWithMocks_tearDown(); -} - -function test_fieldVariable_setValueNoVariable() { - fieldVariableTestWithMocks_setUp(); - - var fieldVariable = fieldVariable_createAndInitField(workspace); - var mockBlock = fieldVariable.sourceBlock_; - mockBlock.isShadow = function() { - return false; - }; - - try { - fieldVariable.setValue('id1'); - // Calling setValue with a variable that doesn't exist throws an error. - fail(); - } catch (e) { - // expected - } finally { - fieldVariableTestWithMocks_tearDown(); - } -} - -function test_fieldVariable_dropdownCreateVariablesExist() { - // Expect that the dropdown options will contain the variables that exist. - workspace = new Blockly.Workspace(); - workspace.createVariable('name1', '', 'id1'); - workspace.createVariable('name2', '', 'id2'); - - var fieldVariable = fieldVariable_createAndInitField(workspace); - - var result_options = Blockly.FieldVariable.dropdownCreate.call( - fieldVariable); - - assertEquals(result_options.length, 3); - isEqualArrays(result_options[0], ['name1', 'id1']); - isEqualArrays(result_options[1], ['name2', 'id2']); - - workspace.dispose(); -} - -function test_fieldVariable_setValueNull() { - // This should no longer create a variable for the selected option. - fieldVariableTestWithMocks_setUp(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['id1', null]); - - var fieldVariable = fieldVariable_createAndInitField(workspace); - try { - fieldVariable.setValue(null); - fail(); - } catch (e) { - // expected - } finally { - fieldVariableTestWithMocks_tearDown(); - } - -} - -function test_fieldVariable_getVariableTypes_undefinedVariableTypes() { - // Expect that since variableTypes is undefined, only type empty string - // will be returned (regardless of what types are available on the workspace). - workspace = new Blockly.Workspace(); - workspace.createVariable('name1', 'type1'); - workspace.createVariable('name2', 'type2'); - - var fieldVariable = new Blockly.FieldVariable('name1'); - var resultTypes = fieldVariable.getVariableTypes_(); - isEqualArrays(resultTypes, ['']); - workspace.dispose(); -} - -function test_fieldVariable_getVariableTypes_givenVariableTypes() { - // Expect that since variableTypes is defined, it will be the return value, - // regardless of what types are available on the workspace. - workspace = new Blockly.Workspace(); - workspace.createVariable('name1', 'type1'); - workspace.createVariable('name2', 'type2'); - - var fieldVariable = new Blockly.FieldVariable( - 'name1', null, ['type1', 'type2']); - var resultTypes = fieldVariable.getVariableTypes_(); - isEqualArrays(resultTypes, ['type1', 'type2']); - workspace.dispose(); -} - -function test_fieldVariable_getVariableTypes_nullVariableTypes() { - // Expect all variable types to be returned. - // The variable does not need to be initialized to do this--it just needs a - // pointer to the workspace. - workspace = new Blockly.Workspace(); - workspace.createVariable('name1', 'type1'); - workspace.createVariable('name2', 'type2'); - - var fieldVariable = new Blockly.FieldVariable('name1'); - var mockBlock = fieldVariable_mockBlock(workspace); - fieldVariable.setSourceBlock(mockBlock); - fieldVariable.variableTypes = null; - - var resultTypes = fieldVariable.getVariableTypes_(); - // The empty string is always one of the options. - isEqualArrays(resultTypes, ['type1', 'type2', '']); - workspace.dispose(); -} - -function test_fieldVariable_getVariableTypes_emptyListVariableTypes() { - // Expect an error to be thrown. - workspace = new Blockly.Workspace(); - workspace.createVariable('name1', 'type1'); - workspace.createVariable('name2', 'type2'); - - var fieldVariable = new Blockly.FieldVariable('name1'); - var mockBlock = fieldVariable_mockBlock(workspace); - fieldVariable.setSourceBlock(mockBlock); - fieldVariable.variableTypes = []; - - try { - fieldVariable.getVariableTypes_(); - fail(); - } catch (e) { - //expected - } finally { - workspace.dispose(); - } -} diff --git a/packages/scratch-blocks/tests/jsunit/generator_test.js b/packages/scratch-blocks/tests/jsunit/generator_test.js deleted file mode 100644 index 069f1c5b3..000000000 --- a/packages/scratch-blocks/tests/jsunit/generator_test.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function test_prefix() { - var generator = new Blockly.Generator('INTERCAL'); - assertEquals('Prefix nothing.', '', generator.prefixLines('', '')); - assertEquals('Prefix a word.', '@Hello', generator.prefixLines('Hello', '@')); - assertEquals('Prefix one line.', '12Hello\n', generator.prefixLines('Hello\n', '12')); - assertEquals('Prefix two lines.', '***Hello\n***World\n', generator.prefixLines('Hello\nWorld\n', '***')); -} diff --git a/packages/scratch-blocks/tests/jsunit/gesture_test.js b/packages/scratch-blocks/tests/jsunit/gesture_test.js deleted file mode 100644 index 19ba1864e..000000000 --- a/packages/scratch-blocks/tests/jsunit/gesture_test.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for gesture. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -var e; -var workspace; - - -function gestureTest_setUp() { - workspace = new Blockly.Workspace(); - e = {}; -} - -function gestureTest_tearDown() { - e = null; - workspace.dispose(); -} - -function test_gestureConstructor() { - var gesture = new Blockly.Gesture(e, workspace); - assertEquals(gesture.mostRecentEvent_, e); - assertEquals(gesture.creatorWorkspace_, workspace); -} - -function test_gestureIsField_ClickInWorkspace() { - gestureTest_setUp(); - var block = new Blockly.Block(workspace); - var field = new Blockly.Field(); - field.setSourceBlock(block); - var gesture = new Blockly.Gesture(e, workspace); - gesture.setStartField(field); - - var isFieldClick = gesture.isFieldClick_(); - assertEquals(isFieldClick, true); - gestureTest_tearDown(); -} - -function gestureIsFieldClick_InFlyoutHelper(flyout, expectedResult){ - // Assign workspace flyout - workspace.flyout_ = flyout; - // Create a Field inside of a Block - var block = new Blockly.Block(workspace); - var field = new Blockly.Field(); - field.setSourceBlock(block); - // Create gesture from the flyout - var gesture = new Blockly.Gesture(e, workspace.flyout_); - // Populate gesture with click start information - gesture.setStartField(field); - gesture.setStartFlyout_(workspace.flyout_); - - var isFieldClick = gesture.isFieldClick_(); - assertEquals(isFieldClick, expectedResult); -} - -function test_gestureIsFieldClick_AutoCloseFlyout() { - gestureTest_setUp(); - var flyout = new Blockly.VerticalFlyout({}); - gestureIsFieldClick_InFlyoutHelper(flyout, false); - gestureTest_tearDown(); -} - -function test_gestureIsFieldClick_AlwaysOpenFlyout() { - gestureTest_setUp(); - var flyout = new Blockly.VerticalFlyout({}); - flyout.autoClose = false; - gestureIsFieldClick_InFlyoutHelper(flyout, true); - gestureTest_tearDown(); -} diff --git a/packages/scratch-blocks/tests/jsunit/horizontal_tests.html b/packages/scratch-blocks/tests/jsunit/horizontal_tests.html deleted file mode 100644 index ddaa4606f..000000000 --- a/packages/scratch-blocks/tests/jsunit/horizontal_tests.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Unit Tests for Horizontal Scratch-Blockly - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/tests/jsunit/index.html b/packages/scratch-blocks/tests/jsunit/index.html deleted file mode 100644 index e3bcec5c4..000000000 --- a/packages/scratch-blocks/tests/jsunit/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/tests/jsunit/input_test.js b/packages/scratch-blocks/tests/jsunit/input_test.js deleted file mode 100644 index b80f44ab5..000000000 --- a/packages/scratch-blocks/tests/jsunit/input_test.js +++ /dev/null @@ -1,202 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.Input - */ -'use strict'; - -function test_appendField_simple() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var field1 = new Blockly.FieldLabel('#1'); - var field2 = new Blockly.FieldLabel('#2'); - - // Preconditions - assertEquals(0, input.fieldRow.length); - - // Actual Tests - input.appendField(field1, 'first'); - assertEquals(1, input.fieldRow.length); - assertEquals(field1, input.fieldRow[0]); - assertEquals('first', input.fieldRow[0].name); - assertEquals(block, field1.sourceBlock_); - - input.appendField(field2, 'second'); - assertEquals(2, input.fieldRow.length); - assertEquals(field2, input.fieldRow[1]); - assertEquals('second', input.fieldRow[1].name); - assertEquals(block, field2.sourceBlock_); -} - -function test_appendField_string() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var labelText = 'label'; - - // Preconditions - assertEquals(0, input.fieldRow.length); - - // Actual Tests - input.appendField(labelText, 'name'); - assertEquals(1, input.fieldRow.length); - assertEquals(Blockly.FieldLabel, input.fieldRow[0].constructor); - assertEquals(labelText, input.fieldRow[0].getValue()); - assertEquals('name', input.fieldRow[0].name); -} - -function test_appendField_prefix() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var prefix = new Blockly.FieldLabel('prefix'); - var field = new Blockly.FieldLabel('field'); - field.prefixField = prefix; - - // Preconditions - assertEquals(0, input.fieldRow.length); - - // Actual Tests - input.appendField(field); - assertEquals(2, input.fieldRow.length); - assertEquals(prefix, input.fieldRow[0]); - assertEquals(field, input.fieldRow[1]); -} - -function test_appendField_suffix() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var suffix = new Blockly.FieldLabel('suffix'); - var field = new Blockly.FieldLabel('field'); - field.suffixField = suffix; - - // Preconditions - assertEquals(0, input.fieldRow.length); - - // Actual Tests - input.appendField(field); - assertEquals(2, input.fieldRow.length); - assertEquals(field, input.fieldRow[0]); - assertEquals(suffix, input.fieldRow[1]); -} - -function test_insertFieldAt_simple() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var before = new Blockly.FieldLabel('before'); - var after = new Blockly.FieldLabel('after'); - var between = new Blockly.FieldLabel('between'); - input.appendField(before); - input.appendField(after); - - // Preconditions - assertEquals(2, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(after, input.fieldRow[1]); - - // Actual Tests - input.insertFieldAt(1, between, 'name'); - assertEquals(3, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(between, input.fieldRow[1]); - assertEquals('name', input.fieldRow[1].name); - assertEquals(after, input.fieldRow[2]); -} - -function test_insertFieldAt_string() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var before = new Blockly.FieldLabel('before'); - var after = new Blockly.FieldLabel('after'); - var labelText = 'label'; - input.appendField(before); - input.appendField(after); - - // Preconditions - assertEquals(2, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(after, input.fieldRow[1]); - - // Actual Tests - input.insertFieldAt(1, labelText, 'name'); - assertEquals(3, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(Blockly.FieldLabel, input.fieldRow[1].constructor); - assertEquals(labelText, input.fieldRow[1].getValue()); - assertEquals('name', input.fieldRow[1].name); - assertEquals(after, input.fieldRow[2]); -} - -function test_insertFieldAt_prefix() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var before = new Blockly.FieldLabel('before'); - var after = new Blockly.FieldLabel('after'); - var prefix = new Blockly.FieldLabel('prefix'); - var between = new Blockly.FieldLabel('between'); - between.prefixField = prefix - input.appendField(before); - input.appendField(after); - - // Preconditions - assertEquals(2, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(after, input.fieldRow[1]); - - // Actual Tests - input.insertFieldAt(1, between); - assertEquals(4, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(prefix, input.fieldRow[1]); - assertEquals(between, input.fieldRow[2]); - assertEquals(after, input.fieldRow[3]); -} - -function test_insertFieldAt_prefix() { - var ws = new Blockly.Workspace(); - var block = new Blockly.Block(ws); - var input = new Blockly.Input(Blockly.DUMMY_INPUT, 'INPUT', block); - var before = new Blockly.FieldLabel('before'); - var after = new Blockly.FieldLabel('after'); - var suffix = new Blockly.FieldLabel('suffix'); - var between = new Blockly.FieldLabel('between'); - between.suffixField = suffix - input.appendField(before); - input.appendField(after); - - // Preconditions - assertEquals(2, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(after, input.fieldRow[1]); - - // Actual Tests - input.insertFieldAt(1, between); - assertEquals(4, input.fieldRow.length); - assertEquals(before, input.fieldRow[0]); - assertEquals(between, input.fieldRow[1]); - assertEquals(suffix, input.fieldRow[2]); - assertEquals(after, input.fieldRow[3]); -} \ No newline at end of file diff --git a/packages/scratch-blocks/tests/jsunit/json_test.js b/packages/scratch-blocks/tests/jsunit/json_test.js deleted file mode 100644 index 7967cd2f6..000000000 --- a/packages/scratch-blocks/tests/jsunit/json_test.js +++ /dev/null @@ -1,260 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -/** Ensure a block can be instantiated from a JSON definition. */ -function test_json_minimal() { - var BLOCK_TYPE = 'test_json_minimal'; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE - }]); - - block = new Blockly.Block(workspace, BLOCK_TYPE); - assertEquals(BLOCK_TYPE, block.type); - // TODO: asserts - } finally { - block.dispose(); - workspace.dispose(); - delete Blockly.Blocks[BLOCK_TYPE]; - } -} - -/** Ensure message0 creates an input. */ -function test_json_message0() { - var BLOCK_TYPE = 'test_json_message0'; - var MESSAGE0 = 'message0'; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE, - "message0": MESSAGE0 - }]); - - block = new Blockly.Block(workspace, BLOCK_TYPE); - assertEquals(1, block.inputList.length); - assertEquals(1, block.inputList[0].fieldRow.length); - var textField = block.inputList[0].fieldRow[0]; - assertEquals(Blockly.FieldLabel, textField.constructor); - assertEquals(MESSAGE0, textField.getText()); - } finally { - block && block.dispose(); - workspace.dispose(); - delete Blockly.Blocks[BLOCK_TYPE]; - } -} - -/** Ensure message1 creates a new input. */ -function test_json_message1() { - var BLOCK_TYPE = 'test_json_message1'; - var MESSAGE0 = 'message0'; - var MESSAGE1 = 'message1'; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE, - "message0": MESSAGE0, - "message1": MESSAGE1 - }]); - - block = new Blockly.Block(workspace, BLOCK_TYPE); - assertEquals(2, block.inputList.length); - - assertEquals(1, block.inputList[0].fieldRow.length); - var textField = block.inputList[0].fieldRow[0]; - assertEquals(Blockly.FieldLabel, textField.constructor); - assertEquals(MESSAGE0, textField.getText()); - - assertEquals(1, block.inputList[1].fieldRow.length); - var textField = block.inputList[1].fieldRow[0]; - assertEquals(Blockly.FieldLabel, textField.constructor); - assertEquals(MESSAGE1, textField.getText()); - } finally { - block && block.dispose(); - workspace.dispose(); - delete Blockly.Blocks[BLOCK_TYPE]; - } -} - -/** Ensure message string is dereferenced. */ -function test_json_message0_i18n() { - var BLOCK_TYPE = 'test_json_message0_i18n'; - var MESSAGE0 = '%{BKY_MESSAGE}'; - var MESSAGE = 'message'; - - Blockly.Msg['MESSAGE'] = MESSAGE; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE, - "message0": MESSAGE0 - }]); - - block = new Blockly.Block(workspace, BLOCK_TYPE); - assertEquals(1, block.inputList.length); - assertEquals(1, block.inputList[0].fieldRow.length); - var textField = block.inputList[0].fieldRow[0]; - assertEquals(Blockly.FieldLabel, textField.constructor); - assertEquals(MESSAGE, textField.getText()); - } finally { - block && block.dispose(); // Disposes of textField, too. - workspace.dispose(); - delete Blockly.Blocks[BLOCK_TYPE]; - delete Blockly.Msg['MESSAGE']; - } -} - -function test_json_dropdown() { - var BLOCK_TYPE = 'test_json_dropdown'; - var FIELD_NAME = 'FIELD_NAME'; - var LABEL0 = 'LABEL0'; - var VALUE0 = 'VALUE0'; - var LABEL1 = 'LABEL1'; - var VALUE1 = 'VALUE1'; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE, - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": FIELD_NAME, - "options": [ - [LABEL0, VALUE0], - [LABEL1, VALUE1] - ] - } - ] - }]); - - block = new Blockly.Block(workspace, BLOCK_TYPE); - assertEquals(1, block.inputList.length); - assertEquals(1, block.inputList[0].fieldRow.length); - var dropdown = block.inputList[0].fieldRow[0]; - assertEquals(dropdown, block.getField(FIELD_NAME)); - assertEquals(Blockly.FieldDropdown, dropdown.constructor); - assertEquals(VALUE0, dropdown.getValue()); - - var options = dropdown.getOptions(); - assertEquals(LABEL0, options[0][0]); - assertEquals(VALUE0, options[0][1]); - assertEquals(LABEL1, options[1][0]); - assertEquals(VALUE1, options[1][1]); - } finally { - block && block.dispose(); // Disposes of dropdown, too. - workspace.dispose(); - delete Blockly.Blocks[BLOCK_TYPE]; - } -} - -function test_json_dropdown_image() { - var BLOCK_TYPE = 'test_json_dropdown'; - var FIELD_NAME = 'FIELD_NAME'; - var IMAGE1_ALT_TEXT = 'Localized message.'; - Blockly.Msg['ALT_TEXT'] = IMAGE1_ALT_TEXT; - var IMAGE0 = { - 'width': 12, - 'height': 34, - 'src': 'http://image0.src', - 'alt': 'IMAGE0 alt text' - }; - var VALUE0 = 'VALUE0'; - var IMAGE1 = { - 'width': 56, - 'height': 78, - 'src': 'http://image1.src', - 'alt': '%{BKY_ALT_TEXT}' - }; - var VALUE1 = 'VALUE1'; - var IMAGE2 = { - 'width': 90, - 'height': 123, - 'src': 'http://image2.src' - }; - var VALUE2 = 'VALUE2'; - - var workspace = new Blockly.Workspace(); - var block; - try { - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE, - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": FIELD_NAME, - "options": [ - [IMAGE0, VALUE0], - [IMAGE1, VALUE1], - [IMAGE2, VALUE2] - ] - } - ] - }]); - - block = new Blockly.Block(workspace, BLOCK_TYPE); - assertEquals(1, block.inputList.length); - assertEquals(1, block.inputList[0].fieldRow.length); - var dropdown = block.inputList[0].fieldRow[0]; - assertEquals(dropdown, block.getField(FIELD_NAME)); - assertEquals(Blockly.FieldDropdown, dropdown.constructor); - assertEquals(VALUE0, dropdown.getValue()); - - var options = dropdown.getOptions(); - var image0 = options[0][0]; - assertEquals(IMAGE0.width, image0.width); - assertEquals(IMAGE0.height, image0.height); - assertEquals(IMAGE0.src, image0.src); - assertEquals(IMAGE0.alt, image0.alt); - assertEquals(VALUE0, options[0][1]); - - var image1 = options[1][0]; - assertEquals(IMAGE1.width, image1.width); - assertEquals(IMAGE1.height, image1.height); - assertEquals(IMAGE1.src, image1.src); - assertEquals(IMAGE1.alt, IMAGE1_ALT_TEXT); // Via Msg reference - assertEquals(VALUE1, options[1][1]); - - var image2 = options[2][0]; - assertEquals(IMAGE2.width, image2.width); - assertEquals(IMAGE2.height, image2.height); - assertEquals(IMAGE2.src, image2.src); - assert(image2.alt == null); // No alt specified. - assertEquals(VALUE2, options[2][1]); - } finally { - block && block.dispose(); // Disposes of dropdown, too. - workspace.dispose(); - delete Blockly.Blocks[BLOCK_TYPE]; - delete Blockly.Msg['ALTTEXT']; - } -} - diff --git a/packages/scratch-blocks/tests/jsunit/names_test.js b/packages/scratch-blocks/tests/jsunit/names_test.js deleted file mode 100644 index 8a4b008e5..000000000 --- a/packages/scratch-blocks/tests/jsunit/names_test.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function test_safeName() { - var varDB = new Blockly.Names('window,door'); - assertEquals('SafeName empty.', 'unnamed', varDB.safeName_('')); - assertEquals('SafeName ok.', 'foobar', varDB.safeName_('foobar')); - assertEquals('SafeName number start.', 'my_9lives', - varDB.safeName_('9lives')); - assertEquals('SafeName number end.', 'lives9', varDB.safeName_('lives9')); - assertEquals('SafeName special chars.', '____', varDB.safeName_('!@#$')); - assertEquals('SafeName reserved.', 'door', varDB.safeName_('door')); -} - -function test_getName() { - var varDB = new Blockly.Names('window,door'); - assertEquals('Name add #1.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); - assertEquals('Name get #1.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); - assertEquals('Name add #2.', 'Foo_bar2', varDB.getName('Foo bar', 'var')); - assertEquals('Name get #2.', 'Foo_bar2', varDB.getName('foo BAR', 'var')); - assertEquals('Name add #3.', 'door2', varDB.getName('door', 'var')); - assertEquals('Name add #4.', 'Foo_bar3', varDB.getName('Foo.bar', 'proc')); - assertEquals('Name get #1b.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); - assertEquals('Name get #4.', 'Foo_bar3', varDB.getName('Foo.bar', 'proc')); -} - -function test_getDistinctName() { - var varDB = new Blockly.Names('window,door'); - assertEquals('Name distinct #1.', 'Foo_bar', - varDB.getDistinctName('Foo.bar', 'var')); - assertEquals('Name distinct #2.', 'Foo_bar2', - varDB.getDistinctName('Foo.bar', 'var')); - assertEquals('Name distinct #3.', 'Foo_bar3', - varDB.getDistinctName('Foo.bar', 'proc')); - varDB.reset(); - assertEquals('Name distinct #4.', 'Foo_bar', - varDB.getDistinctName('Foo.bar', 'var')); -} - -function test_nameEquals() { - assertTrue('Name equals #1.', Blockly.Names.equals('Foo.bar', 'Foo.bar')); - assertFalse('Name equals #2.', Blockly.Names.equals('Foo.bar', 'Foo_bar')); - assertTrue('Name equals #3.', Blockly.Names.equals('Foo.bar', 'FOO.BAR')); -} diff --git a/packages/scratch-blocks/tests/jsunit/procedure_test.js b/packages/scratch-blocks/tests/jsunit/procedure_test.js deleted file mode 100644 index 71b324e05..000000000 --- a/packages/scratch-blocks/tests/jsunit/procedure_test.js +++ /dev/null @@ -1,341 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -var workspace; -//var mockControl_; - -function procedureTest_setUp() { - Blockly.Blocks[Blockly.PROCEDURES_CALL_BLOCK_TYPE] = { - init: function() { - this.procCode_ = ''; - this.setPreviousStatement(true); - this.setNextStatement(true); - }, - getProcCode: function() { - return this.procCode_; - } - }; - Blockly.Blocks['foo'] = { - init: function() { - this.jsonInit({ - "message0": "foo", - "previousStatement": null, - "nextStatement": null - }); - this.setNextStatement(true); - } - }; - Blockly.Blocks['loop'] = { - init: function() { - this.jsonInit({ message0: 'forever %1', - "args0": [ - { - "type": "input_statement", - "name": "SUBSTACK" - } - ]}); - } - }; - - - workspace = new Blockly.Workspace(); - //mockControl_ = new goog.testing.MockControl(); -} - -function procedureTest_tearDown() { - delete Blockly.Blocks[Blockly.PROCEDURES_CALL_BLOCK_TYPE]; - delete Blockly.Blocks['foo']; - delete Blockly.Blocks['loop']; - //mockControl_.$tearDown(); - workspace.dispose(); -} - -function test_findCallers_simple_oneCaller() { - var xml = '' + - '' + - '' + - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_1').procCode_ = 'test_procedure'; - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - {id: ''}, false); - assertEquals(1, callers.length); - assertEquals('test_1', callers[0].id); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_noRecursion() { - var xml = '' + - '' + - '' + - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_1').procCode_ = 'test_procedure'; - var rootBlock = workspace.getBlockById('test_1'); - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - rootBlock, false /* allowRecursion */); - - // There was a single call to this function, but it was in a stack that - // should be ignored. - assertEquals(0, callers.length); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_allowRecursion() { - var xml = '' + - '' + - '' + - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_1').procCode_ = 'test_procedure'; - var rootBlock = workspace.getBlockById('test_1'); - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - rootBlock, true /* allowRecursion */); - - // There was a single call to this function, in the same stack as the - // definition root. Recursion is allowed, so it should be found. - assertEquals(1, callers.length); - assertEquals('test_1', callers[0].id); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_simple_noCallers() { - var xml = '' + - '' + - '' + - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - {id: ''}, false); - - // There weren't even blocks of type procedures_callnoreturn. - assertEquals(0, callers.length); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_wrongProcCode() { - var xml = '' + - '' + - '' + - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_1').procCode_ = 'wrong procedure'; - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - {id: ''}, false); - - // There was a procedure_callnoreturn call, but it had the wrong procCode. - assertEquals(0, callers.length); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_onStatementInput() { - var xml = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_3').procCode_ = 'test_procedure'; - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - {id: ''}, false); - - // There should be one caller, connected to a stack on a statement input. - assertEquals(1, callers.length); - assertEquals('test_3', callers[0].id); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_multipleStacks() { - var xml = '' + - '' + - ''+ - '' + - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_2').procCode_ = 'test_procedure'; - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - {id: ''}, false); - - // There should be one caller, but multiple stacks in the workspace. - assertEquals(1, callers.length); - assertEquals('test_2', callers[0].id); - } - finally { - procedureTest_tearDown(); - } -} - -function test_findCallers_multipleCallers() { - var xml = '' + - '' + - ''+ - ''; - procedureTest_setUp(); - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_2').procCode_ = 'test_procedure'; - workspace.getBlockById('test_1').procCode_ = 'test_procedure'; - var callers = Blockly.Procedures.getCallers('test_procedure', workspace, - {id: ''}, false); - - // There should be two callers, on two different stacks. - assertEquals(2, callers.length); - // Order doesn't matter. - assertTrue(callers[0].id == 'test_1' || callers[0].id == 'test_2'); - assertTrue(callers[1].id == 'test_1' || callers[1].id == 'test_2'); - } - finally { - procedureTest_tearDown(); - } -} - -function test_deleteProcedure_noCallers() { - // If there are no callers, the stack should be deleted. - procedureTest_setUp(); - var xml = '' + - '' + - '' + - '' + - '' + - ''; - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_1').procCode_ = 'test_procedure'; - var rootBlock = workspace.getBlockById('test_1'); - assertTrue(Blockly.Procedures.deleteProcedureDefCallback('test_procedure', - rootBlock)); - // The other two blocks should stick around. - assertEquals(2, workspace.getTopBlocks().length); - } - finally { - procedureTest_tearDown(); - } -} - -function test_deleteProcedure_recursiveCaller() { - // If there is a caller but it's a part of stack starting with definitionRoot, - // the stack should be deleted. - - procedureTest_setUp(); - - var xml = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - ''; - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_3').procCode_ = 'test_procedure'; - var rootBlock = workspace.getBlockById('test_1'); - assertTrue(Blockly.Procedures.deleteProcedureDefCallback('test_procedure', - rootBlock)); - assertEquals(0, workspace.getTopBlocks().length); - } - finally { - procedureTest_tearDown(); - } -} - -function test_deleteProcedure_nonRecursiveCaller() { - // If there is a caller and it's not part of the procedure definition, the - // stack should not be deleted. - - procedureTest_setUp(); - var xml = '' + - '' + - '' + - '' + - ''; - try { - Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xml), workspace); - workspace.getBlockById('test_1').procCode_ = 'test_procedure'; - var rootBlock = workspace.getBlockById('test_2'); - assertFalse(Blockly.Procedures.deleteProcedureDefCallback('test_procedure', - rootBlock)); - // All blocks should stay on the workspace. - assertEquals(3, workspace.getTopBlocks().length); - } - finally { - procedureTest_tearDown(); - } -} diff --git a/packages/scratch-blocks/tests/jsunit/scratch_block_comment_test.js b/packages/scratch-blocks/tests/jsunit/scratch_block_comment_test.js deleted file mode 100644 index 65aa0d7ec..000000000 --- a/packages/scratch-blocks/tests/jsunit/scratch_block_comment_test.js +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); - -var block; -var workspace; -var originalCreateIcon = Blockly.ScratchBlockComment.createIcon; - -function scratchBlockCommentTest_setUp() { - workspace = new Blockly.Workspace(); - // Mock the resizeContents function on the workspace - workspace.resizeContents = function () {}; - - var BLOCK_TYPE = 'test_json_minimal'; - - Blockly.defineBlocksWithJsonArray([{ - "type": BLOCK_TYPE - }]); - - block = new Blockly.BlockSvg(workspace, BLOCK_TYPE); - - // Mock createIcon function since it is not necessary for these tests - Blockly.ScratchBlockComment.prototype.createIcon = function () {}; -} - -function scratchBlockCommentTest_tearDown() { - workspace.dispose(); - block.dispose(); - - // Restore original createIcon function - Blockly.ScratchBlockComment.prototype.createIcon = originalCreateIcon; -} - -function test_blockWithNoBlockComments() { - scratchBlockCommentTest_setUp(); - try { - assertEquals('Workspace has a block.', 1, workspace.getTopBlocks(false).length); - assertEquals('Workspace does not have a comment.', 0, workspace.getTopComments(false).length); - assertEquals('Block does not have a comment', null, block.comment); - assertEquals('Block does not have comment text', '', block.getCommentText()); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_createBlockCommentMinimalArguments() { - scratchBlockCommentTest_setUp(); - try { - var comment = new Blockly.ScratchBlockComment(block, 'Some comment text'); - assertEquals('Workspace has a block.', 1, workspace.getTopBlocks(false).length); - assertEquals('Workspace has a comment.', 1, workspace.getTopComments(false).length); - assertEquals('Comment knows about workspace.', workspace, comment.workspace); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_createBlockCommentAllArguments() { - scratchBlockCommentTest_setUp(); - try { - var comment = new Blockly.ScratchBlockComment(block, 'Some comment text', 'aMockComment', 10, 20, true); - assertEquals('Workspace has a block.', 1, workspace.getTopBlocks(false).length); - assertEquals('Workspace has a comment.', 1, workspace.getTopComments(false).length); - assertEquals('Comment knows about workspace.', workspace, comment.workspace); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_addCommentToBlock() { - scratchBlockCommentTest_setUp(); - try { - block.setCommentText('Some comment text', 'aMockComment'); - assertEquals('Workspace has a block.', 1, workspace.getTopBlocks(false).length); - assertEquals('Workspace has a comment.', 1, workspace.getTopComments(false).length); - assertNotEquals('Block has a comment', null, block.comment); - assertEquals('Block has comment text', 'Some comment text', block.getCommentText()); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_blockCommentXYWhenPositionProvided() { - scratchBlockCommentTest_setUp(); - try { - var comment = new Blockly.ScratchBlockComment(block, 'Some comment text', 'aMockComment', 10, 20); - var commentXY = comment.getXY(); - var commentX = commentXY.x; - var commentY = commentXY.y; - assertEquals('Comment x position is type number', 'number', typeof commentX); - assertEquals('Comment y position is type number', 'number', typeof commentY); - - assertEquals('Comment x position is what was provided', 10, commentX); - assertEquals('Comment y position is what was provided', 20, commentY); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_blockCommentXYWhenPositionNotProvided() { - scratchBlockCommentTest_setUp(); - try { - var comment = new Blockly.ScratchBlockComment( - block, 'Some comment text', 'aMockComment'); - var commentXY = comment.getXY(); - var commentX = commentXY.x; - var commentY = commentXY.y; - - console.log("COMMENT X: " + commentX); - console.log("COMMENT Y: " + commentY); - - assertEquals('Comment x position is type number', 'number', typeof commentX); - assertEquals('Comment y position is type number', 'number', typeof commentY); - - assertFalse('Comment x position is not NaN', isNaN(commentX)); - assertFalse('Comment y position is not NaN', isNaN(commentY)); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_blockCommentXYNaNPositionProvided() { - scratchBlockCommentTest_setUp(); - try { - var comment = new Blockly.ScratchBlockComment( - block, 'Some comment text', 'aMockComment', NaN, NaN); - var commentXY = comment.getXY(); - var commentX = commentXY.x; - var commentY = commentXY.y; - - assertEquals('Comment x position is type number', 'number', typeof commentX); - assertEquals('Comment y position is type number', 'number', typeof commentY); - - assertFalse('Comment x position is not NaN', isNaN(commentX)); - assertFalse('Comment y position is not NaN', isNaN(commentY)); - } finally { - scratchBlockCommentTest_tearDown(); - } -} - -function test_blockCommentXYNullPositionProvided() { - scratchBlockCommentTest_setUp(); - try { - var comment = new Blockly.ScratchBlockComment( - block, 'Some comment text', 'aMockComment', null, null); - var commentXY = comment.getXY(); - var commentX = commentXY.x; - var commentY = commentXY.y; - - assertEquals('Comment x position is type number', 'number', typeof commentX); - assertEquals('Comment y position is type number', 'number', typeof commentY); - - assertFalse('Comment x position is not NaN', isNaN(commentX)); - assertFalse('Comment y position is not NaN', isNaN(commentY)); - } finally { - scratchBlockCommentTest_tearDown(); - } -} diff --git a/packages/scratch-blocks/tests/jsunit/svg_test.js b/packages/scratch-blocks/tests/jsunit/svg_test.js deleted file mode 100644 index dfef27ae7..000000000 --- a/packages/scratch-blocks/tests/jsunit/svg_test.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2016 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -var svgTest_workspace; - -function svgTest_setUp() { - svgTest_workspace = Blockly.inject('blocklyDiv', - {toolbox: document.getElementById('toolbox')}); -} - -function svgTest_tearDown() { - svgTest_workspace.dispose(); - svgTest_workspace = null; -} - -/** - * Create a block with one field. Must be called after svgTest_setUp(). - * @return {!Blockly.Block} The new block with one field. - */ -function svgTest_newOneFieldBlock() { - Blockly.Blocks['one_field_block'] = { - init: function() { - this.jsonInit({ - 'message0': '%1', - 'args0': [ - { - 'type': 'field_input', - 'name': 'FIELD' - } - ] - }); - } - }; - - var block = svgTest_workspace.newBlock('one_field_block'); - block.initSvg(); - block.render(false); - return block; -} - -/** - * Create a block with two fields. Must be called after svgTest_setUp(). - * @return {!Blockly.Block} The new block with two fields. - */ -function svgTest_newTwoFieldBlock() { - Blockly.Blocks['two_field_block'] = { - init: function() { - this.jsonInit({ - 'message0': 'text_field %1', - 'args0': [ - { - 'type': 'field_input', - 'name': 'FIELD' - } - ] - }); - } - }; - - var block = svgTest_workspace.newBlock('two_field_block'); - block.initSvg(); - block.render(false); - return block; -} diff --git a/packages/scratch-blocks/tests/jsunit/test_runner.js b/packages/scratch-blocks/tests/jsunit/test_runner.js deleted file mode 100644 index 3a09b1813..000000000 --- a/packages/scratch-blocks/tests/jsunit/test_runner.js +++ /dev/null @@ -1,37 +0,0 @@ -require('chromedriver'); -var webdriver = require('selenium-webdriver'); -var browser = new webdriver.Builder() - .forBrowser('chrome') - .build(); - -// Parse jsunit html report, exit(1) if there are any failures. -var testHtml = function (htmlString) { - var regex = /[\d]+\spassed,\s([\d]+)\sfailed./i; - var numOfFailure = regex.exec(htmlString)[1]; - var regex2 = /Unit Tests for .*]/; - var testStatus = regex2.exec(htmlString)[0]; - console.log("============Unit Test Summary================="); - console.log(testStatus); - var regex3 = /\d+ passed,\s\d+ failed/; - var detail = regex3.exec(htmlString)[0]; - console.log(detail); - console.log("============Unit Test Summary================="); - if (parseInt(numOfFailure) !== 0) { - console.log(htmlString); - process.exit(1); - } -}; - -var path = process.cwd(); - -browser - .get("file://" + path + "/tests/jsunit/vertical_tests.html") - .then(function () { return browser.sleep(5000) }) - .then(function () { return browser.findElement({id: "closureTestRunnerLog"}) }) - .then(function (e) { return e.getText() }) - .then(testHtml) - .then(function () { return browser.get("file://" + path + "/tests/jsunit/horizontal_tests.html")}) - .then(function () { return browser.sleep(5000) }) - .then(function () { return browser.findElement({id: "closureTestRunnerLog"}) }) - .then(function (e) { return e.getText() }) - .then(testHtml); \ No newline at end of file diff --git a/packages/scratch-blocks/tests/jsunit/test_utilities.js b/packages/scratch-blocks/tests/jsunit/test_utilities.js deleted file mode 100644 index 042b3ae74..000000000 --- a/packages/scratch-blocks/tests/jsunit/test_utilities.js +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Test utilities. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.require('goog.testing'); - - -/** - * The normal blockly event fire function. We sometimes override this. This - * handle lets us reset after an override. - */ -var savedFireFunc = Blockly.Events.fire; - -/** - * A helper function to replace Blockly.Events.fire in tests. - */ -function temporary_fireEvent(event) { - if (!Blockly.Events.isEnabled()) { - return; - } - Blockly.Events.FIRE_QUEUE_.push(event); - Blockly.Events.fireNow_(); -} - -/** - * Check that two arrays have the same content. - * @param {!Array.} array1 The first array. - * @param {!Array.} array2 The second array. - */ -function isEqualArrays(array1, array2) { - assertEquals(array1.length, array2.length); - for (var i = 0; i < array1.length; i++) { - assertEquals(array1[i], array2[i]); - } -} - -/** - * Creates a controlled MethodMock. Sets the expected return values and - * the parameters if any exist. Sets the method to replay. - * @param {!goog.testing.MockControl} mockControl Object that holds a set - * of mocks for this test. - * @param {!Object} scope The scope of the method to be mocked out. - * @param {!string} funcName The name of the function we're going to mock. - * @param {Array} parameters The parameters to call the mock with. - * @param {Array} return_values The values to return when called. - * @return {!goog.testing.MockInterface} The mocked method. - */ -function setUpMockMethod(mockControl, scope, funcName, parameters, - return_values) { - var mockMethod = mockControl.createMethodMock(scope, funcName); - if (return_values) { - for (var i = 0, return_value; return_value = return_values[i]; i++) { - if (parameters && i < parameters.length) { - mockMethod(parameters[i]).$returns(return_value); - } - else { - mockMethod().$returns(return_value); - } - } - } - // If there are no return values but there are parameters, we are only - // recording specific method calls. - else if (parameters) { - for (var i = 0; i < parameters.length; i++) { - mockMethod(parameters[i]); - } - } - mockMethod.$replay(); - return mockMethod; -} - -/** - * Check if a variable with the given values exists. - * @param {Blockly.Workspace|Blockly.VariableMap} container The workspace or - * variableMap the checked variable belongs to. - * @param {!string} name The expected name of the variable. - * @param {!string} type The expected type of the variable. - * @param {!string} id The expected id of the variable. - */ -function checkVariableValues(container, name, type, id) { - var variable = container.getVariableById(id); - assertNotUndefined(variable); - assertEquals(name, variable.name); - assertEquals(type, variable.type); - assertEquals(id, variable.getId()); -} - -/** - * Create a test get_var_block. - * Will fail if get_var_block isn't defined. - * TODO (fenichel): Rename to createMockVarBlock. - * @param {!string} variable_id The id of the variable to reference. - * @return {!Blockly.Block} The created block. - */ -function createMockBlock(variable_id) { - if (!Blockly.Blocks['get_var_block']) { - fail(); - } - // Turn off events to avoid testing XML at the same time. - Blockly.Events.disable(); - var block = new Blockly.Block(workspace, 'get_var_block'); - block.inputList[0].fieldRow[0].setValue(variable_id); - Blockly.Events.enable(); - return block; -} - -function createTwoVariablesAndBlocks(workspace) { - // Create two variables of different types. - workspace.createVariable('name1', 'type1', 'id1'); - workspace.createVariable('name2', 'type2', 'id2'); - // Create blocks to refer to both of them. - createMockBlock('id1'); - createMockBlock('id2'); -} - -function createVariableAndBlock(workspace) { - workspace.createVariable('name1', 'type1', 'id1'); - createMockBlock('id1'); -} - -function defineGetVarBlock() { - Blockly.defineBlocksWithJsonArray([{ - "type": "get_var_block", - "message0": "%1", - "args0": [ - { - "type": "field_variable", - "name": "VAR", - "variableTypes": ["", "type1", "type2"] - } - ] - }]); -} - -function undefineGetVarBlock() { - delete Blockly.Blocks['get_var_block']; -} diff --git a/packages/scratch-blocks/tests/jsunit/utils_test.js b/packages/scratch-blocks/tests/jsunit/utils_test.js deleted file mode 100644 index 31ccfc187..000000000 --- a/packages/scratch-blocks/tests/jsunit/utils_test.js +++ /dev/null @@ -1,218 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2011 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -function test_genUid() { - var uuids = {}; - for (var i = 0; i < 1000; i++) { - var uuid = Blockly.utils.genUid(); - assertFalse('UUID different: ' + uuid, uuid in uuids); - uuids[uuid] = true; - } -} - -function test_addClass() { - var p = document.createElement('p'); - Blockly.utils.addClass(p, 'one'); - assertEquals('Adding "one"', 'one', p.className); - Blockly.utils.addClass(p, 'one'); - assertEquals('Adding duplicate "one"', 'one', p.className); - Blockly.utils.addClass(p, 'two'); - assertEquals('Adding "two"', 'one two', p.className); - Blockly.utils.addClass(p, 'two'); - assertEquals('Adding duplicate "two"', 'one two', p.className); - Blockly.utils.addClass(p, 'three'); - assertEquals('Adding "three"', 'one two three', p.className); -} - -function test_hasClass() { - var p = document.createElement('p'); - p.className = ' one three two three '; - assertTrue('Has "one"', Blockly.utils.hasClass(p, 'one')); - assertTrue('Has "two"', Blockly.utils.hasClass(p, 'two')); - assertTrue('Has "three"', Blockly.utils.hasClass(p, 'three')); - assertFalse('Has no "four"', Blockly.utils.hasClass(p, 'four')); - assertFalse('Has no "t"', Blockly.utils.hasClass(p, 't')); - } - -function test_removeClass() { - var p = document.createElement('p'); - p.className = ' one three two three '; - Blockly.utils.removeClass(p, 'two'); - assertEquals('Removing "two"', 'one three three', p.className); - Blockly.utils.removeClass(p, 'four'); - assertEquals('Removing "four"', 'one three three', p.className); - Blockly.utils.removeClass(p, 'three'); - assertEquals('Removing "three"', 'one', p.className); - Blockly.utils.removeClass(p, 'ne'); - assertEquals('Removing "ne"', 'one', p.className); - Blockly.utils.removeClass(p, 'one'); - assertEquals('Removing "one"', '', p.className); - Blockly.utils.removeClass(p, 'zero'); - assertEquals('Removing "zero"', '', p.className); -} - -function test_shortestStringLength() { - var len = Blockly.utils.shortestStringLength('one,two,three,four,five'.split(',')); - assertEquals('Length of "one"', 3, len); - len = Blockly.utils.shortestStringLength('one,two,three,four,five,'.split(',')); - assertEquals('Length of ""', 0, len); - len = Blockly.utils.shortestStringLength(['Hello World']); - assertEquals('List of one', 11, len); - len = Blockly.utils.shortestStringLength([]); - assertEquals('Empty list', 0, len); -} - -function test_commonWordPrefix() { - var len = Blockly.utils.commonWordPrefix('one,two,three,four,five'.split(',')); - assertEquals('No prefix', 0, len); - len = Blockly.utils.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(',')); - assertEquals('No word prefix', 0, len); - len = Blockly.utils.commonWordPrefix('abc de,abc de,abc de,abc de'.split(',')); - assertEquals('Full equality', 6, len); - len = Blockly.utils.commonWordPrefix('abc deX,abc deY'.split(',')); - assertEquals('One word prefix', 4, len); - len = Blockly.utils.commonWordPrefix('abc de,abc deY'.split(',')); - assertEquals('Overflow no', 4, len); - len = Blockly.utils.commonWordPrefix('abc de,abc de Y'.split(',')); - assertEquals('Overflow yes', 6, len); - len = Blockly.utils.commonWordPrefix(['Hello World']); - assertEquals('List of one', 11, len); - len = Blockly.utils.commonWordPrefix([]); - assertEquals('Empty list', 0, len); - len = Blockly.utils.commonWordPrefix('turn left,turn right'.split(',')); - assertEquals('No prefix due to &nbsp;', 0, len); - len = Blockly.utils.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(',')); - assertEquals('No prefix due to \\u00A0', 0, len); -} - -function test_commonWordSuffix() { - var len = Blockly.utils.commonWordSuffix('one,two,three,four,five'.split(',')); - assertEquals('No prefix', 0, len); - len = Blockly.utils.commonWordSuffix('oneX,twoX,threeX,fourX,fiveX'.split(',')); - assertEquals('No word prefix', 0, len); - len = Blockly.utils.commonWordSuffix('abc de,abc de,abc de,abc de'.split(',')); - assertEquals('Full equality', 6, len); - len = Blockly.utils.commonWordSuffix('Xabc de,Yabc de'.split(',')); - assertEquals('One word prefix', 3, len); - len = Blockly.utils.commonWordSuffix('abc de,Yabc de'.split(',')); - assertEquals('Overflow no', 3, len); - len = Blockly.utils.commonWordSuffix('abc de,Y abc de'.split(',')); - assertEquals('Overflow yes', 6, len); - len = Blockly.utils.commonWordSuffix(['Hello World']); - assertEquals('List of one', 11, len); - len = Blockly.utils.commonWordSuffix([]); - assertEquals('Empty list', 0, len); -} - -function test_tokenizeInterpolation() { - var tokens = Blockly.utils.tokenizeInterpolation(''); - assertArrayEquals('Null interpolation', [], tokens); - - tokens = Blockly.utils.tokenizeInterpolation('Hello'); - assertArrayEquals('No interpolation', ['Hello'], tokens); - - tokens = Blockly.utils.tokenizeInterpolation('Hello%World'); - assertArrayEquals('Unescaped %.', ['Hello%World'], tokens); - - tokens = Blockly.utils.tokenizeInterpolation('Hello%%World'); - assertArrayEquals('Escaped %.', ['Hello%World'], tokens); - - tokens = Blockly.utils.tokenizeInterpolation('Hello %1 World'); - assertArrayEquals('Interpolation.', ['Hello ', 1, ' World'], tokens); - - tokens = Blockly.utils.tokenizeInterpolation('%123Hello%456World%789'); - assertArrayEquals('Interpolations.', [123, 'Hello', 456, 'World', 789], tokens); - - tokens = Blockly.utils.tokenizeInterpolation('%%%x%%0%00%01%'); - assertArrayEquals('Torture interpolations.', ['%%x%0', 0, 1, '%'], tokens); - - Blockly.Msg = Blockly.Msg || {}; - - Blockly.Msg.STRING_REF = 'test string'; - tokens = Blockly.utils.tokenizeInterpolation('%{bky_string_ref}'); - assertArrayEquals('String table reference, lowercase', ['test string'], tokens); - tokens = Blockly.utils.tokenizeInterpolation('%{BKY_STRING_REF}'); - assertArrayEquals('String table reference, uppercase', ['test string'], tokens); - - Blockly.Msg.WITH_PARAM = 'before %1 after'; - tokens = Blockly.utils.tokenizeInterpolation('%{bky_with_param}'); - assertArrayEquals('String table reference, with parameter', ['before ', 1, ' after'], tokens); - - Blockly.Msg.RECURSE = 'before %{bky_string_ref} after'; - tokens = Blockly.utils.tokenizeInterpolation('%{bky_recurse}'); - assertArrayEquals('String table reference, with subreference', ['before test string after'], tokens); - - // Error cases... - tokens = Blockly.utils.tokenizeInterpolation('%{bky_undefined}'); - assertArrayEquals('Undefined string table reference', ['%{bky_undefined}'], tokens); - - Blockly.Msg['1'] = 'Will not match'; - tokens = Blockly.utils.tokenizeInterpolation('before %{1} after'); - assertArrayEquals('Invalid initial digit in string table reference', ['before %{1} after'], tokens); - - Blockly.Msg['TWO WORDS'] = 'Will not match'; - tokens = Blockly.utils.tokenizeInterpolation('before %{two words} after'); - assertArrayEquals('Invalid character in string table reference: space', ['before %{two words} after'], tokens); - - Blockly.Msg['TWO-WORDS'] = 'Will not match'; - tokens = Blockly.utils.tokenizeInterpolation('before %{two-words} after'); - assertArrayEquals('Invalid character in string table reference: dash', ['before %{two-words} after'], tokens); - - Blockly.Msg['TWO.WORDS'] = 'Will not match'; - tokens = Blockly.utils.tokenizeInterpolation('before %{two.words} after'); - assertArrayEquals('Invalid character in string table reference: period', ['before %{two.words} after'], tokens); - - Blockly.Msg['AB&C'] = 'Will not match'; - tokens = Blockly.utils.tokenizeInterpolation('before %{ab&c} after'); - assertArrayEquals('Invalid character in string table reference: &', ['before %{ab&c} after'], tokens); - - Blockly.Msg['UNCLOSED'] = 'Will not match'; - tokens = Blockly.utils.tokenizeInterpolation('before %{unclosed'); - assertArrayEquals('String table reference, with parameter', ['before %{unclosed'], tokens); -} - -function test_replaceMessageReferences() { - Blockly.Msg = Blockly.Msg || {}; - Blockly.Msg.STRING_REF = 'test string'; - - var resultString = Blockly.utils.replaceMessageReferences(''); - assertEquals('Empty string produces empty string', '', resultString); - - resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref}'); - assertEquals('Message ref dereferenced.', 'test string', resultString); - resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref} after'); - assertEquals('Message ref dereferenced.', 'before test string after', resultString); - - resultString = Blockly.utils.replaceMessageReferences('%1'); - assertEquals('Interpolation tokens ignored.', '%1', resultString); - resultString = Blockly.utils.replaceMessageReferences('%1 %2'); - assertEquals('Interpolation tokens ignored.', '%1 %2', resultString); - resultString = Blockly.utils.replaceMessageReferences('before %1 after'); - assertEquals('Interpolation tokens ignored.', 'before %1 after', resultString); - - resultString = Blockly.utils.replaceMessageReferences('%%'); - assertEquals('Escaped %', '%', resultString); - resultString = Blockly.utils.replaceMessageReferences('%%{bky_string_ref}'); - assertEquals('Escaped %', '%{bky_string_ref}', resultString); - - resultString = Blockly.utils.replaceMessageReferences('%a'); - assertEquals('Unrecognized % escape code treated as literal', '%a', resultString); -} diff --git a/packages/scratch-blocks/tests/jsunit/variable_map_test.js b/packages/scratch-blocks/tests/jsunit/variable_map_test.js deleted file mode 100644 index 0b72e2c01..000000000 --- a/packages/scratch-blocks/tests/jsunit/variable_map_test.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for variable map. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -var variable_map; -var mockControl_; -var workspace; - -function variableMapTest_setUp() { - workspace = new Blockly.Workspace(); - variable_map = new Blockly.VariableMap(workspace); - mockControl_ = new goog.testing.MockControl(); -} - -function variableMapTest_tearDown() { - workspace.dispose(); - mockControl_.$tearDown(); - variable_map = null; -} - -function test_getVariable_ByNameAndType() { - variableMapTest_setUp(); - var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); - var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); - var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); - var result_1 = variable_map.getVariable('name1', 'type1'); - var result_2 = variable_map.getVariable('name2', 'type1'); - var result_3 = variable_map.getVariable('name3', 'type2'); - - // Searching by name + type is correct. - assertEquals(var_1, result_1); - assertEquals(var_2, result_2); - assertEquals(var_3, result_3); - - // Searching only by name defaults to the '' type. - assertNull(variable_map.getVariable('name1')); - assertNull(variable_map.getVariable('name2')); - assertNull(variable_map.getVariable('name3')); - variableMapTest_tearDown(); -} - -function test_getVariable_NotFound() { - variableMapTest_setUp(); - var result = variable_map.getVariable('name1'); - assertNull(result); - variableMapTest_tearDown(); -} - -function test_getVariableById_Trivial() { - variableMapTest_setUp(); - var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); - var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); - var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); - var result_1 = variable_map.getVariableById('id1'); - var result_2 = variable_map.getVariableById('id2'); - var result_3 = variable_map.getVariableById('id3'); - - assertEquals(var_1, result_1); - assertEquals(var_2, result_2); - assertEquals(var_3, result_3); - variableMapTest_tearDown(); -} - -function test_getVariableById_NotFound() { - variableMapTest_setUp(); - var result = variable_map.getVariableById('id1'); - assertNull(result); - variableMapTest_tearDown(); -} - -function test_createVariableTrivial() { - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - checkVariableValues(variable_map, 'name1', 'type1', 'id1'); - variableMapTest_tearDown(); -} - -function test_createVariableAlreadyExists() { - // Expect that when the variable already exists, the variableMap_ is unchanged. - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - - // Assert there is only one variable in the variable_map. - var keys = Object.keys(variable_map.variableMap_); - assertEquals(1, keys.length); - var varMapLength = variable_map.variableMap_[keys[0]].length; - assertEquals(1, varMapLength); - - variable_map.createVariable('name1', 'type1'); - checkVariableValues(variable_map, 'name1', 'type1', 'id1'); - // Check that the size of the variableMap_ did not change. - keys = Object.keys(variable_map.variableMap_); - assertEquals(1, keys.length); - varMapLength = variable_map.variableMap_[keys[0]].length; - assertEquals(1, varMapLength); - variableMapTest_tearDown(); -} - -function test_createVariableNameAlreadyExists() { - // Expect that when a variable with the same name but a different type already - // exists, the new variable is created. - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - - // Assert there is only one variable in the variable_map. - var keys = Object.keys(variable_map.variableMap_); - assertEquals(1, keys.length); - var varMapLength = variable_map.variableMap_[keys[0]].length; - assertEquals(1, varMapLength); - - variable_map.createVariable('name1', 'type2', 'id2'); - checkVariableValues(variable_map, 'name1', 'type1', 'id1'); - checkVariableValues(variable_map, 'name1', 'type2', 'id2'); - // Check that the size of the variableMap_ did change. - keys = Object.keys(variable_map.variableMap_); - assertEquals(2, keys.length); - variableMapTest_tearDown(); -} -function test_createVariableNullAndUndefinedType() { - variableMapTest_setUp(); - variable_map.createVariable('name1', null, 'id1'); - variable_map.createVariable('name2', undefined, 'id2'); - - checkVariableValues(variable_map, 'name1', '', 'id1'); - checkVariableValues(variable_map, 'name2', '', 'id2'); - variableMapTest_tearDown(); -} - -function test_createVariableNullId() { - variableMapTest_setUp(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '2']); - try { - variable_map.createVariable('name1', 'type1', null); - checkVariableValues(variable_map, 'name1', 'type1', '1'); - } - finally { - variableMapTest_tearDown(); - } -} - -function test_createVariableUndefinedId() { - variableMapTest_setUp(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '2']); - try { - variable_map.createVariable('name1', 'type1', undefined); - checkVariableValues(variable_map, 'name1', 'type1', '1'); - } - finally { - variableMapTest_tearDown(); - } -} - -function test_createVariableIdAlreadyExists() { - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - try { - variable_map.createVariable('name2', 'type2', 'id1'); - fail(); - } catch (e) { - // expected - } - variableMapTest_tearDown(); -} - -function test_createVariableMismatchedIdAndType() { - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - try { - variable_map.createVariable('name1', 'type2', 'id1'); - fail(); - } catch (e) { - // expected - } - try { - variable_map.createVariable('name1', 'type1', 'id2'); - fail(); - } catch (e) { - // expected - } - variableMapTest_tearDown(); -} - -function test_createVariableTwoSameTypes() { - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - variable_map.createVariable('name2', 'type1', 'id2'); - - checkVariableValues(variable_map, 'name1', 'type1', 'id1'); - checkVariableValues(variable_map, 'name2', 'type1', 'id2'); - variableMapTest_tearDown(); -} - -function test_getVariablesOfType_Trivial() { - variableMapTest_setUp(); - var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); - var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); - variable_map.createVariable('name3', 'type2', 'id3'); - variable_map.createVariable('name4', 'type3', 'id4'); - var result_array_1 = variable_map.getVariablesOfType('type1'); - var result_array_2 = variable_map.getVariablesOfType('type5'); - isEqualArrays([var_1, var_2], result_array_1); - isEqualArrays([], result_array_2); - variableMapTest_tearDown(); -} - -function test_getVariablesOfType_Null() { - variableMapTest_setUp(); - var var_1 = variable_map.createVariable('name1', '', 'id1'); - var var_2 = variable_map.createVariable('name2', '', 'id2'); - var var_3 = variable_map.createVariable('name3', '', 'id3'); - variable_map.createVariable('name4', 'type1', 'id4'); - var result_array = variable_map.getVariablesOfType(null); - isEqualArrays([var_1, var_2, var_3], result_array); - variableMapTest_tearDown(); -} - -function test_getVariablesOfType_EmptyString() { - variableMapTest_setUp(); - var var_1 = variable_map.createVariable('name1', null, 'id1'); - var var_2 = variable_map.createVariable('name2', null, 'id2'); - var result_array = variable_map.getVariablesOfType(''); - isEqualArrays([var_1, var_2], result_array); - variableMapTest_tearDown(); -} - -function test_getVariablesOfType_Deleted() { - variableMapTest_setUp(); - var variable = variable_map.createVariable('name1', null, 'id1'); - variable_map.deleteVariable(variable); - var result_array = variable_map.getVariablesOfType(''); - isEqualArrays([], result_array); - variableMapTest_tearDown(); -} - -function test_getVariablesOfType_DoesNotExist() { - variableMapTest_setUp(); - var result_array = variable_map.getVariablesOfType('type1'); - isEqualArrays([], result_array); - variableMapTest_tearDown(); -} - -function test_getVariableTypes_Trivial() { - variableMapTest_setUp(); - variable_map.createVariable('name1', 'type1', 'id1'); - variable_map.createVariable('name2', 'type1', 'id2'); - variable_map.createVariable('name3', 'type2', 'id3'); - variable_map.createVariable('name4', 'type3', 'id4'); - var result_array = variable_map.getVariableTypes(); - // The empty string is always an option. - isEqualArrays(['type1', 'type2', 'type3', ''], result_array); - variableMapTest_tearDown(); -} - -function test_getVariableTypes_None() { - variableMapTest_setUp(); - // The empty string is always an option. - var result_array = variable_map.getVariableTypes(); - isEqualArrays([''], result_array); - variableMapTest_tearDown(); -} - -function test_getAllVariables_Trivial() { - variableMapTest_setUp(); - var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); - var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); - var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); - var result_array = variable_map.getAllVariables(); - isEqualArrays([var_1, var_2, var_3], result_array); - variableMapTest_tearDown(); -} - -function test_getAllVariables_None() { - variableMapTest_setUp(); - var result_array = variable_map.getAllVariables(); - isEqualArrays([], result_array); - variableMapTest_tearDown(); -} diff --git a/packages/scratch-blocks/tests/jsunit/variable_model_test.js b/packages/scratch-blocks/tests/jsunit/variable_model_test.js deleted file mode 100644 index 3f22f287a..000000000 --- a/packages/scratch-blocks/tests/jsunit/variable_model_test.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - -/** - * @fileoverview Tests for variable model. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -var variable; -var workspace; - -function variableModelTest_setUp() { - workspace = new Blockly.Workspace(); -} - -function variableModelTest_tearDown() { - workspace.dispose(); - variable = null; -} - -/** - * These tests check the constructor of the variable model. - */ -function testInit_Trivial() { - variableModelTest_setUp(); - variable = new Blockly.VariableModel(workspace, 'test', 'test_type', - 'test_id'); - assertEquals('test', variable.name); - assertEquals('test_type', variable.type); - assertEquals('test_id', variable.id_); - variableModelTest_tearDown(); -} - -function testInit_NullType() { - variableModelTest_setUp(); - variable = new Blockly.VariableModel(workspace, 'test', null, 'test_id'); - assertEquals('', variable.type); - variableModelTest_tearDown(); -} - -function testInit_UndefinedType() { - variableModelTest_setUp(); - variable = new Blockly.VariableModel(workspace, 'test', undefined, 'test_id'); - assertEquals('', variable.type); - variableModelTest_tearDown(); -} - -function testInit_NullId() { - variableModelTest_setUp(); - variable = new Blockly.VariableModel(workspace, 'test', 'test_type', null); - assertEquals('test', variable.name); - assertEquals('test_type', variable.type); - assertNotNull(variable.id_); - variableModelTest_tearDown(); -} - -function testInit_UndefinedId() { - variableModelTest_setUp(); - variable = new Blockly.VariableModel(workspace, 'test', 'test_type', undefined); - assertEquals('test', variable.name); - assertEquals('test_type', variable.type); - assertNotNull(variable.id_); - variableModelTest_tearDown(); -} - -function testInit_OnlyNameProvided() { - variableModelTest_setUp(); - variable = new Blockly.VariableModel(workspace, 'test'); - assertEquals('test', variable.name); - assertEquals('', variable.type); - assertNotNull(variable.id_); - variableModelTest_tearDown(); -} diff --git a/packages/scratch-blocks/tests/jsunit/vertical_tests.html b/packages/scratch-blocks/tests/jsunit/vertical_tests.html deleted file mode 100644 index 5dd91b976..000000000 --- a/packages/scratch-blocks/tests/jsunit/vertical_tests.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - Unit Tests for Vertical Scratch-Blockly - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/scratch-blocks/tests/jsunit/widget_div_test.js b/packages/scratch-blocks/tests/jsunit/widget_div_test.js deleted file mode 100644 index e43cde217..000000000 --- a/packages/scratch-blocks/tests/jsunit/widget_div_test.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); - -function widgetdiv_testHelper_makeBBox(left, top, width, height) { - return { - left: left, - right: left + width, - top: top, - bottom: top + height - }; -} - -function widgetdiv_testHelper_makeSize(width, height) { - return { - width: width, - height: height - }; -} - -var widgetDiv_test_viewport = widgetdiv_testHelper_makeBBox(0, 0, 1000, 1000); -var widgetDiv_test_widgetSize = widgetdiv_testHelper_makeSize(100, 100); - -// Anchor is always 90 px wide and 90 px tall for this test. -var widgetDiv_test_anchorSize = 90; - -function widgetdiv_testHelper_makeAnchor(left, top) { - return { - left: left, - right: left + widgetDiv_test_anchorSize, - top: top, - bottom: top + widgetDiv_test_anchorSize - }; -} - -function test_widgetDiv_topConflict() { - var anchorTop = 50; - // Anchor placed close to the top. - var anchorBBox = widgetdiv_testHelper_makeAnchor(500, anchorTop); - - // The widget div should be placed just below the anchor. - var calculated = Blockly.WidgetDiv.calculateY_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize); - assertEquals(anchorTop + widgetDiv_test_anchorSize, calculated); -} - -function test_widgetDiv_bottomConflict() { - var anchorTop = 900; - // Anchor placed close to the bottom. - var anchorBBox = widgetdiv_testHelper_makeAnchor(500, anchorTop); - - // The widget div should be placed just above the anchor. - var calculated = Blockly.WidgetDiv.calculateY_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize); - assertEquals(anchorTop - widgetDiv_test_widgetSize.height, calculated); -} - -function test_widgetDiv_noYConflict() { - var anchorTop = 500; - // Anchor placed in the middle. - var anchorBBox = widgetdiv_testHelper_makeAnchor(500, anchorTop); - - // The widget div should be placed just below the anchor. - var calculated = Blockly.WidgetDiv.calculateY_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize); - assertEquals(anchorTop + widgetDiv_test_anchorSize, calculated); -} - - -function test_widgetDiv_leftConflict_LTR() { - var anchorLeft = 50; - // Anchor placed close to the left side. - var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); - - // The widget div should be placed at the anchor. - var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize, false /* rtl */); - assertEquals(anchorLeft, calculated); -} - -function test_widgetDiv_rightConflict_LTR() { - var anchorLeft = 950; - // Anchor placed close to the right side. - var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); - - // The widget div should be placed as far right as possible--at the edge of - // the screen. - var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize, false /* rtl */); - assertEquals(1000 - widgetDiv_test_widgetSize.width, calculated); -} - -function test_widgetDiv_noXConflict_LTR() { - var anchorLeft = 500; - // Anchor in the middle - var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); - // The widget div should be placed just at the left side of the anchor. - var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize, false /* rtl */); - assertEquals(anchorLeft, calculated); -} - -function test_widgetDiv_leftConflict_RTL() { - var anchorLeft = 10; - // Anchor placed close to the left side. - var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); - // The widget div should be placed as far left as possible--at the edge of - // the screen. - var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize, true /* rtl */); - assertEquals(0, calculated); -} - -function test_widgetDiv_rightConflict_RTL() { - var anchorLeft = 950; - // Anchor placed close to the right side. - var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); - - // The widget div should be placed as far right as possible--at the edge of - // the screen. - var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize, true /* rtl */); - assertEquals(1000 - widgetDiv_test_widgetSize.width, calculated); -} - -function test_widgetDiv_noXConflict_RTL() { - var anchorLeft = 500; - // anchor placed in the middle - var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); - // The widget div should be placed at the right side of the anchor. - var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, - anchorBBox, widgetDiv_test_widgetSize, true /* rtl */); - assertEquals(anchorBBox.right - widgetDiv_test_widgetSize.width, calculated); -} - diff --git a/packages/scratch-blocks/tests/jsunit/workspace_comment_test.js b/packages/scratch-blocks/tests/jsunit/workspace_comment_test.js deleted file mode 100644 index 727e0bed6..000000000 --- a/packages/scratch-blocks/tests/jsunit/workspace_comment_test.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); - -var workspace; - -function workspaceCommentTest_setUp() { - workspace = new Blockly.Workspace(); -} - -function workspaceCommentTest_tearDown() { - workspace.dispose(); -} - -function test_noWorkspaceComments() { - workspaceCommentTest_setUp(); - try { - assertEquals('Empty workspace: no comments (1).', 0, workspace.getTopComments(true).length); - assertEquals('Empty workspace: no comments (2).', 0, workspace.getTopComments(false).length); - workspace.clear(); - assertEquals('Empty workspace: no comments (3).', 0, workspace.getTopComments(true).length); - assertEquals('Empty workspace: no comments (4).', 0, workspace.getTopComments(false).length); - } finally { - workspaceCommentTest_tearDown(); - } -} - -function test_oneWorkspaceComment() { - workspaceCommentTest_setUp(); - try { - var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, false, 'comment id'); - assertEquals('One comment on workspace (1).', 1, workspace.getTopComments(true).length); - assertEquals('One comment on workspace (2).', 1, workspace.getTopComments(false).length); - assertEquals('Comment db contains this comment.', comment, workspace.commentDB_['comment id']); - workspace.clear(); - assertEquals('Cleared workspace: no comments (3).', 0, workspace.getTopComments(true).length); - assertEquals('Cleared workspace: no comments (4).', 0, workspace.getTopComments(false).length); - assertFalse('Comment DB does not contain this comment.', 'comment id' in workspace.commentDB_); - } finally { - workspaceCommentTest_tearDown(); - } -} - -function test_getWorkspaceCommentById() { - workspaceCommentTest_setUp(); - try { - var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, false, 'comment id'); - assertEquals('Getting a comment by id.', comment, workspace.getCommentById('comment id')); - assertEquals('No comment found.', null, workspace.getCommentById('not a comment')); - comment.dispose(); - assertEquals('Can\'t find the comment.', null, workspace.getCommentById('comment id')); - } finally { - workspaceCommentTest_tearDown(); - } -} - -function test_disposeWsCommentTwice() { - workspaceCommentTest_setUp(); - try { - var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, false, 'comment id'); - comment.dispose(); - // Nothing should go wrong the second time dispose is called. - comment.dispose(); - }finally { - workspaceCommentTest_tearDown(); - } -} - -function test_wsCommentHeightWidth() { - workspaceCommentTest_setUp(); - try { - var comment = - new Blockly.WorkspaceComment(workspace, 'comment text', 10, 20, false, 'comment id'); - assertEquals('Initial width', 20, comment.getWidth()); - assertEquals('Initial height', 10, comment.getHeight()); - - comment.setWidth(30); - assertEquals('New width should be different', 30, comment.getWidth()); - assertEquals('New height should not be different', 10, comment.getHeight()); - - comment.setHeight(40); - assertEquals('New width should not be different', 30, comment.getWidth()); - assertEquals('New height should be different', 40, comment.getHeight()); - comment.dispose(); - } finally { - workspaceCommentTest_tearDown(); - } -} - -function test_wsCommentXY() { - workspaceCommentTest_setUp(); - try { - var comment = - new Blockly.WorkspaceComment(workspace, 'comment text', 10, 20, false, 'comment id'); - var xy = comment.getXY(); - assertEquals('Initial X position', 0, xy.x); - assertEquals('Initial Y position', 0, xy.y); - - comment.moveBy(10, 100); - xy = comment.getXY(); - assertEquals('New X position', 10, xy.x); - assertEquals('New Y position', 100, xy.y); - comment.dispose(); - } finally { - workspaceCommentTest_tearDown(); - } -} - -function test_wsCommentText() { - workspaceCommentTest_setUp(); - - Blockly.Events.fire = temporary_fireEvent; - temporary_fireEvent.firedEvents_ = []; - try { - var comment = - new Blockly.WorkspaceComment(workspace, 'comment text', 10, 20, false, 'comment id'); - assertEquals( - 'Check comment text', 'comment text', comment.getText()); - assertEquals( - 'Workspace undo stack has one event', 1, workspace.undoStack_.length); - - comment.setText('comment text'); - assertEquals( - 'Comment text has not changed', 'comment text', comment.getText()); - // Setting the text to the old value does not fire an event. - assertEquals( - 'Workspace undo stack has one event', 1, workspace.undoStack_.length); - - comment.setText('new comment text'); - assertEquals( - 'Comment text has changed', 'new comment text', comment.getText()); - assertEquals( - 'Workspace undo stack has two events', 2, workspace.undoStack_.length); - comment.dispose(); - } finally { - workspaceCommentTest_tearDown(); - Blockly.Events.fire = savedFireFunc; - } -} - -function test_workspaceCommentMinimized() { - workspaceCommentTest_setUp(); - try { - var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, true, 'comment id'); - assertEquals('Comment is minimized', true, comment.isMinimized()); - } finally { - workspaceCommentTest_tearDown(); - } -} - -function test_workspaceCommentMinimizedFromXml() { - workspaceCommentTest_setUp(); - try { - var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, true, 'comment id'); - var commentXml = comment.toXml(); - var xml = goog.dom.createDom('xml'); - xml.appendChild(commentXml); - comment.dispose(); - assertEquals('Comment is no longer on workspace', null, workspace.getCommentById('comment id')); - Blockly.Xml.domToWorkspace(xml, workspace); - var importedComment = workspace.getCommentById('comment id'); - assertNotEquals('Comment loaded from xml is on workspace', null, importedComment) - assertEquals('Imported comment is minimized', true, importedComment.isMinimized()); - } finally { - workspaceCommentTest_tearDown(); - } -} diff --git a/packages/scratch-blocks/tests/jsunit/workspace_test.js b/packages/scratch-blocks/tests/jsunit/workspace_test.js deleted file mode 100644 index 378da255a..000000000 --- a/packages/scratch-blocks/tests/jsunit/workspace_test.js +++ /dev/null @@ -1,371 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2012 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -var workspace; -var mockControl_; - -function workspaceTest_setUp() { - defineGetVarBlock(); - workspace = new Blockly.Workspace(); - mockControl_ = new goog.testing.MockControl(); -} - -function workspaceTest_tearDown() { - undefineGetVarBlock(); - mockControl_.$tearDown(); - workspace.dispose(); -} - -function test_emptyWorkspace() { - workspaceTest_setUp(); - try { - assertEquals('Empty workspace (1).', 0, workspace.getTopBlocks(true).length); - assertEquals('Empty workspace (2).', 0, workspace.getTopBlocks(false).length); - assertEquals('Empty workspace (3).', 0, workspace.getAllBlocks().length); - workspace.clear(); - assertEquals('Empty workspace (4).', 0, workspace.getTopBlocks(true).length); - assertEquals('Empty workspace (5).', 0, workspace.getTopBlocks(false).length); - assertEquals('Empty workspace (6).', 0, workspace.getAllBlocks().length); - } - finally { - workspaceTest_tearDown(); - } -} - -function test_flatWorkspace() { - workspaceTest_setUp(); - try { - var blockA = workspace.newBlock(''); - assertEquals('One block workspace (1).', 1, workspace.getTopBlocks(true).length); - assertEquals('One block workspace (2).', 1, workspace.getTopBlocks(false).length); - assertEquals('One block workspace (3).', 1, workspace.getAllBlocks().length); - var blockB = workspace.newBlock(''); - assertEquals('Two block workspace (1).', 2, workspace.getTopBlocks(true).length); - assertEquals('Two block workspace (2).', 2, workspace.getTopBlocks(false).length); - assertEquals('Two block workspace (3).', 2, workspace.getAllBlocks().length); - blockA.dispose(); - assertEquals('One block workspace (4).', 1, workspace.getTopBlocks(true).length); - assertEquals('One block workspace (5).', 1, workspace.getTopBlocks(false).length); - assertEquals('One block workspace (6).', 1, workspace.getAllBlocks().length); - workspace.clear(); - assertEquals('Cleared workspace (1).', 0, workspace.getTopBlocks(true).length); - assertEquals('Cleared workspace (2).', 0, workspace.getTopBlocks(false).length); - assertEquals('Cleared workspace (3).', 0, workspace.getAllBlocks().length); - } finally { - workspaceTest_tearDown(); - } -} - -function test_getWorkspaceById() { - var workspaceA = new Blockly.Workspace(); - var workspaceB = new Blockly.Workspace(); - try { - assertEquals('Find workspaceA.', workspaceA, - Blockly.Workspace.getById(workspaceA.id)); - assertEquals('Find workspaceB.', workspaceB, - Blockly.Workspace.getById(workspaceB.id)); - assertEquals('No workspace found.', null, - Blockly.Workspace.getById('I do not exist.')); - workspaceA.dispose(); - assertEquals('Can\'t find workspaceA.', null, - Blockly.Workspace.getById(workspaceA.id)); - assertEquals('WorkspaceB exists.', workspaceB, - Blockly.Workspace.getById(workspaceB.id)); - } finally { - workspaceB.dispose(); - workspaceA.dispose(); - } -} - -function test_getBlockById() { - workspaceTest_setUp(); - try { - var blockA = workspace.newBlock(''); - var blockB = workspace.newBlock(''); - assertEquals('Find blockA.', blockA, workspace.getBlockById(blockA.id)); - assertEquals('Find blockB.', blockB, workspace.getBlockById(blockB.id)); - assertEquals('No block found.', null, - workspace.getBlockById('I do not exist.')); - blockA.dispose(); - assertEquals('Can\'t find blockA.', null, workspace.getBlockById(blockA.id)); - assertEquals('BlockB exists.', blockB, workspace.getBlockById(blockB.id)); - workspace.clear(); - assertEquals('Can\'t find blockB.', null, workspace.getBlockById(blockB.id)); - } finally { - workspaceTest_tearDown(); - } -} - -function test_deleteVariable_InternalTrivial() { - workspaceTest_setUp(); - var var_1 = workspace.createVariable('name1', 'type1', 'id1'); - workspace.createVariable('name2', 'type2', 'id2'); - createMockBlock('id1'); - createMockBlock('id1'); - createMockBlock('id2'); - - var uses = workspace.getVariableUsesById(var_1.getId()); - workspace.deleteVariableInternal_(var_1, uses); - - var variable = workspace.getVariableById('id1'); - var block_var_name = workspace.topBlocks_[0].getVarModels()[0].name; - assertNull(variable); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - assertEquals('name2', block_var_name); - workspaceTest_tearDown(); -} - -// TODO(marisaleung): Test the alert for deleting a variable that is a procedure. - -function test_addTopBlock_TrivialFlyoutIsTrue() { - workspaceTest_setUp(); - var targetWorkspace = new Blockly.Workspace(); - workspace.isFlyout = true; - workspace.targetWorkspace = targetWorkspace; - targetWorkspace.createVariable('name1', '', '1'); - - // Flyout.init usually does this binding. - workspace.variableMap_ = targetWorkspace.getVariableMap(); - - try { - var block = createMockBlock('1'); - workspace.removeTopBlock(block); - workspace.addTopBlock(block); - checkVariableValues(workspace, 'name1', '', '1'); - } finally { - workspaceTest_tearDown(); - // Have to dispose of the main workspace after the flyout workspace, because - // it holds the variable map. - // Normally the main workspace disposes of the flyout workspace. - targetWorkspace.dispose(); - } -} - -function test_clear_Trivial() { - workspaceTest_setUp(); - workspace.createVariable('name1', 'type1', 'id1'); - workspace.createVariable('name2', 'type2', 'id2'); - setUpMockMethod(mockControl_, Blockly.Events, 'setGroup', [true, false], - null); - - try { - workspace.clear(); - var topBlocks_length = workspace.topBlocks_.length; - var varMapLength = Object.keys(workspace.variableMap_.variableMap_).length; - assertEquals(0, topBlocks_length); - assertEquals(0, varMapLength); - } - finally { - workspaceTest_tearDown(); - } -} - -function test_clear_NoVariables() { - workspaceTest_setUp(); - setUpMockMethod(mockControl_, Blockly.Events, 'setGroup', [true, false], - null); - - try { - workspace.clear(); - var topBlocks_length = workspace.topBlocks_.length; - var varMapLength = Object.keys(workspace.variableMap_.variableMap_).length; - assertEquals(0, topBlocks_length); - assertEquals(0, varMapLength); - } - finally { - workspaceTest_tearDown(); - } -} - -function test_renameVariable_NoReference() { - // Test renaming a variable in the simplest case: when no blocks refer to it. - workspaceTest_setUp(); - var id = 'id1'; - var type = 'type1'; - var oldName = 'name1'; - var newName = 'name2'; - workspace.createVariable(oldName, type, id); - - try { - workspace.renameVariableById(id, newName); - checkVariableValues(workspace, newName, type, id); - // Renaming should not have created a new variable. - assertEquals(1, workspace.getAllVariables().length); - } finally { - workspaceTest_tearDown(); - } -} - -function test_renameVariable_ReferenceExists() { - // Test renaming a variable when a reference to it exists. - // Expect 'renameVariable' to change oldName variable name to newName. - workspaceTest_setUp(); - var newName = 'name2'; - - createVariableAndBlock(workspace); - - workspace.renameVariableById('id1', newName); - checkVariableValues(workspace, newName, 'type1', 'id1'); - // Renaming should not have created a new variable. - assertEquals(1, workspace.getAllVariables().length); - var block_var_name = workspace.topBlocks_[0].getVarModels()[0].name; - assertEquals(newName, block_var_name); - workspaceTest_tearDown(); -} - -function test_renameVariable_TwoVariablesSameType() { - // Cannot rename variable to a name that already exists - // for a variable of the same type. - // Note: this behavior is different from that of blockly which allows - // renaming variables to a name that already exists if the variables have the - // same type. - workspaceTest_setUp(); - var id1 = 'id1'; - var id2 = 'id2'; - var type = 'type1'; - - var oldName = 'name1'; - var newName = 'name2'; - // Create two variables of the same type. - workspace.createVariable(oldName, type, id1); - workspace.createVariable(newName, type, id2); - // Create blocks to refer to both of them. - createMockBlock(id1); - createMockBlock(id2); - - workspace.renameVariableById(id1, newName); - - // Both variables should retain the same names/ids as before. - checkVariableValues(workspace, oldName, type, id1); - checkVariableValues(workspace, newName, type, id2); - - // Both variables should remain on the workspace. - assertEquals(2, workspace.getAllVariables().length); - - // References should have the correct names. - var block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; - var block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; - assertEquals(oldName, block_var_name_1); - assertEquals(newName, block_var_name_2); - - workspaceTest_tearDown(); -} - -function test_renameVariable_TwoVariablesDifferentType() { - // Expect the rename to succeed, because variables with different types are - // allowed to have the same name. - workspaceTest_setUp(); - createTwoVariablesAndBlocks(workspace); - - var newName = 'name2'; - workspace.renameVariableById('id1', newName); - - checkVariableValues(workspace, newName, 'type1', 'id1'); - checkVariableValues(workspace, newName, 'type2', 'id2'); - - // References shoul have the correct names. - var block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; - var block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; - assertEquals(newName, block_var_name_1); - assertEquals(newName, block_var_name_2); - - workspaceTest_tearDown(); -} - -function test_renameVariable_OldCase() { - // Rename a variable with a single reference. Update only the capitalization. - workspaceTest_setUp(); - var newName = 'Name1'; - - createVariableAndBlock(workspace); - - workspace.renameVariableById('id1', newName); - checkVariableValues(workspace, newName, 'type1', 'id1'); - var variable = workspace.getVariableById('id1'); - assertNotEquals('name1', variable.name); - workspaceTest_tearDown(); -} - -function test_renameVariable_TwoVariablesAndOldCase() { - // Test renaming a variable to an in-use name, but with different - // capitalization. Two variables with different capitalizations should - // co-exist. - // Note: this behavior is different from that of blockly which does not allow - // two variables of the same name to exist with different capitalization. In - // blockly, variable names are case insensitive, so different capitalizations - // of a variable name are treated as the same name. - - workspaceTest_setUp(); - var oldName = 'name1'; - var oldCase = 'Name2'; - var newName = 'name2'; - - var id1 = 'id1'; - var id2 = 'id2'; - - var type = 'type1'; - - workspace.createVariable(oldName, type, id1); - workspace.createVariable(oldCase, type, id2); - createMockBlock(id1); - createMockBlock(id2); - - // Blocks should have the correct variable names - var old_block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; - var old_block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; - assertEquals(oldName, old_block_var_name_1); - assertEquals(oldCase, old_block_var_name_2); - - workspace.renameVariableById(id1, newName); - - // The old variable gets properly renamed to the new name, - // since variables are case sensitive. - checkVariableValues(workspace, newName, type, id1); - - // Both variables should still exist - assertEquals(2, workspace.getAllVariables().length); - - // Block which had oldName should have been updated to use newName, while - // block with oldCase should still have the same name. - var block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; - var block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; - assertEquals(newName, block_var_name_1); - assertNotEquals(old_block_var_name_1, block_var_name_1); - assertEquals(oldCase, block_var_name_2); - assertEquals(old_block_var_name_2, block_var_name_2); - workspaceTest_tearDown(); -} - -function test_deleteVariableById_Trivial() { - workspaceTest_setUp(); - createTwoVariablesAndBlocks(workspace); - - workspace.deleteVariableById('id1'); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - var variable = workspace.getVariableById('id1'); - var block_var_name = workspace.topBlocks_[0].getVarModels()[0].name; - assertNull(variable); - assertEquals('name2', block_var_name); - workspaceTest_tearDown(); -} diff --git a/packages/scratch-blocks/tests/jsunit/workspace_undo_redo_test.js b/packages/scratch-blocks/tests/jsunit/workspace_undo_redo_test.js deleted file mode 100644 index aa960d9f0..000000000 --- a/packages/scratch-blocks/tests/jsunit/workspace_undo_redo_test.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * @license - * Visual Blocks Editor - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ - - /** - * @fileoverview Tests for Blockly.Workspace.undo. - * @author marisaleung@google.com (Marisa Leung) - */ -'use strict'; - -goog.require('goog.events.EventHandler'); -goog.require('goog.testing'); -goog.require('goog.testing.events'); -goog.require('goog.testing.MockControl'); - - -var workspace; -var mockControl_; -var savedFireFunc = Blockly.Events.fire; - -function temporary_fireEvent(event) { - if (!Blockly.Events.isEnabled()) { - return; - } - Blockly.Events.FIRE_QUEUE_.push(event); - Blockly.Events.fireNow_(); -} - -function undoRedoTest_setUp() { - defineGetVarBlock(); - workspace = new Blockly.Workspace(); - mockControl_ = new goog.testing.MockControl(); - Blockly.Events.fire = temporary_fireEvent; -} - -function undoRedoTest_tearDown() { - undefineGetVarBlock(); - mockControl_.$tearDown(); - workspace.dispose(); - Blockly.Events.fire = savedFireFunc; -} - -/** - * Check that the top block with the given index contains a variable with - * the given name. - * @param {number} blockIndex The index of the top block. - * @param {string} name The expected name of the variable in the block. - */ -function undoRedoTest_checkBlockVariableName(blockIndex, name) { - var blockVarName = workspace.topBlocks_[blockIndex].getVarModels()[0].name; - assertEquals(name, blockVarName); -} - -function createTwoVarsEmptyType() { - workspace.createVariable('name1', '', 'id1'); - workspace.createVariable('name2', '', 'id2'); -} - -function createTwoVarsDifferentTypes() { - workspace.createVariable('name1', 'type1', 'id1'); - workspace.createVariable('name2', 'type2', 'id2'); -} - -function test_undoCreateVariable_Trivial() { - undoRedoTest_setUp(); - createTwoVarsDifferentTypes(); - - workspace.undo(); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - assertNull(workspace.getVariableById('id2')); - workspace.undo(); - assertNull(workspace.getVariableById('id1')); - assertNull(workspace.getVariableById('id2')); - undoRedoTest_tearDown(); -} - -function test_redoAndUndoCreateVariable_Trivial() { - undoRedoTest_setUp(); - createTwoVarsDifferentTypes(); - - workspace.undo(); - workspace.undo(true); - - // Expect that variable 'id2' is recreated - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - - workspace.undo(); - workspace.undo(); - workspace.undo(true); - - // Expect that variable 'id1' is recreated - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - assertNull(workspace.getVariableById('id2')); - undoRedoTest_tearDown(); -} - -function test_undoDeleteVariable_NoBlocks() { - undoRedoTest_setUp(); - createTwoVarsDifferentTypes(); - workspace.deleteVariableById('id1'); - workspace.deleteVariableById('id2'); - - workspace.undo(); - assertNull(workspace.getVariableById('id1')); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - - workspace.undo(); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - undoRedoTest_tearDown(); -} - -function test_undoDeleteVariable_WithBlocks() { - undoRedoTest_setUp(); - - createTwoVariablesAndBlocks(workspace); - - workspace.deleteVariableById('id1'); - workspace.deleteVariableById('id2'); - - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name2'); - assertNull(workspace.getVariableById('id1')); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name2'); - undoRedoTest_checkBlockVariableName(1, 'name1'); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - undoRedoTest_tearDown(); -} - -function test_redoAndUndoDeleteVariable_NoBlocks() { - undoRedoTest_setUp(); - - createTwoVarsDifferentTypes(); - - workspace.deleteVariableById('id1'); - workspace.deleteVariableById('id2'); - - workspace.undo(); - workspace.undo(true); - // Expect that both variables are deleted - assertNull(workspace.getVariableById('id1')); - assertNull(workspace.getVariableById('id2')); - - workspace.undo(); - workspace.undo(); - workspace.undo(true); - // Expect that variable 'id2' is recreated - assertNull(workspace.getVariableById('id1')); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - undoRedoTest_tearDown(); -} - -function test_redoAndUndoDeleteVariable_WithBlocks() { - undoRedoTest_setUp(); - - createTwoVariablesAndBlocks(workspace); - - workspace.deleteVariableById('id1'); - workspace.deleteVariableById('id2'); - - workspace.undo(); - workspace.undo(true); - // Expect that both variables are deleted - assertEquals(0, workspace.topBlocks_.length); - assertNull(workspace.getVariableById('id1')); - assertNull(workspace.getVariableById('id2')); - - workspace.undo(); - workspace.undo(); - workspace.undo(true); - // Expect that variable 'id2' is recreated - undoRedoTest_checkBlockVariableName(0, 'name2'); - assertNull(workspace.getVariableById('id1')); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - undoRedoTest_tearDown(); -} - -function test_redoAndUndoDeleteVariableTwice_NoBlocks() { - undoRedoTest_setUp(); - workspace.createVariable('name1', 'type1', 'id1'); - workspace.deleteVariableById('id1'); - workspace.deleteVariableById('id1'); - - // Check the undoStack only recorded one delete event. - var undoStack = workspace.undoStack_; - assertEquals('var_delete', undoStack[undoStack.length-1].type); - assertNotEquals('var_delete', undoStack[undoStack.length-2].type); - - // undo delete - workspace.undo(); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - - // redo delete - workspace.undo(true); - assertNull(workspace.getVariableById('id1')); - - // redo delete, nothing should happen - workspace.undo(true); - assertNull(workspace.getVariableById('id1')); - undoRedoTest_tearDown(); -} - -function test_redoAndUndoDeleteVariableTwice_WithBlocks() { - undoRedoTest_setUp(); - var id = 'id1'; - workspace.createVariable('name1', 'type1', id); - createMockBlock(id); - workspace.deleteVariableById(id); - workspace.deleteVariableById(id); - - // Check the undoStack only recorded one delete event. - var undoStack = workspace.undoStack_; - assertEquals('var_delete', undoStack[undoStack.length-1].type); - assertEquals('delete', undoStack[undoStack.length-2].type); - assertNotEquals('var_delete', undoStack[undoStack.length-3].type); - - // undo delete - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name1'); - checkVariableValues(workspace, 'name1', 'type1', id); - - // redo delete - workspace.undo(true); - assertEquals(0, workspace.topBlocks_.length); - assertNull(workspace.getVariableById(id)); - - // redo delete, nothing should happen - workspace.undo(true); - assertEquals(0, workspace.topBlocks_.length); - assertNull(workspace.getVariableById(id)); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_OneExists_NoBlocks() { - undoRedoTest_setUp(); - workspace.createVariable('name1', '', 'id1'); - workspace.renameVariableById('id1', 'name2'); - - workspace.undo(); - checkVariableValues(workspace, 'name1', '', 'id1'); - - workspace.undo(true); - checkVariableValues(workspace, 'name2', '', 'id1'); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_OneExists_WithBlocks() { - undoRedoTest_setUp(); - workspace.createVariable('name1', '', 'id1'); - createMockBlock('id1'); - workspace.renameVariableById('id1', 'name2'); - - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name1'); - checkVariableValues(workspace, 'name1', '', 'id1'); - - workspace.undo(true); - checkVariableValues(workspace, 'name2', '', 'id1'); - undoRedoTest_checkBlockVariableName(0, 'name2'); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_BothExist_NoBlocks() { - undoRedoTest_setUp(); - createTwoVarsEmptyType(); - workspace.renameVariableById('id1', 'name2'); - - workspace.undo(); - checkVariableValues(workspace, 'name1', '', 'id1'); - checkVariableValues(workspace, 'name2', '', 'id2'); - - workspace.undo(true); - checkVariableValues(workspace, 'name2', '', 'id2'); - assertNull(workspace.getVariableById('id1')); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_BothExist_WithBlocks() { - undoRedoTest_setUp(); - createTwoVarsEmptyType(); - createMockBlock('id1'); - createMockBlock('id2'); - workspace.renameVariableById('id1', 'name2'); - - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name1'); - undoRedoTest_checkBlockVariableName(1, 'name2'); - checkVariableValues(workspace, 'name1', '', 'id1'); - checkVariableValues(workspace, 'name2', '', 'id2'); - - workspace.undo(true); - undoRedoTest_checkBlockVariableName(0, 'name2'); - undoRedoTest_checkBlockVariableName(1, 'name2'); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_BothExistCaseChange_NoBlocks() { - undoRedoTest_setUp(); - createTwoVarsEmptyType(); - workspace.renameVariableById('id1', 'Name2'); - - workspace.undo(); - checkVariableValues(workspace, 'name1', '', 'id1'); - checkVariableValues(workspace, 'name2', '', 'id2'); - - workspace.undo(true); - checkVariableValues(workspace, 'Name2', '', 'id2'); - assertNull(workspace.getVariable('name1')); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_BothExistCaseChange_WithBlocks() { - undoRedoTest_setUp(); - createTwoVarsEmptyType(); - createMockBlock('id1'); - createMockBlock('id2'); - workspace.renameVariableById('id1', 'Name2'); - - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name1'); - undoRedoTest_checkBlockVariableName(1, 'name2'); - checkVariableValues(workspace, 'name1', '', 'id1'); - checkVariableValues(workspace, 'name2', '', 'id2'); - - workspace.undo(true); - checkVariableValues(workspace, 'Name2', '', 'id2'); - assertNull(workspace.getVariableById('id1')); - undoRedoTest_checkBlockVariableName(0, 'Name2'); - undoRedoTest_checkBlockVariableName(1, 'Name2'); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_OnlyCaseChange_NoBlocks() { - undoRedoTest_setUp(); - workspace.createVariable('name1', '', 'id1'); - workspace.renameVariableById('id1', 'Name1'); - - workspace.undo(); - checkVariableValues(workspace, 'name1', '', 'id1'); - - workspace.undo(true); - checkVariableValues(workspace, 'Name1', '', 'id1'); - undoRedoTest_tearDown(); -} - -function test_undoRedoRenameVariable_OnlyCaseChange_WithBlocks() { - undoRedoTest_setUp(); - workspace.createVariable('name1', '', 'id1'); - createMockBlock('id1'); - workspace.renameVariableById('id1', 'Name1'); - - workspace.undo(); - undoRedoTest_checkBlockVariableName(0, 'name1'); - checkVariableValues(workspace, 'name1', '', 'id1'); - - workspace.undo(true); - checkVariableValues(workspace, 'Name1', '', 'id1'); - undoRedoTest_checkBlockVariableName(0, 'Name1'); - undoRedoTest_tearDown(); -} diff --git a/packages/scratch-blocks/tests/jsunit/xml_test.js b/packages/scratch-blocks/tests/jsunit/xml_test.js deleted file mode 100644 index 6cbd76cdb..000000000 --- a/packages/scratch-blocks/tests/jsunit/xml_test.js +++ /dev/null @@ -1,443 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2014 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -var mockControl_; -var workspace; -var XML_TEXT = ['', - ' ', - ' ', - ' ', - ' 10', - ' ', - ' ', - ' ', - ' ', - ' item', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' Hello', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ''].join('\n'); - -function xmlTest_setUp() { - workspace = new Blockly.Workspace(); - mockControl_ = new goog.testing.MockControl(); -} - -function xmlTest_setUpWithMockBlocks() { - xmlTest_setUp(); - Blockly.defineBlocksWithJsonArray([{ - 'type': 'field_variable_test_block', - 'message0': '%1', - 'args0': [ - { - 'type': 'field_variable', - 'name': 'VAR', - 'variable': 'item' - } - ] - }, - { - 'type': 'field_serializable_test_block', - 'message0': '%1 %2', - 'args0': [ - { - 'type': 'field_label_serializable', - 'name': 'FIELD' - }, - { - "type": "field_input", - "name": "TEXTINPUT", - "text": "default" - } - ] - }]); -} - -function xmlTest_tearDown() { - mockControl_.$tearDown(); - workspace.dispose(); -} - -function xmlTest_tearDownWithMockBlocks() { - xmlTest_tearDown(); - delete Blockly.Blocks.field_variable_test_block; -} - -/** - * Check the values of the non variable field dom. - * @param {!Element} fieldDom The xml dom of the non variable field. - * @param {!string} name The expected name of the variable. - * @param {!string} text The expected text of the variable. - */ -function xmlTest_checkNonVariableField(fieldDom, name, text) { - assertEquals(text, fieldDom.textContent); - assertEquals(name, fieldDom.getAttribute('name')); - assertNull(fieldDom.getAttribute('id')); - assertNull(fieldDom.getAttribute('variabletype')); -} - -/** - * Check the values of the variable field DOM. - * @param {!Element} fieldDom The xml dom of the variable field. - * @param {!string} name The expected name of the variable. - * @param {!string} type The expected type of the variable. - * @param {!string} id The expected id of the variable. - * @param {!string} text The expected text of the variable. - */ -function xmlTest_checkVariableFieldDomValues(fieldDom, name, type, id, text) { - assertEquals(name, fieldDom.getAttribute('name')); - assertEquals(type, fieldDom.getAttribute('variabletype')); - assertEquals(id, fieldDom.getAttribute('id')); - assertEquals(text, fieldDom.textContent); -} - -/** - * Check the values of the variable DOM. - * @param {!Element} variableDom The xml dom of the variable. - * @param {!string} type The expected type of the variable. - * @param {!string} id The expected id of the variable. - * @param {!string} text The expected text of the variable. - */ -function xmlTest_checkVariableDomValues(variableDom, type, id, text) { - assertEquals(type, variableDom.getAttribute('type')); - assertEquals(id, variableDom.getAttribute('id')); - assertEquals(text, variableDom.textContent); -} - -function test_textToDom() { - var dom = Blockly.Xml.textToDom(XML_TEXT); - assertEquals('XML tag', 'xml', dom.nodeName); - assertEquals('Block tags', 6, dom.getElementsByTagName('block').length); -} - -function test_domToText() { - var dom = Blockly.Xml.textToDom(XML_TEXT); - var text = Blockly.Xml.domToText(dom); - assertEquals('Round trip', XML_TEXT.replace(/\s+/g, ''), - text.replace(/\s+/g, '')); -} - -function test_domToWorkspace_BackwardCompatibility() { - // Expect that workspace still loads without serialized variables. - xmlTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '1']); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' name1' + - ' ' + - ''); - Blockly.Xml.domToWorkspace(dom, workspace); - assertEquals('Block count', 1, workspace.getAllBlocks().length); - checkVariableValues(workspace, 'name1', '', '1'); - } finally { - xmlTest_tearDownWithMockBlocks(); - } -} - -function test_domToWorkspace_VariablesAtTop() { - // Expect that unused variables are preserved. - xmlTest_setUpWithMockBlocks(); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' name1' + - ' name2' + - ' name3' + - ' ' + - ' ' + - ' name3' + - ' ' + - ''); - Blockly.Xml.domToWorkspace(dom, workspace); - assertEquals('Block count', 1, workspace.getAllBlocks().length); - checkVariableValues(workspace, 'name1', 'type1', 'id1'); - checkVariableValues(workspace, 'name2', 'type2', 'id2'); - checkVariableValues(workspace, 'name3', '', 'id3'); - } finally { - xmlTest_tearDownWithMockBlocks(); - } -} - -function test_domToWorkspace_VariablesAtTop_DuplicateVariablesTag() { - // Expect thrown Error because of duplicate 'variables' tag - xmlTest_setUpWithMockBlocks(); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' ' + - ' ' + - ' ' + - ''); - Blockly.Xml.domToWorkspace(dom, workspace); - fail(); - } - catch (e) { - // expected - } finally { - xmlTest_tearDownWithMockBlocks(); - } -} - -function test_domToWorkspace_VariablesAtTop_MissingType() { - // Expect thrown error when a variable tag is missing the type attribute. - workspace = new Blockly.Workspace(); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' name1' + - ' ' + - ' ' + - ' name3' + - ' ' + - ''); - Blockly.Xml.domToWorkspace(dom, workspace); - fail(); - } catch (e) { - // expected - } finally { - workspace.dispose(); - } -} - -function test_domToWorkspace_VariablesAtTop_MismatchBlockType() { - // Expect thrown error when the serialized type of a variable does not match - // the type of a variable field that references it. - xmlTest_setUpWithMockBlocks(); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' name1' + - ' ' + - ' ' + - ' name1' + - ' ' + - ''); - Blockly.Xml.domToWorkspace(dom, workspace); - fail(); - } catch (e) { - // expected - } finally { - xmlTest_tearDownWithMockBlocks(); - } -} - -function test_domToPrettyText() { - var dom = Blockly.Xml.textToDom(XML_TEXT); - var text = Blockly.Xml.domToPrettyText(dom); - assertEquals('Round trip', XML_TEXT.replace(/\s+/g, ''), - text.replace(/\s+/g, '')); -} - -/** - * Tests the that appendDomToWorkspace works in a headless mode. - * Also see test_appendDomToWorkspace() in workspace_svg_test.js. - */ -function test_appendDomToWorkspace() { - Blockly.Blocks.test_block = { - init: function() { - this.jsonInit({ - message0: 'test', - }); - } - }; - - var workspace = new Blockly.Workspace(); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' ' + - ''); - workspace = new Blockly.Workspace(); - Blockly.Xml.appendDomToWorkspace(dom, workspace); - assertEquals('Block count', 1, workspace.getAllBlocks().length); - var newBlockIds = Blockly.Xml.appendDomToWorkspace(dom, workspace); - assertEquals('Block count', 2, workspace.getAllBlocks().length); - assertEquals('Number of new block ids',1,newBlockIds.length); - } finally { - delete Blockly.Blocks.test_block; - workspace.dispose(); - } -} - -function test_blockToDom_fieldToDom_trivial() { - xmlTest_setUpWithMockBlocks(); - // TODO (#1199): make a similar test where the variable is given a non-empty - // type.f - workspace.createVariable('name1', '', 'id1'); - var block = new Blockly.Block(workspace, 'field_variable_test_block'); - block.inputList[0].fieldRow[0].setValue('id1'); - var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; - xmlTest_checkVariableFieldDomValues(resultFieldDom, 'VAR', '', 'id1', - 'name1'); - xmlTest_tearDownWithMockBlocks(); -} - -function test_blockToDom_fieldToDom_defaultCase() { - xmlTest_setUpWithMockBlocks(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1', '1']); - try { - workspace.createVariable('name1'); - - Blockly.Events.disable(); - var block = new Blockly.Block(workspace, 'field_variable_test_block'); - block.inputList[0].fieldRow[0].setValue('1'); - Blockly.Events.enable(); - - var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; - // Expect type is '' and id is '1' since we don't specify type and id. - xmlTest_checkVariableFieldDomValues(resultFieldDom, 'VAR', '', '1', 'name1'); - } finally { - xmlTest_tearDownWithMockBlocks(); - } -} - -function test_blockToDom_fieldToDom_notAFieldVariable() { - Blockly.defineBlocksWithJsonArray([{ - "type": "field_angle_test_block", - "message0": "%1", - "args0": [ - { - "type": "field_angle", - "name": "VAR", - "angle": 90 - } - ], - }]); - xmlTest_setUpWithMockBlocks(); - var block = new Blockly.Block(workspace, 'field_angle_test_block'); - var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; - xmlTest_checkNonVariableField(resultFieldDom, 'VAR', '90'); - delete Blockly.Blocks.field_angle_block; - xmlTest_tearDownWithMockBlocks(); -} - -function test_variablesToDom_oneVariable() { - xmlTest_setUp(); - setUpMockMethod(mockControl_, Blockly.utils, 'genUid', null, ['1']); - - workspace.createVariable('name1'); - var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables()); - assertEquals(1, resultDom.children.length); - var resultVariableDom = resultDom.children[0]; - assertEquals('name1', resultVariableDom.textContent); - assertEquals('', resultVariableDom.getAttribute('type')); - assertEquals('1', resultVariableDom.getAttribute('id')); - xmlTest_tearDown(); -} - -function test_variablesToDom_twoVariables_oneBlock() { - xmlTest_setUpWithMockBlocks(); - - workspace.createVariable('name1', '', 'id1'); - workspace.createVariable('name2', 'type2', 'id2'); - // If events are enabled during block construction, it will create a default - // variable. - Blockly.Events.disable(); - var block = new Blockly.Block(workspace, 'field_variable_test_block'); - block.inputList[0].fieldRow[0].setValue('id1'); - Blockly.Events.enable(); - - var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables()); - assertEquals(2, resultDom.children.length); - xmlTest_checkVariableDomValues(resultDom.children[0], '', 'id1', - 'name1'); - xmlTest_checkVariableDomValues(resultDom.children[1], 'type2', 'id2', - 'name2'); - xmlTest_tearDownWithMockBlocks(); -} - -function test_variablesToDom_noVariables() { - xmlTest_setUp(); - workspace.createVariable('name1'); - var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables()); - assertEquals(1, resultDom.children.length); - xmlTest_tearDown(); -} - -function test_fieldIsSerialized() { - xmlTest_setUpWithMockBlocks(); - var block = new Blockly.Block(workspace, 'field_serializable_test_block'); - block.getField('FIELD').setValue('serialized'); - - var resultDom = Blockly.Xml.blockToDom(block).childNodes[0]; - assertEquals('serialized', resultDom.textContent); - assertEquals('FIELD', resultDom.getAttribute('name')); - - xmlTest_tearDownWithMockBlocks(); -} - -function test_fieldIsNotSerialized() { - xmlTest_setUpWithMockBlocks(); - var block = new Blockly.Block(workspace, 'field_serializable_test_block'); - block.getField('FIELD').SERIALIZABLE = false; - block.getField('FIELD').setValue('serialized'); - - var resultDom = Blockly.Xml.blockToDom(block).childNodes[0]; - assertEquals('default', resultDom.textContent); - assertEquals('TEXTINPUT', resultDom.getAttribute('name')); - - xmlTest_tearDownWithMockBlocks(); -} - -function test_variableFieldXml_caseSensitive() { - var id = 'testId'; - var type = 'testType'; - var name = 'testName'; - - var mockVariableModel = { - type: type, - name: name, - getId: function() { - return id; - } - }; - - var generatedXml = - Blockly.Variables.generateVariableFieldXml_(mockVariableModel); - var goldenXml = - '' + name + ''; - assertEquals(goldenXml, generatedXml); -} diff --git a/packages/scratch-blocks/tests/multi_playground.html b/packages/scratch-blocks/tests/multi_playground.html deleted file mode 100644 index 67677280d..000000000 --- a/packages/scratch-blocks/tests/multi_playground.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - -Multi-toolbox Playground - - - - - - - - - - - - -

Blockly Multi Playground

- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LTR, Vertical, StartRTL, Vertical, Start
LTR, Vertical, EndRTL, Vertical, End
LTR, Horizontal, StartRTL, Horizontal, Start
LTR, Horizontal, EndRTL, Horizontal, End
- - - - - - - - diff --git a/packages/scratch-blocks/tests/scripts/setup_linux_env.sh b/packages/scratch-blocks/tests/scripts/setup_linux_env.sh deleted file mode 100755 index da3d0ce6c..000000000 --- a/packages/scratch-blocks/tests/scripts/setup_linux_env.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -if [ "${TRAVIS_OS_NAME}" == "linux" ] - then - export CHROME_BIN="/usr/bin/google-chrome" - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start & -fi diff --git a/packages/scratch-blocks/tests/vertical_playground.html b/packages/scratch-blocks/tests/vertical_playground.html deleted file mode 100644 index 99427d375..000000000 --- a/packages/scratch-blocks/tests/vertical_playground.html +++ /dev/null @@ -1,582 +0,0 @@ - - - - - - - Vertical Playground - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - -

Vertical Blocks

-

- Show - - Hide -

- -
- - - - -
- -

- -   - -
- -

- -
- -

- Log events:   - -

- -

- Stress test:   - - -

- -

- Glows:   - - - - -

- -

- Log flyout events:   - -

- -

- Enable sounds (after refresh):   - -

- -

- - -

- -

- Report: - - -

- - diff --git a/packages/scratch-blocks/tests/vertical_playground_compressed.html b/packages/scratch-blocks/tests/vertical_playground_compressed.html deleted file mode 100644 index 7f38cd159..000000000 --- a/packages/scratch-blocks/tests/vertical_playground_compressed.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - - Compressed Vertical Playground - - - - - - - - - - - - -
-
- - - - -

Vertical Blocks

-

- Show - - Hide -

- -
- - - - -
- -

- -   - -
- -
- -

- -
- -

- Log events:   - -

- -

- Stress test:   - - - -

- -

- Glows:   - - - - -

- -

- Log flyout events:   - -

- -

- Enable sounds (after refresh):   - -

- -

- - -

- -

- Report: - - -

- - diff --git a/packages/scratch-blocks/tests/workspace_svg/index.html b/packages/scratch-blocks/tests/workspace_svg/index.html deleted file mode 100644 index 8b130ab76..000000000 --- a/packages/scratch-blocks/tests/workspace_svg/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - -Blockly Workspace SVG testing - - - - - - - - - - - - -
- -

Blockly Workspace testing

- - - - - - - diff --git a/packages/scratch-blocks/tests/workspace_svg/workspace_svg_test.js b/packages/scratch-blocks/tests/workspace_svg/workspace_svg_test.js deleted file mode 100644 index 78ac51c12..000000000 --- a/packages/scratch-blocks/tests/workspace_svg/workspace_svg_test.js +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @license - * Blockly Tests - * - * Copyright 2017 Google Inc. - * https://developers.google.com/blockly/ - * - * 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. - */ -'use strict'; - -goog.require('goog.testing'); -goog.require('goog.testing.MockControl'); - -function helper_createWorkspaceWithToolbox() { - var toolbox = document.getElementById('toolbox-categories'); - return Blockly.inject('blocklyDiv', {toolbox: toolbox}); -} - -function test_createWorkspace() { - var workspace = helper_createWorkspaceWithToolbox(); - workspace.dispose(); -} - -function test_emptyWorkspace() { - var workspace = helper_createWorkspaceWithToolbox(); - try { - assertEquals('Empty workspace (1).', 0, workspace.getTopBlocks(true).length); - assertEquals('Empty workspace (2).', 0, workspace.getTopBlocks(false).length); - assertEquals('Empty workspace (3).', 0, workspace.getAllBlocks().length); - workspace.clear(); - assertEquals('Empty workspace (4).', 0, workspace.getTopBlocks(true).length); - assertEquals('Empty workspace (5).', 0, workspace.getTopBlocks(false).length); - assertEquals('Empty workspace (6).', 0, workspace.getAllBlocks().length); - } finally { - workspace.dispose(); - } -} - -function test_flatWorkspace() { - var workspace = helper_createWorkspaceWithToolbox(); - var blockA, blockB; - try { - blockA = workspace.newBlock(''); - assertEquals('One block workspace (1).', 1, workspace.getTopBlocks(true).length); - assertEquals('One block workspace (2).', 1, workspace.getTopBlocks(false).length); - assertEquals('One block workspace (3).', 1, workspace.getAllBlocks().length); - blockB = workspace.newBlock(''); - assertEquals('Two block workspace (1).', 2, workspace.getTopBlocks(true).length); - assertEquals('Two block workspace (2).', 2, workspace.getTopBlocks(false).length); - assertEquals('Two block workspace (3).', 2, workspace.getAllBlocks().length); - blockA.dispose(); - assertEquals('One block workspace (4).', 1, workspace.getTopBlocks(true).length); - assertEquals('One block workspace (5).', 1, workspace.getTopBlocks(false).length); - assertEquals('One block workspace (6).', 1, workspace.getAllBlocks().length); - workspace.clear(); - assertEquals('Cleared workspace (1).', 0, workspace.getTopBlocks(true).length); - assertEquals('Cleared workspace (2).', 0, workspace.getTopBlocks(false).length); - assertEquals('Cleared workspace (3).', 0, workspace.getAllBlocks().length); - } finally { - blockB && blockB.dispose(); - blockA && blockA.dispose(); - workspace.dispose(); - } -} - -/** Tests the alignment of appendDomToWorkspace with WorkspaceSvg. */ -function test_appendDomToWorkspace() { - var workspace = helper_createWorkspaceWithToolbox(); - try { - var dom = Blockly.Xml.textToDom( - '' + - ' ' + - ' ' + - ''); - Blockly.Xml.appendDomToWorkspace(dom, workspace); - assertEquals('Block count', 1, workspace.getAllBlocks().length); - Blockly.Xml.appendDomToWorkspace(dom, workspace); - assertEquals('Block count', 2, workspace.getAllBlocks().length); - var blocks = workspace.getAllBlocks(); - assertEquals('Block 1 position x',21,blocks[0].getRelativeToSurfaceXY().x); - assertEquals('Block 1 position y',23,blocks[0].getRelativeToSurfaceXY().y); - assertEquals('Block 2 position x',21,blocks[1].getRelativeToSurfaceXY().x); - assertEquals('Block 2 position y',23 + blocks[0].getHeightWidth().height + Blockly.BlockSvg.SEP_SPACE_Y,blocks[1].getRelativeToSurfaceXY().y); - } finally { - workspace.dispose(); - } -} - -function test_addNewVariableRefreshToolbox() { - var workspace = helper_createWorkspaceWithToolbox(); - - var mockControl = new goog.testing.MockControl(); - var mockMethod = mockControl.createMethodMock(Blockly.WorkspaceSvg.prototype, - 'refreshToolboxSelection_'); - try { - mockMethod().$once(); - mockControl.$replayAll(); - - workspace.createVariable('name1', 'type1', 'id1'); - mockControl.$verifyAll(); - } finally { - workspace.dispose(); - } -} - -function test_addDuplicateVariableDoNotRefreshToolbox() { - var workspace = helper_createWorkspaceWithToolbox(); - - var mockControl = new goog.testing.MockControl(); - var mockMethod = mockControl.createMethodMock(Blockly.WorkspaceSvg.prototype, - 'refreshToolboxSelection_'); - try { - mockMethod().$once(); - mockControl.$replayAll(); - // Create same variable twice. The first should refresh the toolbox, - // the second should not. - workspace.createVariable('name1', 'type1', 'id1'); - workspace.createVariable('name1', 'type1', 'id1'); - - mockControl.$verifyAll(); - } finally { - workspace.dispose(); - } -} diff --git a/packages/scratch-blocks/webpack.config.js b/packages/scratch-blocks/webpack.config.js deleted file mode 100644 index 6d3be1d18..000000000 --- a/packages/scratch-blocks/webpack.config.js +++ /dev/null @@ -1,95 +0,0 @@ -// patch 'fs' to fix EMFILE errors, for example on WSL -var realFs = require('fs'); -var gracefulFs = require('graceful-fs'); -gracefulFs.gracefulify(realFs); - -var CopyWebpackPlugin = require('copy-webpack-plugin'); -var path = require('path'); -var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); - -module.exports = [{ - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - entry: { - horizontal: './shim/horizontal.js', - vertical: './shim/vertical.js' - }, - output: { - library: 'ScratchBlocks', - libraryTarget: 'commonjs2', - path: path.resolve(__dirname, 'dist'), - filename: '[name].js' - }, - optimization: { - minimize: false - }, - performance: { - hints: false - } -}, { - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - entry: { - horizontal: './shim/horizontal.js', - vertical: './shim/vertical.js' - }, - output: { - library: 'Blockly', - libraryTarget: 'umd', - path: path.resolve(__dirname, 'dist', 'web'), - filename: '[name].js' - }, - optimization: { - minimizer: [ - new UglifyJsPlugin({ - uglifyOptions: { - mangle: false - } - }) - ] - }, - plugins: [] -}, -{ - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - entry: './shim/gh-pages.js', - output: { - filename: '[name].js', - path: path.resolve(__dirname, 'gh-pages') - }, - optimization: { - minimize: false - }, - performance: { - hints: false - }, - plugins: [ - new CopyWebpackPlugin([{ - from: 'node_modules/google-closure-library', - to: 'closure-library' - }, { - from: 'blocks_common', - to: 'playgrounds/blocks_common', - }, { - from: 'blocks_horizontal', - to: 'playgrounds/blocks_horizontal', - }, { - from: 'blocks_vertical', - to: 'playgrounds/blocks_vertical', - }, { - from: 'core', - to: 'playgrounds/core' - }, { - from: 'media', - to: 'playgrounds/media' - }, { - from: 'msg', - to: 'playgrounds/msg' - }, { - from: 'tests', - to: 'playgrounds/tests' - }, { - from: '*.js', - ignore: 'webpack.config.js', - to: 'playgrounds' - }]) - ] -}]; diff --git a/packages/scratch-gui/README.md b/packages/scratch-gui/README.md index f722e4591..56f06095c 100644 --- a/packages/scratch-gui/README.md +++ b/packages/scratch-gui/README.md @@ -194,6 +194,14 @@ Further reading: [Stack Overflow](https://stackoverflow.com/questions/46602286/n You can publish the GUI to github.io so that others on the Internet can view it. [Read the wiki for a step-by-step guide.](https://github.com/LLK/scratch-gui/wiki/Publishing-to-GitHub-Pages) +## Creating a New Modal Model +You can create a new modal by editing the following files: +blocks.jsx in containers +gui.jsx in containers +gui.jsx in components +modals.js in reducers +creating a new modal-model folder in components + ## Donate We provide [Scratch](https://scratch.mit.edu) free of charge, and want to keep it that way! Please consider making a [donation](https://secure.donationpay.org/scratchfoundation/) to support our continued engineering, design, community, and resource development efforts. Donations of any size are appreciated. Thank you! diff --git a/packages/scratch-gui/package-lock.json b/packages/scratch-gui/package-lock.json index 7bfc31f11..92186188a 100644 --- a/packages/scratch-gui/package-lock.json +++ b/packages/scratch-gui/package-lock.json @@ -1,14415 +1,35145 @@ { - "name": "scratch-gui", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/cli": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.6.4.tgz", - "integrity": "sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "commander": "^2.8.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.13", - "mkdirp": "^0.5.1", - "output-file-sync": "^2.0.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - } - }, - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", - "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.4", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.4", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.3", - "@babel/types": "^7.6.3", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", - "dev": true, - "requires": { - "@babel/types": "^7.6.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0", - "esutils": "^2.0.0" - } - }, - "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", - "dev": true, - "requires": { - "@babel/types": "^7.5.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, - "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" - } - }, - "@babel/helpers": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", - "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", - "dev": true, - "requires": { - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0" - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", - "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", - "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", - "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", - "dev": true, - "requires": { - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/preset-env": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", - "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.3", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.6.2", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.6.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.6.2", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.6.2", - "@babel/types": "^7.6.3", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.6.3.tgz", - "integrity": "sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" - } - }, - "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" - } - }, - "@babel/traverse": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@scratch/paper": { - "version": "0.11.20190729152410", - "resolved": "https://registry.npmjs.org/@scratch/paper/-/paper-0.11.20190729152410.tgz", - "integrity": "sha512-8DvLPFbipP7O8fii6xItaA041fdW4pdr63m34xlSs15sYP5fX9yiZiO3G44qk5eBPbFNQTG7uxMd5Jo+cVS5Ow==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", - "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "12.7.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz", - "integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", - "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", - "dev": true - }, - "@typescript-eslint/experimental-utils": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", - "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-scope": "^4.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", - "dev": true - }, - "aframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/aframe/-/aframe-1.0.4.tgz", - "integrity": "sha512-iG/4VyRt22zUPxDsFjP4SHUXNPGIStM2hHX/iPblht6dtN8m09e7LAaFq4iQdXoT0EkZBWEVmXVBF1J7Tca3QQ==", - "requires": { - "custom-event-polyfill": "^1.0.6", - "debug": "github:ngokevin/debug#noTimestamp", - "deep-assign": "^2.0.0", - "document-register-element": "github:dmarcos/document-register-element#8ccc532b7f3744be954574caf3072a5fd260ca90", - "load-bmfont": "^1.2.3", - "object-assign": "^4.0.1", - "present": "0.0.6", - "promise-polyfill": "^3.1.0", - "super-animejs": "^3.1.0", - "super-three": "^0.111.6", - "three-bmfont-text": "github:dmarcos/three-bmfont-text#1babdf8507c731a18f8af3b807292e2b9740955e", - "webvr-polyfill": "^0.10.10" - }, - "dependencies": { - "debug": { - "version": "github:ngokevin/debug#ef5f8e66d49ce8bc64c6f282c15f8b7164409e3a", - "from": "github:ngokevin/debug#noTimestamp" - } - } - }, - "airbnb-prop-types": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", - "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", - "dev": true, - "requires": { - "array.prototype.find": "^2.1.0", - "function.prototype.name": "^1.1.1", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.9.0" - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "an-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/an-array/-/an-array-1.0.0.tgz", - "integrity": "sha1-wSWlu4JXd4419LT2qpx9D6nkJmU=" - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", - "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-shuffle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-shuffle/-/array-shuffle-1.0.1.tgz", - "integrity": "sha1-fqSIKjVrS8pfVF4LblLq9tlxVXo=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.find": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" - } - }, - "array.prototype.flat": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" - } - }, - "arraybuffer-loader": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer-loader/-/arraybuffer-loader-1.0.7.tgz", - "integrity": "sha512-8FPjFP26OF723Oiaj5E208WW2tAgE0noCsrtQZ20TwdHt6qs5iuAaKqX5WY/C3wYdF/2cRUiuIXj98qy/2NB7g==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "as-number": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/as-number/-/as-number-1.0.0.tgz", - "integrity": "sha1-rLJ+NPj52KsNqeN287iVmGD4CmY=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.2.tgz", - "integrity": "sha1-YSpKtF70KnDN6Aa62G7m2wR+g4U=", - "dev": true, - "requires": { - "lodash": "^4.14.0" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "audio-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/audio-context/-/audio-context-1.0.1.tgz", - "integrity": "sha1-zsTbis5u9KrL8Q7vCXekVxRo1Ks=", - "dev": true, - "requires": { - "global": "^4.3.1" - } - }, - "autoprefixer": { - "version": "9.6.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.4.tgz", - "integrity": "sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ==", - "dev": true, - "requires": { - "browserslist": "^4.7.0", - "caniuse-lite": "^1.0.30000998", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.18", - "postcss-value-parser": "^4.0.2" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-jest": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", - "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", - "dev": true, - "requires": { - "babel-plugin-istanbul": "^4.0.0", - "babel-preset-jest": "^21.2.0" - } - }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", - "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", - "dev": true - }, - "babel-plugin-react-intl": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-3.5.1.tgz", - "integrity": "sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==", - "dev": true, - "requires": { - "@babel/core": "^7.4.5", - "@babel/helper-plugin-utils": "^7.0.0", - "@types/babel__core": "^7.1.2", - "fs-extra": "^8.0.1", - "intl-messageformat-parser": "^1.8.1" - }, - "dependencies": { - "intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "dev": true - } - } - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-preset-jest": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", - "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^21.2.0", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "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": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "base64-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-loader/-/base64-loader-1.0.0.tgz", - "integrity": "sha1-5TC62I6QbdKh+tCvLZ5oP6i9kqg=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "bowser": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "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": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" - } - }, - "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "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" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000999", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz", - "integrity": "sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg==", - "dev": true - }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", - "dev": true, - "requires": { - "rsvp": "^3.3.3" - } - }, - "cardboard-vr-display": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/cardboard-vr-display/-/cardboard-vr-display-1.0.18.tgz", - "integrity": "sha512-G1UEitQBT3pODLnMx37xv9JyZktCBTkwjxS4Vz9KmYL0Ln+Crm/CI7o4WEqAyS6xZjxR3cAvcClou1edX/JUbA==", - "requires": { - "gl-preserve-state": "^1.0.0", - "nosleep.js": "^0.7.0", - "webvr-polyfill-dpdb": "^1.0.17" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "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" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "chromedriver": { - "version": "78.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-78.0.1.tgz", - "integrity": "sha512-eOsyFk4xb9EECs1VMrDbxO713qN+Bu1XUE8K9AuePc3839TPdAegg72kpXSzkeNqRNZiHbnJUItIVCLFkDqceA==", - "dev": true, - "requires": { - "del": "^4.1.1", - "extract-zip": "^1.6.7", - "mkdirp": "^0.5.1", - "request": "^2.88.0", - "tcp-port-used": "^1.0.1" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", - "dev": true - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "collections": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", - "integrity": "sha1-HyMCay7zb5J+7MkB6ZxfDUj6M04=", - "dev": true, - "requires": { - "weak-map": "1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", - "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, - "computed-style-to-inline-style": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/computed-style-to-inline-style/-/computed-style-to-inline-style-3.0.0.tgz", - "integrity": "sha1-klECRGPFVcfhdo13oZ66m49Bivw=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "dev": true - }, - "core-js-compat": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", - "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", - "dev": true, - "requires": { - "browserslist": "^4.6.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "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": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "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-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "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": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "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-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-mediaquery": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=", - "dev": true - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "css-vendor": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", - "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", - "dev": true, - "requires": { - "is-in-browser": "^1.0.2" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "custom-event-polyfill": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz", - "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-assign": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", - "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", - "requires": { - "is-obj": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "document-register-element": { - "version": "github:dmarcos/document-register-element#8ccc532b7f3744be954574caf3072a5fd260ca90", - "from": "github:dmarcos/document-register-element#8ccc532b7f3744be954574caf3072a5fd260ca90" - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dtype": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", - "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.280", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.280.tgz", - "integrity": "sha512-qYWNMjKLEfQAWZF2Sarvo+ahigu0EArnpCFSoUuZJS3W5wIeVfeEvsgmT2mgIrieQkeQ0+xFmykK3nx2ezekPQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "enzyme": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.10.0.tgz", - "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", - "dev": true, - "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "html-element-map": "^1.0.0", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.4", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" - } - }, - "enzyme-adapter-react-16": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.3.0.tgz", - "integrity": "sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.6.0", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.values": "^1.0.4", - "prop-types": "^15.6.2", - "react-is": "^16.4.2", - "react-test-renderer": "^16.0.0-0" - } - }, - "enzyme-adapter-utils": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz", - "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", - "dev": true, - "requires": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.2", - "semver": "^5.6.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", - "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", - "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "eslint-config-scratch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-5.1.0.tgz", - "integrity": "sha512-JQMxERL3eo0TMy87NZFm6yS0i2XOMplffKz9CD/2ta2i/+3FTgajxzF9n7R7vi9C+GMLSTSLZJ5X90tINuAhjg==", - "dev": true, - "requires": { - "eslint-plugin-react": ">=7.14.2" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - } - }, - "eslint-import-resolver-webpack": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.11.1.tgz", - "integrity": "sha512-eK3zR7xVQR/MaoBWwGuD+CULYVuqe5QFlDukman71aI6IboCGzggDUohHNfu1ZeBnbHcUHJc0ywWoXUBNB6qdg==", - "dev": true, - "requires": { - "array-find": "^1.0.0", - "debug": "^2.6.8", - "enhanced-resolve": "~0.9.0", - "find-root": "^1.1.0", - "has": "^1.0.1", - "interpret": "^1.0.0", - "lodash": "^4.17.4", - "node-libs-browser": "^1.0.0 || ^2.0.0", - "resolve": "^1.10.0", - "semver": "^5.3.0" - } - }, - "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - } - } - }, - "eslint-plugin-jest": { - "version": "22.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.17.0.tgz", - "integrity": "sha512-WT4DP4RoGBhIQjv+5D0FM20fAdAUstfYAf/mkufLNTojsfgzc5/IYW22cIg/Q4QBavAZsROQlqppiWDpFZDS8Q==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "^1.13.0" - } - }, - "eslint-plugin-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", - "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "resolve": "^1.12.0" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.0.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", - "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^21.2.1", - "jest-get-type": "^21.2.0", - "jest-matcher-utils": "^21.2.1", - "jest-message-util": "^21.2.1", - "jest-regex-util": "^21.2.0" - } - }, - "exports-loader": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz", - "integrity": "sha1-V9x4kX9wm5byR/qR5ptVTIVQE8g=", - "dev": true, - "requires": { - "loader-utils": "0.2.x", - "source-map": "0.1.x" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, - "requires": { - "bser": "^2.0.0" - } - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "flatten-vertex-data": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", - "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", - "requires": { - "dtype": "^2.0.0" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", - "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1", - "functions-have-names": "^1.1.1", - "is-callable": "^1.1.4" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "functions-have-names": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz", - "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-float-time-domain-data": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-float-time-domain-data/-/get-float-time-domain-data-0.1.0.tgz", - "integrity": "sha1-XYVZJKQwOITJY4qrEnzOTQBlljs=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-user-media-promise": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/get-user-media-promise/-/get-user-media-promise-1.1.4.tgz", - "integrity": "sha512-k49YuV2z0d3gKHLPTFKYfzEA9kduuQk7YBf8ev2dxrKk+DhMyuzfQnK9ZSxkEhE/jv3BZY62M0eICWa7lak9nw==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "gh-pages": { - "version": "github:rschamp/gh-pages#47e5e5c376ca65f4b407325e115174172d9c12ae", - "from": "github:rschamp/gh-pages#publish-branch-to-subfolder", - "dev": true, - "requires": { - "async": "2.1.2", - "commander": "2.9.0", - "globby": "^6.1.0", - "graceful-fs": "4.1.10", - "q": "1.4.1", - "q-io": "1.13.2", - "rimraf": "^2.5.4" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.10.tgz", - "integrity": "sha1-8tcgwiCS90Mih3XHXjYSYyUB8TE=", - "dev": true - } - } - }, - "gl-preserve-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz", - "integrity": "sha512-zQZ25l3haD4hvgJZ6C9+s0ebdkW9y+7U2qxvGu1uWOJh8a4RU+jURIKEQhf8elIlFpMH6CrAY2tH0mYrRjet3Q==" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "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" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, - "handlebars": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz", - "integrity": "sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "dev": true, - "requires": { - "react-is": "^16.7.0" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-element-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.1.0.tgz", - "integrity": "sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA==", - "dev": true, - "requires": { - "array-filter": "^1.0.0" - } - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "hyphenate-style-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", - "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imports-loader": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", - "integrity": "sha1-rnRlMDHVnjezwvslRKxhrq41MKY=", - "dev": true, - "requires": { - "loader-utils": "0.2.x", - "source-map": "0.1.x" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", - "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=", - "dev": true - }, - "intl-format-cache": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-2.2.9.tgz", - "integrity": "sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ==", - "dev": true - }, - "intl-messageformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-2.2.0.tgz", - "integrity": "sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw=", - "dev": true, - "requires": { - "intl-messageformat-parser": "1.4.0" - } - }, - "intl-messageformat-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz", - "integrity": "sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU=", - "dev": true - }, - "intl-relativeformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz", - "integrity": "sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw==", - "dev": true, - "requires": { - "intl-messageformat": "^2.0.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "is2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", - "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^2.1.0", - "is-url": "^1.2.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", - "dev": true, - "requires": { - "handlebars": "^4.0.3" - } - }, - "jest": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", - "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", - "dev": true, - "requires": { - "jest-cli": "^21.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "jest-cli": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", - "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.1", - "istanbul-lib-coverage": "^1.0.1", - "istanbul-lib-instrument": "^1.4.2", - "istanbul-lib-source-maps": "^1.1.0", - "jest-changed-files": "^21.2.0", - "jest-config": "^21.2.1", - "jest-environment-jsdom": "^21.2.1", - "jest-haste-map": "^21.2.0", - "jest-message-util": "^21.2.1", - "jest-regex-util": "^21.2.0", - "jest-resolve-dependencies": "^21.2.0", - "jest-runner": "^21.2.1", - "jest-runtime": "^21.2.1", - "jest-snapshot": "^21.2.1", - "jest-util": "^21.2.1", - "micromatch": "^2.3.11", - "node-notifier": "^5.0.2", - "pify": "^3.0.0", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "worker-farm": "^1.3.1", - "yargs": "^9.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "jest-changed-files": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", - "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", - "dev": true, - "requires": { - "throat": "^4.0.0" - } - }, - "jest-config": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", - "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^21.2.1", - "jest-environment-node": "^21.2.1", - "jest-get-type": "^21.2.0", - "jest-jasmine2": "^21.2.1", - "jest-regex-util": "^21.2.0", - "jest-resolve": "^21.2.0", - "jest-util": "^21.2.1", - "jest-validate": "^21.2.1", - "pretty-format": "^21.2.1" - } - }, - "jest-diff": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", - "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^21.2.0", - "pretty-format": "^21.2.1" - } - }, - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", - "dev": true - }, - "jest-environment-jsdom": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", - "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", - "dev": true, - "requires": { - "jest-mock": "^21.2.0", - "jest-util": "^21.2.1", - "jsdom": "^9.12.0" - } - }, - "jest-environment-node": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", - "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", - "dev": true, - "requires": { - "jest-mock": "^21.2.0", - "jest-util": "^21.2.1" - } - }, - "jest-get-type": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", - "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", - "dev": true - }, - "jest-haste-map": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", - "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", - "dev": true, - "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^21.2.0", - "micromatch": "^2.3.11", - "sane": "^2.0.0", - "worker-farm": "^1.3.1" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "jest-jasmine2": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", - "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "expect": "^21.2.1", - "graceful-fs": "^4.1.11", - "jest-diff": "^21.2.1", - "jest-matcher-utils": "^21.2.1", - "jest-message-util": "^21.2.1", - "jest-snapshot": "^21.2.1", - "p-cancelable": "^0.3.0" - } - }, - "jest-junit": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-7.0.0.tgz", - "integrity": "sha512-ljUdO0hLyu0A92xk7R2Wet3kj99fmazTo+ZFYQP6b7AGOBxJUj8ZkJWzJ632ajpXko2Y5oNoGR2kvOwiDdu6hg==", - "dev": true, - "requires": { - "jest-validate": "^24.0.0", - "mkdirp": "^0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - } - } - }, - "jest-matcher-utils": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", - "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^21.2.0", - "pretty-format": "^21.2.1" - } - }, - "jest-message-util": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", - "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "jest-mock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", - "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==", - "dev": true - }, - "jest-regex-util": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", - "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==", - "dev": true - }, - "jest-resolve": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", - "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", - "dev": true, - "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1", - "is-builtin-module": "^1.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", - "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", - "dev": true, - "requires": { - "jest-regex-util": "^21.2.0" - } - }, - "jest-runner": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", - "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", - "dev": true, - "requires": { - "jest-config": "^21.2.1", - "jest-docblock": "^21.2.0", - "jest-haste-map": "^21.2.0", - "jest-jasmine2": "^21.2.1", - "jest-message-util": "^21.2.1", - "jest-runtime": "^21.2.1", - "jest-util": "^21.2.1", - "pify": "^3.0.0", - "throat": "^4.0.0", - "worker-farm": "^1.3.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "jest-runtime": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", - "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^21.2.0", - "babel-plugin-istanbul": "^4.0.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "graceful-fs": "^4.1.11", - "jest-config": "^21.2.1", - "jest-haste-map": "^21.2.0", - "jest-regex-util": "^21.2.0", - "jest-resolve": "^21.2.0", - "jest-util": "^21.2.1", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^9.0.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "jest-snapshot": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", - "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^21.2.1", - "jest-matcher-utils": "^21.2.1", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^21.2.1" - } - }, - "jest-util": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", - "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", - "dev": true, - "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "jest-message-util": "^21.2.1", - "jest-mock": "^21.2.0", - "jest-validate": "^21.2.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "jest-validate": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", - "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^21.2.0", - "leven": "^2.1.0", - "pretty-format": "^21.2.1" - } - }, - "js-base64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", - "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", - "dev": true - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, - "js-md5": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz", - "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", - "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", - "dev": true, - "requires": { - "abab": "^1.0.3", - "acorn": "^4.0.4", - "acorn-globals": "^3.1.0", - "array-equal": "^1.0.0", - "content-type-parser": "^1.0.1", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "escodegen": "^1.6.1", - "html-encoding-sniffer": "^1.0.1", - "nwmatcher": ">= 1.3.9 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.79.0", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.2", - "webidl-conversions": "^4.0.0", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^4.3.0", - "xml-name-validator": "^2.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - }, - "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", - "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "keymirror": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz", - "integrity": "sha1-kYiJ6hP40KQufFVyUO7nE63JXDU=", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "layout-bmfont-text": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/layout-bmfont-text/-/layout-bmfont-text-1.3.4.tgz", - "integrity": "sha1-8g8sVGR3T0jabOipl/vObUaUW4E=", - "requires": { - "as-number": "^1.0.0", - "word-wrapper": "^1.0.7", - "xtend": "^4.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "load-bmfont": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", - "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - } - }, - "load-img": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/load-img/-/load-img-1.0.0.tgz", - "integrity": "sha1-CVN0SYk8MqhwkHRkVWbExfqprCY=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.bindall": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.bindall/-/lodash.bindall-4.4.0.tgz", - "integrity": "sha1-p7/Ugro9LnBxad/NyZPrv2w9eZg=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.defaultsdeep": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz", - "integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=", - "dev": true - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.throttle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.0.1.tgz", - "integrity": "sha1-syEWYu6dgvVpA9BzEmKqqoc6YzA=", - "dev": true, - "requires": { - "lodash.debounce": "^4.0.0" - } - }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", - "dev": true - }, - "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-limit": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", - "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1" - } - } - } - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchmediaquery": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.0.tgz", - "integrity": "sha512-u0dlv+VENJ+3YepvwSPBieuvnA6DWfaYa/ctwysAR13y4XLJNyt7bEVKzNj/Nvjo+50d88Pj+xL9xaSo6JmX/w==", - "dev": true, - "requires": { - "css-mediaquery": "^0.1.2" - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", - "dev": true - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "microee": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/microee/-/microee-0.0.6.tgz", - "integrity": "sha1-oSvbAQNoHosSapsHHrpMRnx4//4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "mimeparse": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", - "integrity": "sha1-2vsCdSNw/SJgk64xUsJxrwGsJUo=", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minilog": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minilog/-/minilog-3.1.0.tgz", - "integrity": "sha1-0tDxiHyjY9Gs8OqG1cTfKTs/tnU=", - "dev": true, - "requires": { - "microee": "0.0.6" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", - "dev": true - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "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" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "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": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nearley": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.0.tgz", - "integrity": "sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "moo": "^0.4.3", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nets": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nets/-/nets-3.2.0.tgz", - "integrity": "sha1-1RH7q3rxHaAT8huX7pF0fTOFLTg=", - "dev": true, - "requires": { - "request": "^2.65.0", - "xhr": "^2.1.0" - } - }, - "new-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-array/-/new-array-1.0.0.tgz", - "integrity": "sha1-XbxjnZYerH8an7wacUbsEvKST78=" - }, - "nice-color-palettes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nice-color-palettes/-/nice-color-palettes-1.0.1.tgz", - "integrity": "sha1-h16gHchu+uf1leBmqLJmDnIGBT4=", - "requires": { - "map-limit": "0.0.1", - "minimist": "^1.2.0", - "new-array": "^1.0.0", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "node-releases": { - "version": "1.1.35", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.35.tgz", - "integrity": "sha512-JGcM/wndCN/2elJlU0IGdVEJQQnJwsLbgPCFd2pY7V0mxf17bZ0Gb/lgOtL29ZQhvEX5shnVhxQyZz3ex94N8w==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "nosleep.js": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.7.0.tgz", - "integrity": "sha1-z9kZwlUjyg0PSmn7MwXAg62u4ok=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", - "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.15.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "omggif": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", - "integrity": "sha1-3LcCTazVDFK00wPwSALJHAV8dl8=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", - "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "is-plain-obj": "^1.1.0", - "mkdirp": "^0.5.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "papaparse": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.1.1.tgz", - "integrity": "sha512-KPkW4GNQxunmYTeJIjHFrvilcNuHBWrfgbyvmagEmfGOA4hnP1WIkPbv4yABhj1Nam3as4w+7MBiI27BntwqVg==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "parse-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", - "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", - "dev": true, - "requires": { - "color-convert": "~0.5.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - } - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-headers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", - "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", - "requires": { - "for-each": "^0.3.3", - "string.prototype.trim": "^1.1.2" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", - "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-simple-vars": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", - "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "present": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/present/-/present-0.0.6.tgz", - "integrity": "sha1-nu/3ANqp6ZhhM1Lkf3rCMk1PrwI=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", - "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-polyfill": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-3.1.0.tgz", - "integrity": "sha1-YpUrAdBZsRW0MnY7fvRhuA9t9H0=" - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "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" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "q-io": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.2.tgz", - "integrity": "sha1-7qEw1IHdteGqG8WmaFX3OR0G8AM=", - "dev": true, - "requires": { - "collections": "^0.2.0", - "mime": "^1.2.11", - "mimeparse": "^0.1.4", - "q": "^1.0.1", - "qs": "^1.2.1", - "url2": "^0.0.0" - }, - "dependencies": { - "qs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", - "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", - "dev": true - } - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "quad-indices": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/quad-indices/-/quad-indices-2.0.1.tgz", - "integrity": "sha1-ppQdiaE9Y+7WwdSlpiGgRjYXqBQ=", - "requires": { - "an-array": "^1.0.0", - "dtype": "^2.0.0", - "is-buffer": "^1.0.2" - } - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "react": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", - "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-contextmenu": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.9.4.tgz", - "integrity": "sha512-ma4YQw4J7JNv8L8mMVd1NHHbvH3+gaK/rQ6FC5Tft7OCUweKi7PHqHEE0fDF2009FLSGoV5JnjPnTTEyThqaJg==", - "dev": true, - "requires": { - "classnames": "^2.2.5", - "object-assign": "^4.1.0" - } - }, - "react-dom": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", - "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-draggable": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", - "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", - "dev": true, - "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" - } - }, - "react-ga": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-2.5.3.tgz", - "integrity": "sha512-25wvPv1PVLDLhw1gEYP33h0V2sJHahKMfUCAxhq8JPYmNQwx1fcjJAkJk+WmSqGN93lHLhExDkxy3SQizQnx3A==", - "dev": true, - "requires": { - "prop-types": "^15.6.0", - "react": "^15.6.2 || ^16.0" - } - }, - "react-intl": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-2.9.0.tgz", - "integrity": "sha512-27jnDlb/d2A7mSJwrbOBnUgD+rPep+abmoJE511Tf8BnoONIAUehy/U1zZCHGO17mnOwMWxqN4qC0nW11cD6rA==", - "dev": true, - "requires": { - "hoist-non-react-statics": "^3.3.0", - "intl-format-cache": "^2.0.5", - "intl-messageformat": "^2.1.0", - "intl-relativeformat": "^2.1.0", - "invariant": "^2.1.1" - } - }, - "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", - "dev": true - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true - }, - "react-modal": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.9.1.tgz", - "integrity": "sha512-k+TUkhGWpIVHLsEyjNmlyOYL0Uz03fNZvlkhCImd1h+6fhNgTi6H6jexVXPVhD2LMMDzJyfugxMN+APN/em+eQ==", - "dev": true, - "requires": { - "exenv": "^1.2.0", - "prop-types": "^15.5.10", - "react-lifecycles-compat": "^3.0.0", - "warning": "^4.0.3" - } - }, - "react-popover": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/react-popover/-/react-popover-0.5.10.tgz", - "integrity": "sha512-5SYDTfncywSH00I70oHd4gFRUR8V0rJ4sRADSI/P6G0RVXp9jUgaWloJ0Bk+SFnjpLPuipTKuzQNNd2CTs5Hrw==", - "dev": true, - "requires": { - "css-vendor": "^0.3.1", - "debug": "^2.6.8", - "lodash.throttle": "^3.0.3", - "prop-types": "^15.5.10" - }, - "dependencies": { - "lodash.debounce": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", - "integrity": "sha1-gSIRw3ipTMKdWqTjNGzwv846ffU=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash.throttle": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-3.0.4.tgz", - "integrity": "sha1-vE9HH7Mo5Nb9xt8rPTyvET8Pick=", - "dev": true, - "requires": { - "lodash.debounce": "^3.0.0" - } - } - } - }, - "react-redux": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", - "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", - "dev": true, - "requires": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", - "dev": true - } - } - }, - "react-responsive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-5.0.0.tgz", - "integrity": "sha512-oEimZ0FTCC3/pjGDEBHOz06nWbBNDIbMGOdRYp6K9SBUmrqgNAX77hTiqvmRQeLyI97zz4F4kiaFRxFspDxE+w==", - "dev": true, - "requires": { - "hyphenate-style-name": "^1.0.0", - "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1" - } - }, - "react-style-proptype": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", - "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", - "dev": true, - "requires": { - "prop-types": "^15.5.4" - } - }, - "react-tabs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-2.3.0.tgz", - "integrity": "sha512-pYaefgVy76/36AMEP+B8YuVVzDHa3C5UFZ3REU78zolk0qMxEhKvUFofvDCXyLZwf0RZjxIfiwok1BEb18nHyA==", - "dev": true, - "requires": { - "classnames": "^2.2.0", - "prop-types": "^15.5.0" - } - }, - "react-test-renderer": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.2.0.tgz", - "integrity": "sha512-Kd4gJFtpNziR9ElOE/C23LeflKLZPRpNQYWP3nQBY43SJ5a+xyEGSeMrm2zxNKXcnCbBS/q1UpD9gqd5Dv+rew==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-tooltip": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.8.0.tgz", - "integrity": "sha512-Uj/vVd0uGuqwTkWeRjKS56T2iwOSvsSMbjqTK7AseHZEMND+WCXXUajaF7+ZsJWTZgnpeT9kBnaBFhchzeDTbw==", - "dev": true, - "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" - } - }, - "react-virtualized": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.20.1.tgz", - "integrity": "sha512-xIWxBsyNAjceqD3hsE0nw5TcDVxKbIepsHhvS2XneHmNz0KlKxdLdGBmGZBM9ZesEmbZ5EO0Sw70TB1MeCmpbQ==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "classnames": "^2.2.3", - "dom-helpers": "^2.4.0 || ^3.0.0", - "loose-envify": "^1.3.0", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^3.0.4" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dev": true, - "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "redux-mock-store": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.3.tgz", - "integrity": "sha512-ryhkkb/4D4CUGpAV2ln1GOY/uh51aczjcRz9k2L2bPx/Xja3c5pSGJJPyR25GNVRXtKIExScdAgFdiXp68GmJA==", - "dev": true, - "requires": { - "lodash.isplainobject": "^4.0.6" - } - }, - "redux-throttle": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/redux-throttle/-/redux-throttle-0.1.1.tgz", - "integrity": "sha1-QwcFc/AzHRKuFvrmVyrZ1/y3Ya4=", - "dev": true, - "requires": { - "lodash.throttle": "4.0.1" - } - }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - } - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "scratch-audio": { - "version": "0.1.0-prerelease.20190925183642", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20190925183642.tgz", - "integrity": "sha512-cvnNawIThkIKyMZdo+cRmYO+ndCG9dcQeaG8rTgok2iSMvG510OUs3DBnFz/GUncu+OryT1VKdeusEfwKf/+ow==", - "dev": true, - "requires": { - "audio-context": "1.0.1", - "minilog": "^3.0.1", - "startaudiocontext": "1.2.1" - } - }, - "scratch-blocks": { - "version": "0.1.0-prerelease.1578322100", - "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.1578322100.tgz", - "integrity": "sha512-36CNHELBehHX0pjyVLrkP7vqVhpkvBONDLTKx1LoYZhVXtTvP+Vknd6iKDM3gUzzAOMdpUUxVO6e/XBHz8+i1w==", - "dev": true, - "requires": { - "exports-loader": "0.6.3", - "imports-loader": "0.6.5" - } - }, - "scratch-l10n": { - "version": "3.7.20200108141814", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.7.20200108141814.tgz", - "integrity": "sha512-96XEoJGqmR3f/394hcyBjHdyc3VNapaU6hQ+3/4TAvfD/8keYsJuSVkHHMD+UpodHKkkSTyQZIjbDKc9T60UMQ==", - "dev": true, - "requires": { - "@babel/cli": "^7.1.2", - "@babel/core": "^7.1.2", - "babel-plugin-react-intl": "^3.0.1", - "transifex": "1.6.6" - } - }, - "scratch-paint": { - "version": "0.2.0-prerelease.20200109073728", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200109073728.tgz", - "integrity": "sha512-PJTYShD5gl4OReRN+ZOTjSFeEuarO5YV10bbmw1BSn/pAnuEYU2dglgymNSBiGXunYaDYyaPgsJldzcnydSxHQ==", - "dev": true, - "requires": { - "@scratch/paper": "0.11.20190729152410", - "classnames": "2.2.5", - "keymirror": "0.1.1", - "lodash.bindall": "4.4.0", - "lodash.omit": "4.5.0", - "minilog": "3.1.0", - "parse-color": "1.0.0", - "prop-types": "^15.5.10", - "scratch-svg-renderer": "0.2.0-prerelease.20200109070519" - }, - "dependencies": { - "classnames": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=", - "dev": true - } - } - }, - "scratch-render-fonts": { - "version": "1.0.0-prerelease.20180906193204", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20180906193204.tgz", - "integrity": "sha512-tVDUTKO/gJnEv94HTyBWW/e/JwsZIslByzehuXQ7QvrngEh28gvHaCRwKMX/cqprizu4TFqvfx4Xh2n9e5XekA==", - "dev": true, - "requires": { - "base64-loader": "1.0.0" - } - }, - "scratch-storage": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.2.tgz", - "integrity": "sha512-Xi169m/k6yYJU7aXTLgIxWjIumYamMSkRdSQiQ39p6kQeniGzm8ncBbJuGOs1UDh0Y3b6g1DrqX24YaSQL201w==", - "dev": true, - "requires": { - "arraybuffer-loader": "^1.0.3", - "base64-js": "1.3.0", - "js-md5": "0.7.3", - "minilog": "3.1.0", - "nets": "3.2.0", - "text-encoding": "0.7.0", - "worker-loader": "^2.0.0" - }, - "dependencies": { - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - } - } - }, - "scratch-svg-renderer": { - "version": "0.2.0-prerelease.20200109070519", - "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20200109070519.tgz", - "integrity": "sha512-THdZW9gA8mFKvDImHDrWWhvyOymUW3JgMBjpPsaFk2URl1kfNIRQIndfwto2B8a8YbtuyKSv6CWW8Nu+VzBZVA==", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "base64-loader": "1.0.0", - "minilog": "3.1.0", - "scratch-render-fonts": "1.0.0-prerelease.20180906193204", - "transformation-matrix": "1.15.0" - }, - "dependencies": { - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "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" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "startaudiocontext": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", - "integrity": "sha1-RtLKtUYseRGArMciPju7wycshZU=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trim": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", - "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - } - }, - "super-animejs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/super-animejs/-/super-animejs-3.1.0.tgz", - "integrity": "sha512-6MFAFJDRuvwkovxQZPruuyHinTa4rgj4hNLOndjcYYhZLckoXtVRY9rJPuq8p6c/tgZJrFYEAYAfJ2/hhNtUCA==" - }, - "super-three": { - "version": "0.111.6", - "resolved": "https://registry.npmjs.org/super-three/-/super-three-0.111.6.tgz", - "integrity": "sha512-/OJTOBpmm7MRx8R0G5Zr9sX8EqsELy7SwATb5n0FP145QsrP134pY2W489sfkJYqZmGkpHmG1ulQ0M94icThBw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-to-image": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/svg-to-image/-/svg-to-image-1.1.3.tgz", - "integrity": "sha1-1v9NiDyo9+P3krQrIyixXL4vsPM=", - "dev": true, - "requires": { - "load-img": "^1.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", - "dev": true - }, - "tcp-port-used": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", - "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", - "dev": true, - "requires": { - "debug": "4.1.0", - "is2": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "terser": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", - "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "text-encoding": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", - "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "three-bmfont-text": { - "version": "github:dmarcos/three-bmfont-text#1babdf8507c731a18f8af3b807292e2b9740955e", - "from": "github:dmarcos/three-bmfont-text#1babdf8507c731a18f8af3b807292e2b9740955e", - "requires": { - "array-shuffle": "^1.0.1", - "inherits": "^2.0.1", - "layout-bmfont-text": "^1.2.0", - "nice-color-palettes": "^1.0.1", - "object-assign": "^4.0.1", - "quad-indices": "^2.0.1", - "three-buffer-vertex-data": "github:dmarcos/three-buffer-vertex-data#69378fc58daf27d3b1d930df9f233473e4a4818c" - } - }, - "three-buffer-vertex-data": { - "version": "github:dmarcos/three-buffer-vertex-data#69378fc58daf27d3b1d930df9f233473e4a4818c", - "from": "github:dmarcos/three-buffer-vertex-data#69378fc58daf27d3b1d930df9f233473e4a4818c", - "requires": { - "flatten-vertex-data": "^1.0.0" - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-style": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/to-style/-/to-style-1.3.3.tgz", - "integrity": "sha1-Y6K3Cm9KfU/cLtV6C+TnI1y2aZw=", - "dev": true - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "transformation-matrix": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.0.tgz", - "integrity": "sha512-808EqPQbmUD6/IMpWUXLOZcblCHf9xaiB+un0RYNNE9+6VRjoiw6Be8R32tZ0ips1PX/15tlnA2Ev4UUgg827Q==", - "dev": true - }, - "transifex": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/transifex/-/transifex-1.6.6.tgz", - "integrity": "sha512-uHeRvhfLfZN+JdH+X0zR1jkQAbMGkgExZgcXm31CzaVVd4kq98YaPr4MCgCU0LwA7cgOuB97d2HZQ/WikOAxlg==", - "dev": true, - "requires": { - "commander": "^2.9.0", - "lodash": "^4.17.1", - "mkpath": "^1.0.0", - "mocha": "^4.0.0", - "request": "^2.34.0", - "should": "^13.0.0" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.20", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", - "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - } - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url2": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", - "integrity": "sha1-Tqq9HVw6yQ1iq0SFyZhCKGWgSxo=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wav-encoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wav-encoder/-/wav-encoder-1.3.0.tgz", - "integrity": "sha512-FXJdEu2qDOI+wbVYZpu21CS1vPEg5NaxNskBr4SaULpOJMrLE6xkH8dECa7PiS+ZoeyvP7GllWUAxPN3AvFSEw==", - "dev": true - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "weak-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", - "integrity": "sha1-tm5Wqd8L0lp2u/G1FNsSkIBhSjc=", - "dev": true - }, - "web-audio-test-api": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/web-audio-test-api/-/web-audio-test-api-0.5.2.tgz", - "integrity": "sha1-weJNIc7QYD8aSVJyoetmnbKIc/o=", - "dev": true - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.0.tgz", - "integrity": "sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", - "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", - "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "webvr-polyfill": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/webvr-polyfill/-/webvr-polyfill-0.10.11.tgz", - "integrity": "sha512-mzTuMpC3W/aKmm5QxYtTzXAxhVo3tR4c0D5Kihk8Q38GVxiCOvS4Ga4LBN8CsFVpXu1WkGeuf/hMzF75iWYiyA==", - "requires": { - "cardboard-vr-display": "^1.0.18" - } - }, - "webvr-polyfill-dpdb": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/webvr-polyfill-dpdb/-/webvr-polyfill-dpdb-1.0.17.tgz", - "integrity": "sha512-WOd4s0gSrb0fOlOtIpqFbwLBATax/ka7DFAB/u+C9KJBBJk1/x/FZlFynOqsNrUxMJniOdO7ViFJwVdMScMQzA==" - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "whatwg-url": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", - "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrapper": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/word-wrapper/-/word-wrapper-1.0.7.tgz", - "integrity": "sha1-HxSv6/Zt/fD+9V79NxhO+9CMKLY=" - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", - "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", - "dev": true, - "requires": { - "loader-utils": "^1.0.0", - "schema-utils": "^0.4.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - } - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" - }, - "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", - "requires": { - "sax": ">=0.6.0", - "util.promisify": "~1.0.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - } - } + "name": "scratch-gui", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "scratch-gui", + "version": "0.1.0", + "license": "BSD-3-Clause", + "devDependencies": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.1.0", + "@babel/preset-env": "^7.1.0", + "@babel/preset-react": "^7.0.0", + "arraybuffer-loader": "^1.0.6", + "autoprefixer": "^9.0.1", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.0.1", + "babel-loader": "^8.0.5", + "base64-loader": "1.0.0", + "bowser": "1.9.4", + "chromedriver": "78.0.1", + "classnames": "2.2.6", + "computed-style-to-inline-style": "3.0.0", + "copy-webpack-plugin": "^4.5.1", + "core-js": "2.5.7", + "css-loader": "^1.0.0", + "enzyme": "^3.5.0", + "enzyme-adapter-react-16": "1.3.0", + "es6-object-assign": "1.1.0", + "eslint": "^5.0.1", + "eslint-config-scratch": "^5.0.0", + "eslint-import-resolver-webpack": "^0.11.1", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-jest": "^22.14.1", + "eslint-plugin-react": "^7.12.4", + "file-loader": "2.0.0", + "get-float-time-domain-data": "0.1.0", + "get-user-media-promise": "1.1.4", + "gh-pages": "github:rschamp/gh-pages#publish-branch-to-subfolder", + "html-webpack-plugin": "^3.2.0", + "immutable": "3.8.2", + "intl": "1.2.5", + "jest": "^21.0.0", + "jest-junit": "^7.0.0", + "js-base64": "2.4.9", + "keymirror": "0.1.1", + "lodash.bindall": "4.4.0", + "lodash.debounce": "4.0.8", + "lodash.defaultsdeep": "4.6.0", + "lodash.isequal": "4.5.0", + "lodash.omit": "4.5.0", + "lodash.pick": "4.4.0", + "lodash.throttle": "4.0.1", + "minilog": "3.1.0", + "mkdirp": "^0.5.1", + "omggif": "1.0.9", + "papaparse": "5.1.1", + "postcss-import": "^12.0.0", + "postcss-loader": "^3.0.0", + "postcss-simple-vars": "^5.0.1", + "prop-types": "^15.5.10", + "query-string": "^5.1.1", + "raf": "^3.4.0", + "raw-loader": "^0.5.1", + "react": "16.2.0", + "react-contextmenu": "2.9.4", + "react-dom": "16.2.0", + "react-draggable": "3.0.5", + "react-ga": "2.5.3", + "react-google-picker": "^0.1.0", + "react-intl": "2.9.0", + "react-modal": "3.9.1", + "react-popover": "0.5.10", + "react-redux": "5.0.7", + "react-responsive": "^4", + "react-style-proptype": "3.2.2", + "react-tabs": "2.3.0", + "react-test-renderer": "16.2.0", + "react-tooltip": "3.8.0", + "react-virtualized": "9.20.1", + "redux": "3.7.2", + "redux-mock-store": "^1.2.3", + "redux-throttle": "0.1.1", + "rimraf": "^2.6.1", + "scratch-audio": "0.1.0-prerelease.20190925183642", + "scratch-blocks": "0.1.0-prerelease.1578322100", + "scratch-l10n": "3.7.20200108141814", + "scratch-paint": "0.2.0-prerelease.20200109073728", + "scratch-storage": "1.3.2", + "scratch-svg-renderer": "0.2.0-prerelease.20200109070519", + "selenium-webdriver": "3.6.0", + "startaudiocontext": "1.2.1", + "style-loader": "^0.23.0", + "svg-to-image": "1.1.3", + "text-encoding": "0.7.0", + "to-style": "1.3.3", + "uglifyjs-webpack-plugin": "^1.2.5", + "wav-encoder": "1.3.0", + "web-audio-test-api": "^0.5.2", + "webpack": "^4.6.0", + "webpack-cli": "^3.1.0", + "webpack-dev-server": "^3.10.0", + "xhr": "2.5.0" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", + "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.8", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@scratch/paper": { + "version": "0.11.20190729152410", + "resolved": "https://registry.npmjs.org/@scratch/paper/-/paper-0.11.20190729152410.tgz", + "integrity": "sha512-8DvLPFbipP7O8fii6xItaA041fdW4pdr63m34xlSs15sYP5fX9yiZiO3G44qk5eBPbFNQTG7uxMd5Jo+cVS5Ow==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "dependencies": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "engines": { + "node": ">=6.14.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", + "dev": true, + "dependencies": { + "acorn": "^4.0.4" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/airbnb-prop-types": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", + "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", + "dev": true, + "dependencies": { + "array.prototype.find": "^2.1.1", + "function.prototype.name": "^1.1.2", + "is-regex": "^1.1.0", + "object-is": "^1.1.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2", + "prop-types": "^15.7.2", + "prop-types-exact": "^1.2.0", + "react-is": "^16.13.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha512-Yisb7ew0ZEyDtRYQ+b+26o9KbiYPFxwcsxKzbssigzRRMJ9LpExPVUg6Fos7eP7yP3q7///tzze4nm4lTptPBw==", + "dev": true, + "dependencies": { + "default-require-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true + }, + "node_modules/array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.2.tgz", + "integrity": "sha512-us+UrmGOilqttSOgoWZTpOvHu68vZT2YCjc/H4vhu56vzZpaDFBhB+Se2UwqWzMKbDv7Myq5M5pcZLAtUvTQdQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.find": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.1.tgz", + "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arraybuffer-loader": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/arraybuffer-loader/-/arraybuffer-loader-1.0.8.tgz", + "integrity": "sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.2.tgz", + "integrity": "sha512-i0Jx7SEZNG5i+F9hrUILpfDkuVJxf+UqmsS6LVn3UdUegQryKplU5t5opYYkDPW0eKBeJUSiiuphgkUZagx5ZQ==", + "dev": true, + "dependencies": { + "lodash": "^4.14.0" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/audio-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/audio-context/-/audio-context-1.0.1.tgz", + "integrity": "sha512-b7ZmHGyjcAI3KmshPa4YSPxPbjglZQtKfZtzqhUfE3VeoANTsNffywkmujI32Sj31Aku/aB9s3BW4r3nmTF88g==", + "deprecated": "Depends on Web-Audio-API implementation. Use either web-audio-api, web-audio-js or web-audio-engine package.", + "dev": true, + "dependencies": { + "global": "^4.3.1" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "node_modules/babel-generator/node_modules/jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/babel-generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", + "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", + "dev": true, + "dependencies": { + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^21.2.0" + }, + "peerDependencies": { + "babel-core": "^6.0.0 || ^7.0.0-alpha || ^7.0.0-beta || ^7.0.0" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/babel-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", + "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", + "dev": true + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-react-intl": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-3.5.1.tgz", + "integrity": "sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==", + "deprecated": "this package has been renamed to babel-plugin-formatjs", + "dev": true, + "dependencies": { + "@babel/core": "^7.4.5", + "@babel/helper-plugin-utils": "^7.0.0", + "@types/babel__core": "^7.1.2", + "fs-extra": "^8.0.1", + "intl-messageformat-parser": "^1.8.1" + } + }, + "node_modules/babel-plugin-react-intl/node_modules/intl-messageformat-parser": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", + "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", + "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dev": true + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==", + "dev": true + }, + "node_modules/babel-preset-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", + "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^21.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "node_modules/babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "dev": true, + "dependencies": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "node_modules/babel-register/node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-register/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-register/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-register/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/babel-register/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-register/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-register/node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "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" + } + }, + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-loader/-/base64-loader-1.0.0.tgz", + "integrity": "sha512-p32+F8dg+ANGx7s8QsZS74ZPHfIycmC2yZcoerzFgbersIYWitPbbF39G6SBx3gyvzyLH5nt1ooocxr0IHuWKA==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "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" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "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" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha512-IS4lTgp57lUcpXzyCaiUQcRZBxZAkzl+jNXrMUXZjdnr2yujpKUMG9OYeYL29i6fL66ihypvVJ/MeX0B+9pWOg==", + "dev": true, + "dependencies": { + "rsvp": "^3.3.3" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromedriver": { + "version": "78.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-78.0.1.tgz", + "integrity": "sha512-eOsyFk4xb9EECs1VMrDbxO713qN+Bu1XUE8K9AuePc3839TPdAegg72kpXSzkeNqRNZiHbnJUItIVCLFkDqceA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "del": "^4.1.1", + "extract-zip": "^1.6.7", + "mkdirp": "^0.5.1", + "request": "^2.88.0", + "tcp-port-used": "^1.0.1" + }, + "bin": { + "chromedriver": "bin/chromedriver" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", + "dev": true + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collections": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "integrity": "sha512-XMGG5GPXUnjERaZzrBIfJo3iY3ck2ChSlL73iRk0UrT39Ei0HaKxhWL4NdrFjF72SCI/QGGa3U5CnN0BgbSgnw==", + "dev": true, + "dependencies": { + "weak-map": "1.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/computed-style-to-inline-style": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/computed-style-to-inline-style/-/computed-style-to-inline-style-3.0.0.tgz", + "integrity": "sha512-6XAOG2ZZkpCfbM9AhRN4/wjMgQujtH/2q/eowZON190oAASUjEb3jwcodjmRlR8HNDMahJdBQwchuDftOtF7eg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "dependencies": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", + "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "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" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-loader/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", + "dev": true + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==", + "dev": true, + "dependencies": { + "is-in-browser": "^1.0.2" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "dev": true, + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha512-Dn2eAftOqXhNXs5f/Xjn7QTZ6kDYkx7u0EXQInN1oyYwsZysu11q7oTtaKcbzLxZRJiDHa8VmwpWmb4lY5FqgA==", + "dev": true, + "dependencies": { + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "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" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/enzyme": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", + "dev": true, + "dependencies": { + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", + "has": "^1.0.3", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/enzyme-adapter-react-16": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.3.0.tgz", + "integrity": "sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==", + "dev": true, + "dependencies": { + "enzyme-adapter-utils": "^1.6.0", + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "object.values": "^1.0.4", + "prop-types": "^15.6.2", + "react-is": "^16.4.2", + "react-test-renderer": "^16.0.0-0" + }, + "peerDependencies": { + "enzyme": "^3.0.0", + "react": "^16.0.0-0", + "react-dom": "^16.0.0-0" + } + }, + "node_modules/enzyme-adapter-utils": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz", + "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", + "dev": true, + "dependencies": { + "airbnb-prop-types": "^2.16.0", + "function.prototype.name": "^1.1.5", + "has": "^1.0.3", + "object.assign": "^4.1.4", + "object.fromentries": "^2.0.5", + "prop-types": "^15.8.1", + "semver": "^5.7.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "peerDependencies": { + "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" + } + }, + "node_modules/enzyme-adapter-utils/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/enzyme-shallow-equal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", + "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "object-is": "^1.1.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + } + }, + "node_modules/eslint-config-scratch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-5.1.0.tgz", + "integrity": "sha512-JQMxERL3eo0TMy87NZFm6yS0i2XOMplffKz9CD/2ta2i/+3FTgajxzF9n7R7vi9C+GMLSTSLZJ5X90tINuAhjg==", + "dev": true, + "optionalDependencies": { + "eslint-plugin-react": ">=7.14.2" + }, + "peerDependencies": { + "babel-eslint": ">=8.0.1", + "eslint": ">=4.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.11.1.tgz", + "integrity": "sha512-eK3zR7xVQR/MaoBWwGuD+CULYVuqe5QFlDukman71aI6IboCGzggDUohHNfu1ZeBnbHcUHJc0ywWoXUBNB6qdg==", + "dev": true, + "dependencies": { + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^1.1.0", + "has": "^1.0.1", + "interpret": "^1.0.0", + "lodash": "^4.17.4", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.10.0", + "semver": "^5.3.0" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-jest": { + "version": "22.21.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.21.0.tgz", + "integrity": "sha512-OaqnSS7uBgcGiqXUiEnjoqxPNKvR4JWG5mSRkzVoR6+vDwlqqp11beeql1hYs0HTbdhiwrxWLxbX0Vx7roG3Ew==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "^1.13.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.31.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", + "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "dependencies": { + "merge": "^1.2.0" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "dev": true + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dev": true, + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", + "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "jest-diff": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0" + } + }, + "node_modules/exports-loader": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz", + "integrity": "sha512-vBQgTnvmEB7qWmr7gzAzJRWptzYhkhvdXeH8sRnS//mIai6MgLZe1crlQ+VWTjCCXLlnhGuiuVMq0YfjA5AUOw==", + "dev": true, + "dependencies": { + "loader-utils": "0.2.x", + "source-map": "0.1.x" + } + }, + "node_modules/exports-loader/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/exports-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/exports-loader/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/exports-loader/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/exports-loader/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", + "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", + "dev": true, + "dependencies": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs/node_modules/core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0 < 7.0.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha512-UxowFKnAFIwtmSxgKjWAVgjE3Fk7MQJT0ZIyl0NwIFZTrx4913rLaonGJ84V+x/2+w/pe4ULHRns+GZPs1TVuw==", + "dev": true, + "dependencies": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-float-time-domain-data": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-float-time-domain-data/-/get-float-time-domain-data-0.1.0.tgz", + "integrity": "sha512-6lWdVMny7vJ+xWxGUmVdSW7rd4L2byptiVkjH3QEBsxcHSa8UbC/HsZmixHK/ZQ1EYsOaQjaeRgR+NAsIerEJQ==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stream/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-user-media-promise": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/get-user-media-promise/-/get-user-media-promise-1.1.4.tgz", + "integrity": "sha512-k49YuV2z0d3gKHLPTFKYfzEA9kduuQk7YBf8ev2dxrKk+DhMyuzfQnK9ZSxkEhE/jv3BZY62M0eICWa7lak9nw==", + "dev": true + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gh-pages": { + "version": "0.12.0", + "resolved": "git+ssh://git@github.com/rschamp/gh-pages.git#47e5e5c376ca65f4b407325e115174172d9c12ae", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "2.1.2", + "commander": "2.9.0", + "globby": "^6.1.0", + "graceful-fs": "4.1.10", + "q": "1.4.1", + "q-io": "1.13.2", + "rimraf": "^2.5.4" + }, + "bin": { + "gh-pages": "bin/gh-pages" + } + }, + "node_modules/gh-pages/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/gh-pages/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/graceful-fs": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.10.tgz", + "integrity": "sha512-fUSlmTortW+/Fr7OuwVfhHAK3/8Q3J2BxjdHKD2pw9b7fSTEtUmf1Dxc+yByw7r/BDVJT1iWKoLXdAN+qpAKFw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gh-pages/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dev": true, + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-element-map": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", + "deprecated": "3.x is no longer supported", + "dev": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/html-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/icss-utils/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imports-loader": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", + "integrity": "sha512-fYIzBL9JOzJszvfeSGSKVjAtkWEtPUwP+OWiUxIWApcxsYh3iqZWZAp8xjTuhsvqglhqaetxeLLTaYyxIv1d4Q==", + "dev": true, + "dependencies": { + "loader-utils": "0.2.x", + "source-map": "0.1.x" + } + }, + "node_modules/imports-loader/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/imports-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/imports-loader/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/imports-loader/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/imports-loader/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/intl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", + "integrity": "sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==", + "dev": true + }, + "node_modules/intl-format-cache": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-2.2.9.tgz", + "integrity": "sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ==", + "dev": true + }, + "node_modules/intl-messageformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-2.2.0.tgz", + "integrity": "sha512-I+tSvHnXqJYjDfNmY95tpFMj30yoakC6OXAo+wu/wTMy6tA/4Fd4mvV7Uzs4cqK/Ap29sHhwjcY+78a8eifcXw==", + "dev": true, + "dependencies": { + "intl-messageformat-parser": "1.4.0" + } + }, + "node_modules/intl-messageformat-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz", + "integrity": "sha512-/XkqFHKezO6UcF4Av2/Lzfrez18R0jyw7kRFhSeB/YRakdrgSc9QfFZUwNJI9swMwMoNPygK1ArC5wdFSjPw+A==", + "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dev": true + }, + "node_modules/intl-relativeformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz", + "integrity": "sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw==", + "deprecated": "This package has been deprecated, please see migration guide at 'https://github.com/formatjs/formatjs/tree/master/packages/intl-relativeformat#migration-guide'", + "dev": true, + "dependencies": { + "intl-messageformat": "^2.0.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha512-C2wz7Juo5pUZTFQVer9c+9b4qw3I5T/CHQxQyhVu7BJel6C22FmsLIWsdseYyOw6xz9Pqy9eJWSkQ7+3iN1HVw==", + "dev": true, + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dev": true, + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", + "dev": true, + "dependencies": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "dependencies": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "node_modules/istanbul-api/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "node_modules/istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "dependencies": { + "append-transform": "^0.4.0" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "dependencies": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "dependencies": { + "handlebars": "^4.0.3" + } + }, + "node_modules/jest": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", + "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", + "dev": true, + "dependencies": { + "jest-cli": "^21.2.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jest-changed-files": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", + "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", + "dev": true, + "dependencies": { + "throat": "^4.0.0" + } + }, + "node_modules/jest-cli": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", + "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^21.2.0", + "jest-config": "^21.2.1", + "jest-environment-jsdom": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve-dependencies": "^21.2.0", + "jest-runner": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-snapshot": "^21.2.1", + "jest-util": "^21.2.1", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^3.0.0", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^9.0.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jest-cli/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-cli/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-config": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", + "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^21.2.1", + "jest-environment-node": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "jest-validate": "^21.2.1", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-diff": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", + "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "node_modules/jest-environment-jsdom": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", + "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", + "dev": true, + "dependencies": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1", + "jsdom": "^9.12.0" + } + }, + "node_modules/jest-environment-node": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", + "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", + "dev": true, + "dependencies": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1" + } + }, + "node_modules/jest-get-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", + "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "dev": true + }, + "node_modules/jest-haste-map": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", + "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", + "dev": true, + "dependencies": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^21.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0", + "worker-farm": "^1.3.1" + } + }, + "node_modules/jest-jasmine2": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", + "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "expect": "^21.2.1", + "graceful-fs": "^4.1.11", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-snapshot": "^21.2.1", + "p-cancelable": "^0.3.0" + } + }, + "node_modules/jest-junit": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-7.0.0.tgz", + "integrity": "sha512-ljUdO0hLyu0A92xk7R2Wet3kj99fmazTo+ZFYQP6b7AGOBxJUj8ZkJWzJ632ajpXko2Y5oNoGR2kvOwiDdu6hg==", + "dev": true, + "dependencies": { + "jest-validate": "^24.0.0", + "mkdirp": "^0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-junit/node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-matcher-utils": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", + "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-message-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", + "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0" + } + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-mock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", + "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==", + "dev": true + }, + "node_modules/jest-regex-util": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", + "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==", + "dev": true + }, + "node_modules/jest-resolve": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", + "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", + "dev": true, + "dependencies": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1", + "is-builtin-module": "^1.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", + "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", + "dev": true, + "dependencies": { + "jest-regex-util": "^21.2.0" + } + }, + "node_modules/jest-runner": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", + "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", + "dev": true, + "dependencies": { + "jest-config": "^21.2.1", + "jest-docblock": "^21.2.0", + "jest-haste-map": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-util": "^21.2.1", + "pify": "^3.0.0", + "throat": "^4.0.0", + "worker-farm": "^1.3.1" + } + }, + "node_modules/jest-runner/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-runtime": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", + "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", + "dev": true, + "dependencies": { + "babel-core": "^6.0.0", + "babel-jest": "^21.2.0", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^9.0.0" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + } + }, + "node_modules/jest-runtime/node_modules/babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "node_modules/jest-runtime/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/jest-runtime/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jest-runtime/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jest-snapshot": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", + "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/jest-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", + "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "jest-message-util": "^21.2.1", + "jest-mock": "^21.2.0", + "jest-validate": "^21.2.1", + "mkdirp": "^0.5.1" + } + }, + "node_modules/jest-validate": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", + "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, + "node_modules/js-base64": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", + "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "dev": true + }, + "node_modules/js-md5": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz", + "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==", + "dev": true, + "dependencies": { + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dev": true, + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keymirror": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz", + "integrity": "sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg==", + "dev": true + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/load-img": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-img/-/load-img-1.0.0.tgz", + "integrity": "sha512-SoxyNMXFymxoBo6tv84k3EoB+huPPBu9pqXz5pCV6839lccjTDNk9saAzxl77/56FsBcgTZxwH7RowTBksxwLw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "node_modules/lodash.bindall": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.bindall/-/lodash.bindall-4.4.0.tgz", + "integrity": "sha512-NQ+QvFohS2gPbWpyLfyuiF0ZQA3TTaJ+n0XDID5jwtMZBKE32gN5vSyy7xBVsqvJkvT/UY9dvHXIk9tZmBVF3g==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz", + "integrity": "sha512-Y19StDHa0+sN192s6kWnc3UnZS11iMjl93BfPUuh4lPxOlqcS0sLFTO8g4QgYftgYO3oP/TnARy/jgPpHE6+4Q==", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", + "dev": true + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.0.1.tgz", + "integrity": "sha512-vEeVrketgBFJ268V478NKyLk142uvnlFHuRHUUcu5NhsMQQpTs5EIGZduGNqdJOOhnb+Rwkz0XvfQuwOYzRo1Q==", + "dev": true, + "dependencies": { + "lodash.debounce": "^4.0.0" + } + }, + "node_modules/lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchmediaquery": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.2.1.tgz", + "integrity": "sha512-9Ssn6kNVoYU970FtX6jS74GAyKc2baQaoifG1X/i6tfqLQgf3aM4ovYYBVWVOk4G14odceUarbwgSjDTLL/Dhw==", + "dev": true, + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true + }, + "node_modules/merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microee": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/microee/-/microee-0.0.6.tgz", + "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==", + "dev": true + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimeparse": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "integrity": "sha512-jiuAsJJY4c0oF97oHKic9nva2y1QF2yhYJG3LXLys//f8SNQ89eFuGZ29z62Z29CAY4endJS6zFiKUtURFErog==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minilog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minilog/-/minilog-3.1.0.tgz", + "integrity": "sha512-Xfm4jWjWzSAduvEWtuZX/8TMkxfJlCfH7XvikCZe3ptojYTBq1eoEs3rh9/3LNLOckUP86m+8l8+Iw5NU/pBww==", + "dev": true, + "dependencies": { + "microee": "0.0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", + "integrity": "sha512-PbNHr7Y/9Y/2P5pKFv5XOGBfNQqZ+fdiHWcuf7swLACN5ZW5LU7J5tMU8LSBjpluAxAxKYGD9nnaIbdRy9+m1w==", + "dev": true + }, + "node_modules/mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha/node_modules/commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/mocha/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "dev": true + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nets": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nets/-/nets-3.2.0.tgz", + "integrity": "sha512-5644wFwLQzom2zx/4CzQXO8OcOADf1otKe5vUvfAqXes18gruSv18wGIBHlNclTGQuOOLgzGPYKen26tfNIfBQ==", + "dev": true, + "dependencies": { + "request": "^2.65.0", + "xhr": "^2.1.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "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_modules/node-notifier": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/omggif": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", + "integrity": "sha512-VYAQRSZo7qoBcwB5G29YqVPLnxvDkWulE3x35kwH3bq4GdH/ZkHrcPPhxVfaOGYGZ5KV2/55UpcjcyNIO1qZoQ==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/os-locale/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/papaparse": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.1.1.tgz", + "integrity": "sha512-KPkW4GNQxunmYTeJIjHFrvilcNuHBWrfgbyvmagEmfGOA4hnP1WIkPbv4yABhj1Nam3as4w+7MBiI27BntwqVg==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "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" + } + }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-color/node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", + "dev": true + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-import/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==", + "dev": true, + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-simple-vars": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", + "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", + "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-exact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", + "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "object.assign": "^4.1.0", + "reflect.ownkeys": "^0.2.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "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" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/q-io": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.2.tgz", + "integrity": "sha512-5PzgT/jVGwfwgpbN2KxjcaYdaWZyoTPeyQjM1toS5mLwlnRb5BxpnGTCQLUgMIs7b31MuIn14ZJd5pvQlvv8Xw==", + "dev": true, + "dependencies": { + "collections": "^0.2.0", + "mime": "^1.2.11", + "mimeparse": "^0.1.4", + "q": "^1.0.1", + "qs": "^1.2.1", + "url2": "^0.0.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==", + "dev": true + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", + "dev": true + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", + "dev": true + }, + "node_modules/react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", + "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", + "dev": true, + "dependencies": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-contextmenu": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.9.4.tgz", + "integrity": "sha512-ma4YQw4J7JNv8L8mMVd1NHHbvH3+gaK/rQ6FC5Tft7OCUweKi7PHqHEE0fDF2009FLSGoV5JnjPnTTEyThqaJg==", + "dev": true, + "dependencies": { + "classnames": "^2.2.5", + "object-assign": "^4.1.0" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/react-dom": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", + "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", + "deprecated": "This version of react-dom/server contains a minor vulnerability. Please update react-dom to 16.2.1 or 16.4.2+. Learn more: https://fb.me/cve-2018-6341", + "dev": true, + "dependencies": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^16.0.0" + } + }, + "node_modules/react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "dev": true, + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, + "node_modules/react-ga": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-2.5.3.tgz", + "integrity": "sha512-25wvPv1PVLDLhw1gEYP33h0V2sJHahKMfUCAxhq8JPYmNQwx1fcjJAkJk+WmSqGN93lHLhExDkxy3SQizQnx3A==", + "dev": true, + "optionalDependencies": { + "prop-types": "^15.6.0", + "react": "^15.6.2 || ^16.0" + } + }, + "node_modules/react-google-picker": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/react-google-picker/-/react-google-picker-0.1.0.tgz", + "integrity": "sha512-0y3TtinsdNwEx77Upsmh7Q4bXuBt/d/KntQDNxLOIf2v77UQQi0FBYAtAkjrkP28IOX7gfcXhdY5XXZRGHSODw==", + "dev": true, + "dependencies": { + "load-script": "^1.0.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-intl": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-2.9.0.tgz", + "integrity": "sha512-27jnDlb/d2A7mSJwrbOBnUgD+rPep+abmoJE511Tf8BnoONIAUehy/U1zZCHGO17mnOwMWxqN4qC0nW11cD6rA==", + "dev": true, + "dependencies": { + "hoist-non-react-statics": "^3.3.0", + "intl-format-cache": "^2.0.5", + "intl-messageformat": "^2.1.0", + "intl-relativeformat": "^2.1.0", + "invariant": "^2.1.1" + }, + "peerDependencies": { + "prop-types": "^15.5.4", + "react": "^0.14.9 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/react-intl-redux": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-intl-redux/-/react-intl-redux-0.7.0.tgz", + "integrity": "sha512-T7I7Yy1UkvD8rOB1B+SCG63LYJBtBcvGJ8FVJ8g8Yjhm4+rEhKzJuh1MaQBhwKZNlVcHlx4SlKdtkw8urdZdrA==", + "dev": true, + "peer": true, + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react-intl": "^2.2.2", + "react-redux": "^5.0.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "dev": true + }, + "node_modules/react-modal": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.9.1.tgz", + "integrity": "sha512-k+TUkhGWpIVHLsEyjNmlyOYL0Uz03fNZvlkhCImd1h+6fhNgTi6H6jexVXPVhD2LMMDzJyfugxMN+APN/em+eQ==", + "dev": true, + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16", + "react-dom": "^0.14.0 || ^15.0.0 || ^16" + } + }, + "node_modules/react-popover": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/react-popover/-/react-popover-0.5.10.tgz", + "integrity": "sha512-5SYDTfncywSH00I70oHd4gFRUR8V0rJ4sRADSI/P6G0RVXp9jUgaWloJ0Bk+SFnjpLPuipTKuzQNNd2CTs5Hrw==", + "dev": true, + "dependencies": { + "css-vendor": "^0.3.1", + "debug": "^2.6.8", + "lodash.throttle": "^3.0.3", + "prop-types": "^15.5.10" + } + }, + "node_modules/react-popover/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/react-popover/node_modules/lodash.debounce": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha512-lcmJwMpdPAtChA4hfiwxTtgFeNAaow701wWUgVUqeD0XJF7vMXIN+bu/2FJSGxT0NUbZy9g9VFrlOFfPjl+0Ew==", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0" + } + }, + "node_modules/react-popover/node_modules/lodash.throttle": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-3.0.4.tgz", + "integrity": "sha512-dRU/xiF4W8a521NYnQosG5drDqv4+hp3ND6yWNJUMnwO1E87Q/A7oc9M/g6pk29K9U3j/ZWhM3BAQZyr/P6TTQ==", + "dev": true, + "dependencies": { + "lodash.debounce": "^3.0.0" + } + }, + "node_modules/react-popover/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/react-redux": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", + "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", + "dev": true, + "dependencies": { + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.0.0", + "lodash": "^4.17.5", + "lodash-es": "^4.17.5", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0-0", + "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/react-redux/node_modules/hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "dev": true + }, + "node_modules/react-responsive": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-4.1.0.tgz", + "integrity": "sha512-ZuDraf0qsJlyiTwzeva+foHx83IP6SIhru9o7BvMwQ4ZHjRIL5WjdgVNNrKSRbmeWO9rEJoMpabei/5lJn8KaA==", + "dev": true, + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.2.1", + "prop-types": "^15.6.1" + }, + "engines": { + "node": ">= 0.10" + }, + "peerDependencies": { + "react": "^16.0.0" + } + }, + "node_modules/react-style-proptype": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", + "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", + "dev": true, + "dependencies": { + "prop-types": "^15.5.4" + } + }, + "node_modules/react-tabs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-2.3.0.tgz", + "integrity": "sha512-pYaefgVy76/36AMEP+B8YuVVzDHa3C5UFZ3REU78zolk0qMxEhKvUFofvDCXyLZwf0RZjxIfiwok1BEb18nHyA==", + "dev": true, + "dependencies": { + "classnames": "^2.2.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0" + } + }, + "node_modules/react-test-renderer": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.2.0.tgz", + "integrity": "sha512-Kd4gJFtpNziR9ElOE/C23LeflKLZPRpNQYWP3nQBY43SJ5a+xyEGSeMrm2zxNKXcnCbBS/q1UpD9gqd5Dv+rew==", + "dev": true, + "dependencies": { + "fbjs": "^0.8.16", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^16.0.0" + } + }, + "node_modules/react-tooltip": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.8.0.tgz", + "integrity": "sha512-Uj/vVd0uGuqwTkWeRjKS56T2iwOSvsSMbjqTK7AseHZEMND+WCXXUajaF7+ZsJWTZgnpeT9kBnaBFhchzeDTbw==", + "dev": true, + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + }, + "engines": { + "node": ">=4.2.1" + }, + "peerDependencies": { + "react": ">=0.14", + "react-dom": ">=0.14" + } + }, + "node_modules/react-virtualized": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.20.1.tgz", + "integrity": "sha512-xIWxBsyNAjceqD3hsE0nw5TcDVxKbIepsHhvS2XneHmNz0KlKxdLdGBmGZBM9ZesEmbZ5EO0Sw70TB1MeCmpbQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "classnames": "^2.2.3", + "dom-helpers": "^2.4.0 || ^3.0.0", + "loose-envify": "^1.3.0", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha", + "react-dom": "^15.3.0 || ^16.0.0-alpha" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "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" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dev": true, + "dependencies": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "node_modules/redux-mock-store": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.4.tgz", + "integrity": "sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==", + "dev": true, + "dependencies": { + "lodash.isplainobject": "^4.0.6" + } + }, + "node_modules/redux-throttle": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/redux-throttle/-/redux-throttle-0.1.1.tgz", + "integrity": "sha512-24stzg4+1xtlO8ubP4HKudpBdPsG4qvbn0Z9hv8tz6fM6ZcQJe2dKEwYIqTl8+yPMGgjNKHp1lzTwRqjWCxj/Q==", + "dev": true, + "dependencies": { + "lodash.throttle": "4.0.1" + } + }, + "node_modules/reflect.ownkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", + "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", + "dev": true, + "dependencies": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "node_modules/rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true, + "engines": { + "node": "0.12.* || 4.* || 6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha512-OuZwD1QJ2R9Dbnhd7Ur8zzD8l+oADp9npyxK63Q9nZ4AjhB2QwDQcQlD8iuUsGm5AZZqtEuCaJvK1rxGRxyQ1Q==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": ">=0.6.0" + }, + "optionalDependencies": { + "fsevents": "^1.2.3" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/sane/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/sane/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scratch-audio": { + "version": "0.1.0-prerelease.20190925183642", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20190925183642.tgz", + "integrity": "sha512-cvnNawIThkIKyMZdo+cRmYO+ndCG9dcQeaG8rTgok2iSMvG510OUs3DBnFz/GUncu+OryT1VKdeusEfwKf/+ow==", + "dev": true, + "dependencies": { + "audio-context": "1.0.1", + "minilog": "^3.0.1", + "startaudiocontext": "1.2.1" + } + }, + "node_modules/scratch-blocks": { + "version": "0.1.0-prerelease.1578322100", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.1578322100.tgz", + "integrity": "sha512-36CNHELBehHX0pjyVLrkP7vqVhpkvBONDLTKx1LoYZhVXtTvP+Vknd6iKDM3gUzzAOMdpUUxVO6e/XBHz8+i1w==", + "dev": true, + "dependencies": { + "exports-loader": "0.6.3", + "imports-loader": "0.6.5" + } + }, + "node_modules/scratch-l10n": { + "version": "3.7.20200108141814", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.7.20200108141814.tgz", + "integrity": "sha512-96XEoJGqmR3f/394hcyBjHdyc3VNapaU6hQ+3/4TAvfD/8keYsJuSVkHHMD+UpodHKkkSTyQZIjbDKc9T60UMQ==", + "dev": true, + "dependencies": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "transifex": "1.6.6" + }, + "bin": { + "build-i18n-src": "scripts/build-i18n-src.js", + "tx-push-src": "scripts/tx-push-src.js" + } + }, + "node_modules/scratch-paint": { + "version": "0.2.0-prerelease.20200109073728", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200109073728.tgz", + "integrity": "sha512-PJTYShD5gl4OReRN+ZOTjSFeEuarO5YV10bbmw1BSn/pAnuEYU2dglgymNSBiGXunYaDYyaPgsJldzcnydSxHQ==", + "dev": true, + "dependencies": { + "@scratch/paper": "0.11.20190729152410", + "classnames": "2.2.5", + "keymirror": "0.1.1", + "lodash.bindall": "4.4.0", + "lodash.omit": "4.5.0", + "minilog": "3.1.0", + "parse-color": "1.0.0", + "prop-types": "^15.5.10", + "scratch-svg-renderer": "0.2.0-prerelease.20200109070519" + }, + "peerDependencies": { + "react": "^16", + "react-dom": "^16", + "react-intl": "^2", + "react-intl-redux": "^0.7", + "react-popover": "^0.5", + "react-redux": "^5", + "react-responsive": "^4", + "react-style-proptype": "^3", + "react-tooltip": "^3", + "redux": "^3" + } + }, + "node_modules/scratch-paint/node_modules/classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA==", + "dev": true + }, + "node_modules/scratch-render-fonts": { + "version": "1.0.0-prerelease.20180906193204", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20180906193204.tgz", + "integrity": "sha512-tVDUTKO/gJnEv94HTyBWW/e/JwsZIslByzehuXQ7QvrngEh28gvHaCRwKMX/cqprizu4TFqvfx4Xh2n9e5XekA==", + "dev": true, + "dependencies": { + "base64-loader": "1.0.0" + } + }, + "node_modules/scratch-storage": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.2.tgz", + "integrity": "sha512-Xi169m/k6yYJU7aXTLgIxWjIumYamMSkRdSQiQ39p6kQeniGzm8ncBbJuGOs1UDh0Y3b6g1DrqX24YaSQL201w==", + "dev": true, + "dependencies": { + "arraybuffer-loader": "^1.0.3", + "base64-js": "1.3.0", + "js-md5": "0.7.3", + "minilog": "3.1.0", + "nets": "3.2.0", + "text-encoding": "0.7.0", + "worker-loader": "^2.0.0" + } + }, + "node_modules/scratch-storage/node_modules/base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "node_modules/scratch-svg-renderer": { + "version": "0.2.0-prerelease.20200109070519", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20200109070519.tgz", + "integrity": "sha512-THdZW9gA8mFKvDImHDrWWhvyOymUW3JgMBjpPsaFk2URl1kfNIRQIndfwto2B8a8YbtuyKSv6CWW8Nu+VzBZVA==", + "dev": true, + "dependencies": { + "base64-js": "1.2.1", + "base64-loader": "1.0.0", + "minilog": "3.1.0", + "scratch-render-fonts": "1.0.0-prerelease.20180906193204", + "transformation-matrix": "1.15.0" + } + }, + "node_modules/scratch-svg-renderer/node_modules/base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "dependencies": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "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" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/startaudiocontext": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", + "integrity": "sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "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" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==", + "dev": true, + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-to-image": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-to-image/-/svg-to-image-1.1.3.tgz", + "integrity": "sha512-hRbQF6zriB1TaiL/bS6P3BCshl8ZILKEHfTyVLtQwZNIj+yDL+kxjgMCAgAQVVDRYok884a7VZbrVFLbSbleLw==", + "dev": true, + "dependencies": { + "load-img": "^1.0.0" + } + }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "node_modules/text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "deprecated": "no longer maintained", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-style": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/to-style/-/to-style-1.3.3.tgz", + "integrity": "sha512-9K8KYegr9hrdm8yPpu5iZjJp5t6RPAp4gFDU5hD9zR8hwqgF4fsoSitMtkRKQG2qkP5j/uG3wajbgV09rjmIqg==", + "dev": true + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "dev": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/transformation-matrix": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.0.tgz", + "integrity": "sha512-808EqPQbmUD6/IMpWUXLOZcblCHf9xaiB+un0RYNNE9+6VRjoiw6Be8R32tZ0ips1PX/15tlnA2Ev4UUgg827Q==", + "dev": true + }, + "node_modules/transifex": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/transifex/-/transifex-1.6.6.tgz", + "integrity": "sha512-uHeRvhfLfZN+JdH+X0zR1jkQAbMGkgExZgcXm31CzaVVd4kq98YaPr4MCgCU0LwA7cgOuB97d2HZQ/WikOAxlg==", + "dev": true, + "dependencies": { + "commander": "^2.9.0", + "lodash": "^4.17.1", + "mkpath": "^1.0.0", + "mocha": "^4.0.0", + "request": "^2.34.0", + "should": "^13.0.0" + }, + "bin": { + "transifex": "bin/index.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/transifex/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/ua-parser-js": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "dev": true, + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "dependencies": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "engines": { + "node": ">= 4.8 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uglifyjs-webpack-plugin/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/url2": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "integrity": "sha512-gb/XT1m2mnWOIbQwa5V9Dq2O07fkZbtu1K0WAAKuaNSX0c8psp2jovJTbbvPKCpimutdoK9jXOejDCtvQOoKOA==", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha512-oUcoHFG3UF2pBlHcMORAojsN09BfqSfWYWlR3eSSjUFR7eBEx53WT2HX/vZeVTTIVCGShcazb+t6IcBRCNXqvA==", + "dev": true, + "dependencies": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "optional": true, + "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" + } + }, + "node_modules/watchpack-chokidar2/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wav-encoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wav-encoder/-/wav-encoder-1.3.0.tgz", + "integrity": "sha512-FXJdEu2qDOI+wbVYZpu21CS1vPEg5NaxNskBr4SaULpOJMrLE6xkH8dECa7PiS+ZoeyvP7GllWUAxPN3AvFSEw==", + "dev": true + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/weak-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", + "integrity": "sha512-Vb13TbgdvUEmzBA5mpsMqtPqcZGJPE2gj+b8wzxsevC7WkmL3c7YZg9H0pV1Jo8C1Sa1ykk3DU08hFRGLNWvLQ==", + "dev": true + }, + "node_modules/web-audio-test-api": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/web-audio-test-api/-/web-audio-test-api-0.5.2.tgz", + "integrity": "sha512-RevLfVjp+wwe/dBPe361IpmNpeXXW6JVmlp8dk0YIxLwAh7evn6JpEQQalVgX4PH/jA8tpLpjD/8tFNUYTf88w==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "4.x.x" + } + }, + "node_modules/webpack-cli/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-cli/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/webpack-cli/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/webpack-cli/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack-cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-cli/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/webpack-cli/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "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" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/webpack/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "engines": { + "node": ">= 6.9.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0" + } + }, + "node_modules/worker-loader/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "dev": true, + "dependencies": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xhr/node_modules/global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "node_modules/xhr/node_modules/process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha512-XS0NJoM9Iz0azh1cdgfLF5VFK6BSWfrrqA0V2tIx3fV6aGrWCseVDwOkIBg746ev0hes59od5ZvQAfdET4H0pw==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "node_modules/yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/yargs/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/cli": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", + "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.8", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", + "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@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/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.10" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "@scratch/paper": { + "version": "0.11.20190729152410", + "resolved": "https://registry.npmjs.org/@scratch/paper/-/paper-0.11.20190729152410.tgz", + "integrity": "sha512-8DvLPFbipP7O8fii6xItaA041fdW4pdr63m34xlSs15sYP5fX9yiZiO3G44qk5eBPbFNQTG7uxMd5Jo+cVS5Ow==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", + "dev": true, + "requires": { + "acorn": "^4.0.4" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "airbnb-prop-types": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", + "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", + "dev": true, + "requires": { + "array.prototype.find": "^2.1.1", + "function.prototype.name": "^1.1.2", + "is-regex": "^1.1.0", + "object-is": "^1.1.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2", + "prop-types": "^15.7.2", + "prop-types-exact": "^1.2.0", + "react-is": "^16.13.1" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha512-Yisb7ew0ZEyDtRYQ+b+26o9KbiYPFxwcsxKzbssigzRRMJ9LpExPVUg6Fos7eP7yP3q7///tzze4nm4lTptPBw==", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true + }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "dev": true + }, + "array.prototype.filter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.2.tgz", + "integrity": "sha512-us+UrmGOilqttSOgoWZTpOvHu68vZT2YCjc/H4vhu56vzZpaDFBhB+Se2UwqWzMKbDv7Myq5M5pcZLAtUvTQdQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.find": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.1.tgz", + "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "arraybuffer-loader": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/arraybuffer-loader/-/arraybuffer-loader-1.0.8.tgz", + "integrity": "sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.2.tgz", + "integrity": "sha512-i0Jx7SEZNG5i+F9hrUILpfDkuVJxf+UqmsS6LVn3UdUegQryKplU5t5opYYkDPW0eKBeJUSiiuphgkUZagx5ZQ==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "audio-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/audio-context/-/audio-context-1.0.1.tgz", + "integrity": "sha512-b7ZmHGyjcAI3KmshPa4YSPxPbjglZQtKfZtzqhUfE3VeoANTsNffywkmujI32Sj31Aku/aB9s3BW4r3nmTF88g==", + "dev": true, + "requires": { + "global": "^4.3.1" + } + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "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" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "dev": true, + "requires": {} + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz", + "integrity": "sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^21.2.0" + } + }, + "babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz", + "integrity": "sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ==", + "dev": true + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-plugin-react-intl": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-react-intl/-/babel-plugin-react-intl-3.5.1.tgz", + "integrity": "sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==", + "dev": true, + "requires": { + "@babel/core": "^7.4.5", + "@babel/helper-plugin-utils": "^7.0.0", + "@types/babel__core": "^7.1.2", + "fs-extra": "^8.0.1", + "intl-messageformat-parser": "^1.8.1" + }, + "dependencies": { + "intl-messageformat-parser": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", + "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", + "dev": true + } + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==", + "dev": true + }, + "babel-preset-jest": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz", + "integrity": "sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^21.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "requires": { + "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": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-loader/-/base64-loader-1.0.0.tgz", + "integrity": "sha512-p32+F8dg+ANGx7s8QsZS74ZPHfIycmC2yZcoerzFgbersIYWitPbbF39G6SBx3gyvzyLH5nt1ooocxr0IHuWKA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "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": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha512-IS4lTgp57lUcpXzyCaiUQcRZBxZAkzl+jNXrMUXZjdnr2yujpKUMG9OYeYL29i6fL66ihypvVJ/MeX0B+9pWOg==", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "chromedriver": { + "version": "78.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-78.0.1.tgz", + "integrity": "sha512-eOsyFk4xb9EECs1VMrDbxO713qN+Bu1XUE8K9AuePc3839TPdAegg72kpXSzkeNqRNZiHbnJUItIVCLFkDqceA==", + "dev": true, + "requires": { + "del": "^4.1.1", + "extract-zip": "^1.6.7", + "mkdirp": "^0.5.1", + "request": "^2.88.0", + "tcp-port-used": "^1.0.1" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", + "dev": true + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "collections": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/collections/-/collections-0.2.2.tgz", + "integrity": "sha512-XMGG5GPXUnjERaZzrBIfJo3iY3ck2ChSlL73iRk0UrT39Ei0HaKxhWL4NdrFjF72SCI/QGGa3U5CnN0BgbSgnw==", + "dev": true, + "requires": { + "weak-map": "1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "computed-style-to-inline-style": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/computed-style-to-inline-style/-/computed-style-to-inline-style-3.0.0.tgz", + "integrity": "sha512-6XAOG2ZZkpCfbM9AhRN4/wjMgQujtH/2q/eowZON190oAASUjEb3jwcodjmRlR8HNDMahJdBQwchuDftOtF7eg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-js-compat": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", + "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "dev": true, + "requires": { + "browserslist": "^4.21.4" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "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": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "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-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "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-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", + "dev": true + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha512-Vx/Vl3zsHj32Z+WTNzGjd2iSbSIJTYHMmyGUT2nzCjj0Xk4qLfwpQ8nF6TQ5oo3Cf0s/An3DTc7LclH1BkAXbQ==", + "dev": true, + "requires": { + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true + } + } + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha512-Dn2eAftOqXhNXs5f/Xjn7QTZ6kDYkx7u0EXQInN1oyYwsZysu11q7oTtaKcbzLxZRJiDHa8VmwpWmb4lY5FqgA==", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, + "enzyme": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", + "has": "^1.0.3", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.2.1" + } + }, + "enzyme-adapter-react-16": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.3.0.tgz", + "integrity": "sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "^1.6.0", + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "object.values": "^1.0.4", + "prop-types": "^15.6.2", + "react-is": "^16.4.2", + "react-test-renderer": "^16.0.0-0" + } + }, + "enzyme-adapter-utils": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz", + "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", + "dev": true, + "requires": { + "airbnb-prop-types": "^2.16.0", + "function.prototype.name": "^1.1.5", + "has": "^1.0.3", + "object.assign": "^4.1.4", + "object.fromentries": "^2.0.5", + "prop-types": "^15.8.1", + "semver": "^5.7.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "enzyme-shallow-equal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", + "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object-is": "^1.1.5" + } + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-config-scratch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-5.1.0.tgz", + "integrity": "sha512-JQMxERL3eo0TMy87NZFm6yS0i2XOMplffKz9CD/2ta2i/+3FTgajxzF9n7R7vi9C+GMLSTSLZJ5X90tINuAhjg==", + "dev": true, + "requires": { + "eslint-plugin-react": ">=7.14.2" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-webpack": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.11.1.tgz", + "integrity": "sha512-eK3zR7xVQR/MaoBWwGuD+CULYVuqe5QFlDukman71aI6IboCGzggDUohHNfu1ZeBnbHcUHJc0ywWoXUBNB6qdg==", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^1.1.0", + "has": "^1.0.1", + "interpret": "^1.0.0", + "lodash": "^4.17.4", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.10.0", + "semver": "^5.3.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "22.21.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.21.0.tgz", + "integrity": "sha512-OaqnSS7uBgcGiqXUiEnjoqxPNKvR4JWG5mSRkzVoR6+vDwlqqp11beeql1hYs0HTbdhiwrxWLxbX0Vx7roG3Ew==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^1.13.0" + } + }, + "eslint-plugin-react": { + "version": "7.31.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", + "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz", + "integrity": "sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0" + } + }, + "exports-loader": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz", + "integrity": "sha512-vBQgTnvmEB7qWmr7gzAzJRWptzYhkhvdXeH8sRnS//mIai6MgLZe1crlQ+VWTjCCXLlnhGuiuVMq0YfjA5AUOw==", + "dev": true, + "requires": { + "loader-utils": "0.2.x", + "source-map": "0.1.x" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + } + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fbjs": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", + "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", + "dev": true, + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", + "dev": true + } + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha512-UxowFKnAFIwtmSxgKjWAVgjE3Fk7MQJT0ZIyl0NwIFZTrx4913rLaonGJ84V+x/2+w/pe4ULHRns+GZPs1TVuw==", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-float-time-domain-data": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-float-time-domain-data/-/get-float-time-domain-data-0.1.0.tgz", + "integrity": "sha512-6lWdVMny7vJ+xWxGUmVdSW7rd4L2byptiVkjH3QEBsxcHSa8UbC/HsZmixHK/ZQ1EYsOaQjaeRgR+NAsIerEJQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-user-media-promise": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/get-user-media-promise/-/get-user-media-promise-1.1.4.tgz", + "integrity": "sha512-k49YuV2z0d3gKHLPTFKYfzEA9kduuQk7YBf8ev2dxrKk+DhMyuzfQnK9ZSxkEhE/jv3BZY62M0eICWa7lak9nw==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gh-pages": { + "version": "git+ssh://git@github.com/rschamp/gh-pages.git#47e5e5c376ca65f4b407325e115174172d9c12ae", + "dev": true, + "from": "gh-pages@github:rschamp/gh-pages#publish-branch-to-subfolder", + "requires": { + "async": "2.1.2", + "commander": "2.9.0", + "globby": "^6.1.0", + "graceful-fs": "4.1.10", + "q": "1.4.1", + "q-io": "1.13.2", + "rimraf": "^2.5.4" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.10.tgz", + "integrity": "sha512-fUSlmTortW+/Fr7OuwVfhHAK3/8Q3J2BxjdHKD2pw9b7fSTEtUmf1Dxc+yByw7r/BDVJT1iWKoLXdAN+qpAKFw==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "requires": { + "react-is": "^16.7.0" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-element-map": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "dev": true, + "requires": { + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + } + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + } + } + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imports-loader": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", + "integrity": "sha512-fYIzBL9JOzJszvfeSGSKVjAtkWEtPUwP+OWiUxIWApcxsYh3iqZWZAp8xjTuhsvqglhqaetxeLLTaYyxIv1d4Q==", + "dev": true, + "requires": { + "loader-utils": "0.2.x", + "source-map": "0.1.x" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "intl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", + "integrity": "sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==", + "dev": true + }, + "intl-format-cache": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-2.2.9.tgz", + "integrity": "sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ==", + "dev": true + }, + "intl-messageformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-2.2.0.tgz", + "integrity": "sha512-I+tSvHnXqJYjDfNmY95tpFMj30yoakC6OXAo+wu/wTMy6tA/4Fd4mvV7Uzs4cqK/Ap29sHhwjcY+78a8eifcXw==", + "dev": true, + "requires": { + "intl-messageformat-parser": "1.4.0" + } + }, + "intl-messageformat-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz", + "integrity": "sha512-/XkqFHKezO6UcF4Av2/Lzfrez18R0jyw7kRFhSeB/YRakdrgSc9QfFZUwNJI9swMwMoNPygK1ArC5wdFSjPw+A==", + "dev": true + }, + "intl-relativeformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz", + "integrity": "sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw==", + "dev": true, + "requires": { + "intl-messageformat": "^2.0.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha512-C2wz7Juo5pUZTFQVer9c+9b4qw3I5T/CHQxQyhVu7BJel6C22FmsLIWsdseYyOw6xz9Pqy9eJWSkQ7+3iN1HVw==", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz", + "integrity": "sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw==", + "dev": true, + "requires": { + "jest-cli": "^21.2.1" + } + }, + "jest-changed-files": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz", + "integrity": "sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-cli": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz", + "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^21.2.0", + "jest-config": "^21.2.1", + "jest-environment-jsdom": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve-dependencies": "^21.2.0", + "jest-runner": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-snapshot": "^21.2.1", + "jest-util": "^21.2.1", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^3.0.0", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^9.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + } + } + }, + "jest-config": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", + "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^21.2.1", + "jest-environment-node": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "jest-validate": "^21.2.1", + "pretty-format": "^21.2.1" + } + }, + "jest-diff": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", + "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "jest-environment-jsdom": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz", + "integrity": "sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg==", + "dev": true, + "requires": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1", + "jsdom": "^9.12.0" + } + }, + "jest-environment-node": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz", + "integrity": "sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw==", + "dev": true, + "requires": { + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1" + } + }, + "jest-get-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", + "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "dev": true + }, + "jest-haste-map": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz", + "integrity": "sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^21.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0", + "worker-farm": "^1.3.1" + } + }, + "jest-jasmine2": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", + "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "expect": "^21.2.1", + "graceful-fs": "^4.1.11", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-snapshot": "^21.2.1", + "p-cancelable": "^0.3.0" + } + }, + "jest-junit": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-7.0.0.tgz", + "integrity": "sha512-ljUdO0hLyu0A92xk7R2Wet3kj99fmazTo+ZFYQP6b7AGOBxJUj8ZkJWzJ632ajpXko2Y5oNoGR2kvOwiDdu6hg==", + "dev": true, + "requires": { + "jest-validate": "^24.0.0", + "mkdirp": "^0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-matcher-utils": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", + "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" + } + }, + "jest-message-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", + "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + } + } + }, + "jest-mock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz", + "integrity": "sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw==", + "dev": true + }, + "jest-regex-util": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz", + "integrity": "sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ==", + "dev": true + }, + "jest-resolve": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz", + "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1", + "is-builtin-module": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz", + "integrity": "sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ==", + "dev": true, + "requires": { + "jest-regex-util": "^21.2.0" + } + }, + "jest-runner": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz", + "integrity": "sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg==", + "dev": true, + "requires": { + "jest-config": "^21.2.1", + "jest-docblock": "^21.2.0", + "jest-haste-map": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-util": "^21.2.1", + "pify": "^3.0.0", + "throat": "^4.0.0", + "worker-farm": "^1.3.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "jest-runtime": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz", + "integrity": "sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^21.2.0", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^9.0.0" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "jest-snapshot": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", + "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^21.2.1" + } + }, + "jest-util": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz", + "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "jest-message-util": "^21.2.1", + "jest-mock": "^21.2.0", + "jest-validate": "^21.2.1", + "mkdirp": "^0.5.1" + } + }, + "jest-validate": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", + "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, + "js-base64": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", + "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "dev": true + }, + "js-md5": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz", + "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==", + "dev": true, + "requires": { + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dev": true, + "requires": { + "jsonify": "^0.0.1" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "keymirror": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz", + "integrity": "sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg==", + "dev": true + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-img": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-img/-/load-img-1.0.0.tgz", + "integrity": "sha512-SoxyNMXFymxoBo6tv84k3EoB+huPPBu9pqXz5pCV6839lccjTDNk9saAzxl77/56FsBcgTZxwH7RowTBksxwLw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "lodash.bindall": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.bindall/-/lodash.bindall-4.4.0.tgz", + "integrity": "sha512-NQ+QvFohS2gPbWpyLfyuiF0ZQA3TTaJ+n0XDID5jwtMZBKE32gN5vSyy7xBVsqvJkvT/UY9dvHXIk9tZmBVF3g==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz", + "integrity": "sha512-Y19StDHa0+sN192s6kWnc3UnZS11iMjl93BfPUuh4lPxOlqcS0sLFTO8g4QgYftgYO3oP/TnARy/jgPpHE6+4Q==", + "dev": true + }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "lodash.throttle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.0.1.tgz", + "integrity": "sha512-vEeVrketgBFJ268V478NKyLk142uvnlFHuRHUUcu5NhsMQQpTs5EIGZduGNqdJOOhnb+Rwkz0XvfQuwOYzRo1Q==", + "dev": true, + "requires": { + "lodash.debounce": "^4.0.0" + } + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==", + "dev": true + }, + "loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchmediaquery": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.2.1.tgz", + "integrity": "sha512-9Ssn6kNVoYU970FtX6jS74GAyKc2baQaoifG1X/i6tfqLQgf3aM4ovYYBVWVOk4G14odceUarbwgSjDTLL/Dhw==", + "dev": true, + "requires": { + "css-mediaquery": "^0.1.2" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", + "dev": true + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "microee": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/microee/-/microee-0.0.6.tgz", + "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimeparse": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "integrity": "sha512-jiuAsJJY4c0oF97oHKic9nva2y1QF2yhYJG3LXLys//f8SNQ89eFuGZ29z62Z29CAY4endJS6zFiKUtURFErog==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minilog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minilog/-/minilog-3.1.0.tgz", + "integrity": "sha512-Xfm4jWjWzSAduvEWtuZX/8TMkxfJlCfH7XvikCZe3ptojYTBq1eoEs3rh9/3LNLOckUP86m+8l8+Iw5NU/pBww==", + "dev": true, + "requires": { + "microee": "0.0.6" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mkpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", + "integrity": "sha512-PbNHr7Y/9Y/2P5pKFv5XOGBfNQqZ+fdiHWcuf7swLACN5ZW5LU7J5tMU8LSBjpluAxAxKYGD9nnaIbdRy9+m1w==", + "dev": true + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "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" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nets": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nets/-/nets-3.2.0.tgz", + "integrity": "sha512-5644wFwLQzom2zx/4CzQXO8OcOADf1otKe5vUvfAqXes18gruSv18wGIBHlNclTGQuOOLgzGPYKen26tfNIfBQ==", + "dev": true, + "requires": { + "request": "^2.65.0", + "xhr": "^2.1.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "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-notifier": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "dev": true, + "requires": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "omggif": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", + "integrity": "sha512-VYAQRSZo7qoBcwB5G29YqVPLnxvDkWulE3x35kwH3bq4GdH/ZkHrcPPhxVfaOGYGZ5KV2/55UpcjcyNIO1qZoQ==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "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" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "papaparse": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.1.1.tgz", + "integrity": "sha512-KPkW4GNQxunmYTeJIjHFrvilcNuHBWrfgbyvmagEmfGOA4hnP1WIkPbv4yABhj1Nam3as4w+7MBiI27BntwqVg==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "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-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "postcss-simple-vars": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", + "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-format": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", + "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "prop-types-exact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", + "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object.assign": "^4.1.0", + "reflect.ownkeys": "^0.2.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "dev": true + }, + "q-io": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.2.tgz", + "integrity": "sha512-5PzgT/jVGwfwgpbN2KxjcaYdaWZyoTPeyQjM1toS5mLwlnRb5BxpnGTCQLUgMIs7b31MuIn14ZJd5pvQlvv8Xw==", + "dev": true, + "requires": { + "collections": "^0.2.0", + "mime": "^1.2.11", + "mimeparse": "^0.1.4", + "q": "^1.0.1", + "qs": "^1.2.1", + "url2": "^0.0.0" + } + }, + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==", + "dev": true + }, + "react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", + "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-contextmenu": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.9.4.tgz", + "integrity": "sha512-ma4YQw4J7JNv8L8mMVd1NHHbvH3+gaK/rQ6FC5Tft7OCUweKi7PHqHEE0fDF2009FLSGoV5JnjPnTTEyThqaJg==", + "dev": true, + "requires": { + "classnames": "^2.2.5", + "object-assign": "^4.1.0" + } + }, + "react-dom": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", + "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "dev": true, + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, + "react-ga": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-2.5.3.tgz", + "integrity": "sha512-25wvPv1PVLDLhw1gEYP33h0V2sJHahKMfUCAxhq8JPYmNQwx1fcjJAkJk+WmSqGN93lHLhExDkxy3SQizQnx3A==", + "dev": true, + "requires": { + "prop-types": "^15.6.0", + "react": "^15.6.2 || ^16.0" + } + }, + "react-google-picker": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/react-google-picker/-/react-google-picker-0.1.0.tgz", + "integrity": "sha512-0y3TtinsdNwEx77Upsmh7Q4bXuBt/d/KntQDNxLOIf2v77UQQi0FBYAtAkjrkP28IOX7gfcXhdY5XXZRGHSODw==", + "dev": true, + "requires": { + "load-script": "^1.0.0" + } + }, + "react-intl": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-2.9.0.tgz", + "integrity": "sha512-27jnDlb/d2A7mSJwrbOBnUgD+rPep+abmoJE511Tf8BnoONIAUehy/U1zZCHGO17mnOwMWxqN4qC0nW11cD6rA==", + "dev": true, + "requires": { + "hoist-non-react-statics": "^3.3.0", + "intl-format-cache": "^2.0.5", + "intl-messageformat": "^2.1.0", + "intl-relativeformat": "^2.1.0", + "invariant": "^2.1.1" + } + }, + "react-intl-redux": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-intl-redux/-/react-intl-redux-0.7.0.tgz", + "integrity": "sha512-T7I7Yy1UkvD8rOB1B+SCG63LYJBtBcvGJ8FVJ8g8Yjhm4+rEhKzJuh1MaQBhwKZNlVcHlx4SlKdtkw8urdZdrA==", + "dev": true, + "peer": true, + "requires": { + "prop-types": "^15.6.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "dev": true + }, + "react-modal": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.9.1.tgz", + "integrity": "sha512-k+TUkhGWpIVHLsEyjNmlyOYL0Uz03fNZvlkhCImd1h+6fhNgTi6H6jexVXPVhD2LMMDzJyfugxMN+APN/em+eQ==", + "dev": true, + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + } + }, + "react-popover": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/react-popover/-/react-popover-0.5.10.tgz", + "integrity": "sha512-5SYDTfncywSH00I70oHd4gFRUR8V0rJ4sRADSI/P6G0RVXp9jUgaWloJ0Bk+SFnjpLPuipTKuzQNNd2CTs5Hrw==", + "dev": true, + "requires": { + "css-vendor": "^0.3.1", + "debug": "^2.6.8", + "lodash.throttle": "^3.0.3", + "prop-types": "^15.5.10" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "lodash.debounce": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha512-lcmJwMpdPAtChA4hfiwxTtgFeNAaow701wWUgVUqeD0XJF7vMXIN+bu/2FJSGxT0NUbZy9g9VFrlOFfPjl+0Ew==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash.throttle": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-3.0.4.tgz", + "integrity": "sha512-dRU/xiF4W8a521NYnQosG5drDqv4+hp3ND6yWNJUMnwO1E87Q/A7oc9M/g6pk29K9U3j/ZWhM3BAQZyr/P6TTQ==", + "dev": true, + "requires": { + "lodash.debounce": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "react-redux": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", + "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", + "dev": true, + "requires": { + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.0.0", + "lodash": "^4.17.5", + "lodash-es": "^4.17.5", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.0" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "dev": true + } + } + }, + "react-responsive": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-4.1.0.tgz", + "integrity": "sha512-ZuDraf0qsJlyiTwzeva+foHx83IP6SIhru9o7BvMwQ4ZHjRIL5WjdgVNNrKSRbmeWO9rEJoMpabei/5lJn8KaA==", + "dev": true, + "requires": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.2.1", + "prop-types": "^15.6.1" + } + }, + "react-style-proptype": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.2.tgz", + "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", + "dev": true, + "requires": { + "prop-types": "^15.5.4" + } + }, + "react-tabs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-2.3.0.tgz", + "integrity": "sha512-pYaefgVy76/36AMEP+B8YuVVzDHa3C5UFZ3REU78zolk0qMxEhKvUFofvDCXyLZwf0RZjxIfiwok1BEb18nHyA==", + "dev": true, + "requires": { + "classnames": "^2.2.0", + "prop-types": "^15.5.0" + } + }, + "react-test-renderer": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.2.0.tgz", + "integrity": "sha512-Kd4gJFtpNziR9ElOE/C23LeflKLZPRpNQYWP3nQBY43SJ5a+xyEGSeMrm2zxNKXcnCbBS/q1UpD9gqd5Dv+rew==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-tooltip": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.8.0.tgz", + "integrity": "sha512-Uj/vVd0uGuqwTkWeRjKS56T2iwOSvsSMbjqTK7AseHZEMND+WCXXUajaF7+ZsJWTZgnpeT9kBnaBFhchzeDTbw==", + "dev": true, + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, + "react-virtualized": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.20.1.tgz", + "integrity": "sha512-xIWxBsyNAjceqD3hsE0nw5TcDVxKbIepsHhvS2XneHmNz0KlKxdLdGBmGZBM9ZesEmbZ5EO0Sw70TB1MeCmpbQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "classnames": "^2.2.3", + "dom-helpers": "^2.4.0 || ^3.0.0", + "loose-envify": "^1.3.0", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dev": true, + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "redux-mock-store": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.4.tgz", + "integrity": "sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==", + "dev": true, + "requires": { + "lodash.isplainobject": "^4.0.6" + } + }, + "redux-throttle": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/redux-throttle/-/redux-throttle-0.1.1.tgz", + "integrity": "sha512-24stzg4+1xtlO8ubP4HKudpBdPsG4qvbn0Z9hv8tz6fM6ZcQJe2dKEwYIqTl8+yPMGgjNKHp1lzTwRqjWCxj/Q==", + "dev": true, + "requires": { + "lodash.throttle": "4.0.1" + } + }, + "reflect.ownkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", + "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha512-OuZwD1QJ2R9Dbnhd7Ur8zzD8l+oADp9npyxK63Q9nZ4AjhB2QwDQcQlD8iuUsGm5AZZqtEuCaJvK1rxGRxyQ1Q==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scratch-audio": { + "version": "0.1.0-prerelease.20190925183642", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20190925183642.tgz", + "integrity": "sha512-cvnNawIThkIKyMZdo+cRmYO+ndCG9dcQeaG8rTgok2iSMvG510OUs3DBnFz/GUncu+OryT1VKdeusEfwKf/+ow==", + "dev": true, + "requires": { + "audio-context": "1.0.1", + "minilog": "^3.0.1", + "startaudiocontext": "1.2.1" + } + }, + "scratch-blocks": { + "version": "0.1.0-prerelease.1578322100", + "resolved": "https://registry.npmjs.org/scratch-blocks/-/scratch-blocks-0.1.0-prerelease.1578322100.tgz", + "integrity": "sha512-36CNHELBehHX0pjyVLrkP7vqVhpkvBONDLTKx1LoYZhVXtTvP+Vknd6iKDM3gUzzAOMdpUUxVO6e/XBHz8+i1w==", + "dev": true, + "requires": { + "exports-loader": "0.6.3", + "imports-loader": "0.6.5" + } + }, + "scratch-l10n": { + "version": "3.7.20200108141814", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.7.20200108141814.tgz", + "integrity": "sha512-96XEoJGqmR3f/394hcyBjHdyc3VNapaU6hQ+3/4TAvfD/8keYsJuSVkHHMD+UpodHKkkSTyQZIjbDKc9T60UMQ==", + "dev": true, + "requires": { + "@babel/cli": "^7.1.2", + "@babel/core": "^7.1.2", + "babel-plugin-react-intl": "^3.0.1", + "transifex": "1.6.6" + } + }, + "scratch-paint": { + "version": "0.2.0-prerelease.20200109073728", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200109073728.tgz", + "integrity": "sha512-PJTYShD5gl4OReRN+ZOTjSFeEuarO5YV10bbmw1BSn/pAnuEYU2dglgymNSBiGXunYaDYyaPgsJldzcnydSxHQ==", + "dev": true, + "requires": { + "@scratch/paper": "0.11.20190729152410", + "classnames": "2.2.5", + "keymirror": "0.1.1", + "lodash.bindall": "4.4.0", + "lodash.omit": "4.5.0", + "minilog": "3.1.0", + "parse-color": "1.0.0", + "prop-types": "^15.5.10", + "scratch-svg-renderer": "0.2.0-prerelease.20200109070519" + }, + "dependencies": { + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA==", + "dev": true + } + } + }, + "scratch-render-fonts": { + "version": "1.0.0-prerelease.20180906193204", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.0-prerelease.20180906193204.tgz", + "integrity": "sha512-tVDUTKO/gJnEv94HTyBWW/e/JwsZIslByzehuXQ7QvrngEh28gvHaCRwKMX/cqprizu4TFqvfx4Xh2n9e5XekA==", + "dev": true, + "requires": { + "base64-loader": "1.0.0" + } + }, + "scratch-storage": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.2.tgz", + "integrity": "sha512-Xi169m/k6yYJU7aXTLgIxWjIumYamMSkRdSQiQ39p6kQeniGzm8ncBbJuGOs1UDh0Y3b6g1DrqX24YaSQL201w==", + "dev": true, + "requires": { + "arraybuffer-loader": "^1.0.3", + "base64-js": "1.3.0", + "js-md5": "0.7.3", + "minilog": "3.1.0", + "nets": "3.2.0", + "text-encoding": "0.7.0", + "worker-loader": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + } + } + }, + "scratch-svg-renderer": { + "version": "0.2.0-prerelease.20200109070519", + "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0-prerelease.20200109070519.tgz", + "integrity": "sha512-THdZW9gA8mFKvDImHDrWWhvyOymUW3JgMBjpPsaFk2URl1kfNIRQIndfwto2B8a8YbtuyKSv6CWW8Nu+VzBZVA==", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "base64-loader": "1.0.0", + "minilog": "3.1.0", + "scratch-render-fonts": "1.0.0-prerelease.20180906193204", + "transformation-matrix": "1.15.0" + }, + "dependencies": { + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "requires": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "requires": { + "should-type": "^1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "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": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "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" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "startaudiocontext": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", + "integrity": "sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-to-image": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-to-image/-/svg-to-image-1.1.3.tgz", + "integrity": "sha512-hRbQF6zriB1TaiL/bS6P3BCshl8ZILKEHfTyVLtQwZNIj+yDL+kxjgMCAgAQVVDRYok884a7VZbrVFLbSbleLw==", + "dev": true, + "requires": { + "load-img": "^1.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "dev": true + }, + "tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "requires": { + "debug": "4.3.1", + "is2": "^2.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "to-style": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/to-style/-/to-style-1.3.3.tgz", + "integrity": "sha512-9K8KYegr9hrdm8yPpu5iZjJp5t6RPAp4gFDU5hD9zR8hwqgF4fsoSitMtkRKQG2qkP5j/uG3wajbgV09rjmIqg==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "transformation-matrix": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.0.tgz", + "integrity": "sha512-808EqPQbmUD6/IMpWUXLOZcblCHf9xaiB+un0RYNNE9+6VRjoiw6Be8R32tZ0ips1PX/15tlnA2Ev4UUgg827Q==", + "dev": true + }, + "transifex": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/transifex/-/transifex-1.6.6.tgz", + "integrity": "sha512-uHeRvhfLfZN+JdH+X0zR1jkQAbMGkgExZgcXm31CzaVVd4kq98YaPr4MCgCU0LwA7cgOuB97d2HZQ/WikOAxlg==", + "dev": true, + "requires": { + "commander": "^2.9.0", + "lodash": "^4.17.1", + "mkpath": "^1.0.0", + "mocha": "^4.0.0", + "request": "^2.34.0", + "should": "^13.0.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + } + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url2": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "integrity": "sha512-gb/XT1m2mnWOIbQwa5V9Dq2O07fkZbtu1K0WAAKuaNSX0c8psp2jovJTbbvPKCpimutdoK9jXOejDCtvQOoKOA==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha512-oUcoHFG3UF2pBlHcMORAojsN09BfqSfWYWlR3eSSjUFR7eBEx53WT2HX/vZeVTTIVCGShcazb+t6IcBRCNXqvA==", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "optional": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "optional": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "optional": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wav-encoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wav-encoder/-/wav-encoder-1.3.0.tgz", + "integrity": "sha512-FXJdEu2qDOI+wbVYZpu21CS1vPEg5NaxNskBr4SaULpOJMrLE6xkH8dECa7PiS+ZoeyvP7GllWUAxPN3AvFSEw==", + "dev": true + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "weak-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.0.tgz", + "integrity": "sha512-Vb13TbgdvUEmzBA5mpsMqtPqcZGJPE2gj+b8wzxsevC7WkmL3c7YZg9H0pV1Jo8C1Sa1ykk3DU08hFRGLNWvLQ==", + "dev": true + }, + "web-audio-test-api": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/web-audio-test-api/-/web-audio-test-api-0.5.2.tgz", + "integrity": "sha512-RevLfVjp+wwe/dBPe361IpmNpeXXW6JVmlp8dk0YIxLwAh7evn6JpEQQalVgX4PH/jA8tpLpjD/8tFNUYTf88w==", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", + "dev": true + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "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-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "dev": true, + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==", + "dev": true + } + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha512-XS0NJoM9Iz0azh1cdgfLF5VFK6BSWfrrqA0V2tIx3fV6aGrWCseVDwOkIBg746ev0hes59od5ZvQAfdET4H0pw==", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } } diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index 166b8a9f2..e687f5c3b 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -98,7 +98,7 @@ "react-modal": "3.9.1", "react-popover": "0.5.10", "react-redux": "5.0.7", - "react-responsive": "5.0.0", + "react-responsive": "^4", "react-style-proptype": "3.2.2", "react-tabs": "2.3.0", "react-test-renderer": "16.2.0", @@ -109,8 +109,8 @@ "redux-throttle": "0.1.1", "rimraf": "^2.6.1", "scratch-audio": "0.1.0-prerelease.20190925183642", - "scratch-blocks": "0.1.0-prerelease.1578322100", "scratch-l10n": "3.7.20200108141814", + "scratch-blocks": "0.1.0-prerelease.1578322100", "scratch-paint": "0.2.0-prerelease.20200109073728", "scratch-render": "0.1.0-prerelease.20200109074051", "scratch-storage": "1.3.2", @@ -142,11 +142,5 @@ "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/test/__mocks__/fileMock.js", "\\.(css|less)$": "/test/__mocks__/styleMock.js" } - }, - "dependencies": { - "aframe": "^1.0.4", - "load-script": "^2.0.0", - "microbit-web-bluetooth": "^0.6.0", - "regenerator-runtime": "^0.13.9" } } diff --git a/packages/scratch-gui/src/components/asset-panel/progress--icon.svg b/packages/scratch-gui/src/components/asset-panel/progress--icon.svg new file mode 100644 index 000000000..dad2cb28a --- /dev/null +++ b/packages/scratch-gui/src/components/asset-panel/progress--icon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/packages/scratch-gui/src/components/classifier-modal/classifier-model-editor.jsx b/packages/scratch-gui/src/components/classifier-modal/classifier-model-editor.jsx new file mode 100644 index 000000000..b8243bc4c --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/classifier-model-editor.jsx @@ -0,0 +1,38 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import React from 'react'; +import classNames from 'classnames'; +import keyMirror from 'keymirror'; + +import Box from '../box/box.jsx'; +import LabelTile from './label-tile.jsx'; +import EditLabelTile from './label-editor.jsx'; +import Dots from './dots.jsx'; + +import styles from './classifier-model-modal.css'; + +const ClassifierModelEditor = props => ( + + + + + + + + + +); + +ClassifierModelEditor.propTypes = { + onCancel: PropTypes.func, + onFileUploader: PropTypes.func, + onAddLabel: PropTypes.func, + onExport: PropTypes.func, + classifierData: PropTypes.object, + activeLabel: PropTypes.string +}; + +export default ClassifierModelEditor; + diff --git a/packages/scratch-gui/src/components/classifier-modal/classifier-model-modal.css b/packages/scratch-gui/src/components/classifier-modal/classifier-model-modal.css new file mode 100644 index 000000000..c38e3c287 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/classifier-model-modal.css @@ -0,0 +1,264 @@ +@import "../../css/colors.css"; +@import "../../css/units.css"; + +.modal-content { + width: 600px; +} + +.header { + background-color: $pen-primary; +} + +.body { + background: $ui-white; +} + +.centered-row { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.label-tile-pane { + overflow-y: auto; + width: 100%; + height: 100%; +} + +.label-tile { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + + background-color: $ui-white; + border-radius: 0.25rem; + padding: 10px; + width: 100%; + margin-bottom: 0.5rem; +} + +.label-tile-header { + display: flex; + align-items: center; + height: 2rem; + margin-left: 0.25rem; +} + +.label-tile-footer { + display: flex; + align-items: center; + height: 2rem; + margin-top: 0.5rem; +} + +.label-tile-name { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + font-size: 0.875rem; + margin-right: 1rem; +} + +.label-tile button { + margin:0.25rem; + + padding: 0.3rem 0.5rem; + + border: none; + border-radius: 0.25rem; + + font-weight: 600; + font-size: 0.85rem; + line-height:1rem; + + background: $motion-primary; + border: $motion-primary; + color: white; + cursor: pointer; +} + +.vertical-layout { + align-items: flex-start; + align-self: flex-start; + flex-direction: column; + height: 100%; + width: 100%; +} + +.example-box { + align-items: center; + display: flex; + flex-wrap: wrap; + height: calc(100% - 2rem); + width: calc(100% - 1rem); + margin-left:1.5rem; +} + +.example-viewer-text { + margin: 0.5rem 0.25rem; + height: 1.5rem; + justify-content: flex-start; +} + +.add-example-row { + position: relative; + margin:auto; + + border-width: 1px; + border-style: solid; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 0.25rem; +} + +.add-example-row input { + font-size: 0.85rem; + background-color: none; + + border-width: 0px; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 0.25rem; +} +.add-example-row button { + background-color: hsla(0, 0%, 0%, 0.35); + margin:0; +} + +.example-viewer-image-container { + display: flex; + overflow-y: auto; + flex-wrap: wrap; + height: calc(100% - 1.5rem); + margin-left: 1rem; +} + +.loaded-examples-box { + height: 50%; + width: 80%; + margin: 0.7rem; + position: relative; + display: flex; + align-items: center; + justify-content: center; + + background-color: $ui-white; + border-radius: 0.25rem; +} + +.example-text { + height: 70%; + max-width:200px; + margin: 0.2rem 0.8rem; + position: relative; + background-color: $motion-light-transparent; + + display: flex; + align-items: center; + + border-radius: 0.5rem; +} + + +.canvas-area { + height: calc(100% - 1.5rem); + margin: 0.25rem; + display: flex; + justify-content: center; +} + +.canvas { + height: 100%; + position: relative; + display: block; + padding: 0.6rem 0.35rem; +} + +.removable { + padding-right: 1.25rem; +} + +.loading-camera-message { + position: absolute; + display: flex; + align-self: center; +} + +.delete-button { + position: absolute; + top: 0.25rem; + right: 0.25rem; + z-index: auto; +} + +.input-field { + height: 1.3rem; + padding: 0 0.75rem; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 0.875rem; + font-weight: bold; + color: hsla(225, 15%, 40%, 1); + border-width: 1px; + border-style: solid; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 0.25rem; + outline: none; + cursor: text; + transition: 0.25s ease-out; + box-shadow: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; +} + +.activity-area { + height: 300px; + background-color: $motion-light-transparent; + display: flex; + justify-content: center; + align-items: center; + padding: .5rem; +} + +.button-row { + font-weight: bolder; + text-align: center; + display: flex; +} + +.button-row button { + padding: 0.6rem 0.75rem; + border-radius: 0.5rem; + background: $motion-primary; + color: white; + font-weight: 600; + font-size: 0.85rem; + margin: 0.25rem; + border: none; + cursor: pointer; + display: flex; + align-items: center; +} + +.bottom-area { + background-color: $ui-white; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 1rem; + padding-bottom: .75rem; + padding-left: .75rem; + padding-right: .75rem; +} + +.bottom-area .bottom-area-item+.bottom-area-item { + margin-top: 1rem; +} + +.instructions { + text-align: center; + height: 1.5rem; +} \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/classifier-model-modal.jsx b/packages/scratch-gui/src/components/classifier-modal/classifier-model-modal.jsx new file mode 100644 index 000000000..f24c385d8 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/classifier-model-modal.jsx @@ -0,0 +1,44 @@ +import PropTypes from 'prop-types'; +import React from 'react'; + +import Box from '../box/box.jsx'; +import Modal from '../../containers/modal.jsx'; + +import ClassifierModelEditor from './classifier-model-editor.jsx'; + +import styles from './classifier-model-modal.css'; + +const ClassifierModelModalComponent = props => ( + + + + + +); + +ClassifierModelModalComponent.propTypes = { + name: PropTypes.node, + onCancel: PropTypes.func.isRequired, + onHelp: PropTypes.func.isRequired, +}; + +export { + ClassifierModelModalComponent as default +}; + diff --git a/packages/scratch-gui/src/components/classifier-modal/dots.jsx b/packages/scratch-gui/src/components/classifier-modal/dots.jsx new file mode 100644 index 000000000..af6f8fcd6 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/dots.jsx @@ -0,0 +1,65 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import classNames from 'classnames'; + +import Box from '../box/box.jsx'; +import styles from './classifier-model-modal.css'; + +const Dots = props => ( + +
+ {Array(props.total).fill(0) + .map((_, i) => { + let type = 'inactive'; + if (props.counter === i) type = 'active'; + if (props.success) type = 'success'; + if (props.error) type = 'error'; + return (); + })} +
+
+); + +Dots.propTypes = { + className: PropTypes.string, + counter: PropTypes.number, + error: PropTypes.bool, + success: PropTypes.bool, + total: PropTypes.number +}; + +const Dot = props => ( +
+); + +Dot.propTypes = { + type: PropTypes.string +}; + +export default Dots; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/example-tile.jsx b/packages/scratch-gui/src/components/classifier-modal/example-tile.jsx new file mode 100644 index 000000000..94ef91fcb --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/example-tile.jsx @@ -0,0 +1,49 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import Box from '../box/box.jsx'; +import CloseButton from '../close-button/close-button.jsx'; + +import styles from './classifier-model-modal.css'; + +class ExampleTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleDeleteExample' + ]); + } + handleDeleteExample () { + this.props.onDeleteExample(this.props.label, this.props.id); + } + + + render () { + return ( +
+ {this.props.closeButton ? + <> + {this.props.text} + + + : +
{this.props.text}
} +
+ ); + } +} + +ExampleTile.propTypes = { + label: PropTypes.string, + text: PropTypes.string, + onDeleteExample: PropTypes.func, + closeButton: PropTypes.bool +}; + +export default ExampleTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/icon--close.svg b/packages/scratch-gui/src/components/classifier-modal/icon--close.svg new file mode 100644 index 000000000..73c7b929f --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/icon--close.svg @@ -0,0 +1,18 @@ + + + + Extensions/Connection/Close + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/icon--enter.svg b/packages/scratch-gui/src/components/classifier-modal/icon--enter.svg new file mode 100644 index 000000000..03b7c0862 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/icon--enter.svg @@ -0,0 +1,18 @@ + + + + General/Check + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/icon--help.svg b/packages/scratch-gui/src/components/classifier-modal/icon--help.svg new file mode 100644 index 000000000..2938e8340 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/icon--help.svg @@ -0,0 +1,10 @@ + + + + help + Created with Sketch. + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/label-editor.jsx b/packages/scratch-gui/src/components/classifier-modal/label-editor.jsx new file mode 100644 index 000000000..381c0e715 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/label-editor.jsx @@ -0,0 +1,100 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import keyMirror from 'keymirror'; + +import Box from '../box/box.jsx'; +import ExampleTile from './example-tile.jsx'; + +import styles from './classifier-model-modal.css'; + +class EditLabelTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleRenameLabel', + 'handleDeleteLabel', + 'handleNewExample', + 'handleInputForNewExample', + 'handleDoneEditLabel' + ]); + this.state = { + inputText: "" + }; + } + handleDoneEditLabel () { + console.log("Text Model Modal: done editing label " + this.props.labelName); + this.props.onDoneEditLabel(this.props.labelName); + } + handleRenameLabel (input) { //call props.onRenameLabel with the current active label and the value in the input field + if (this.props.labelName !== input.target.value) { + this.props.onRenameLabel(this.props.labelName, input.target.value); + } + } + handleDeleteLabel () { //call props.onDeleteLabel with this label name + this.props.onDeleteLabel(this.props.labelName); + } + handleNewExample () { //call props.onAddExample + let newExample = this.state.inputText; + if (newExample != undefined && newExample != '') { + this.props.onNewExamples(this.props.labelName, [newExample]); + } + } + handleInputForNewExample (input) { //call props.onAddExample + this.setState({ + inputText: input.target.value + }); + + } + + render () { + return ( + + + + + + {" ("+this.props.exampleCount+" examples)"} + + + + + + {this.props.textData[this.props.labelName].map(example => ( + + + + ))} + + + + + + + + + + ); + } +} + +EditLabelTile.propTypes = { + labelName: PropTypes.string, + onRenameLabel: PropTypes.func, + onDeleteExample: PropTypes.func, + onDeleteLabel: PropTypes.func, + onNewExamples: PropTypes.func, + onDoneEditLabel: PropTypes.func, + textData: PropTypes.object, + exampleCount: PropTypes.number +}; + +export default EditLabelTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/classifier-modal/label-tile.jsx b/packages/scratch-gui/src/components/classifier-modal/label-tile.jsx new file mode 100644 index 000000000..463162103 --- /dev/null +++ b/packages/scratch-gui/src/components/classifier-modal/label-tile.jsx @@ -0,0 +1,66 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import keyMirror from 'keymirror'; + +import Box from '../box/box.jsx'; +import ExampleTile from './example-tile.jsx'; + +import styles from './classifier-model-modal.css'; + +class LabelTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleEditLabel' + ]); + this.state = { + inputText: "" + }; + } + handleEditLabel () { + console.log("Text Model Modal: edit label " + this.props.labelName); + this.props.onEditLabel(this.props.labelName); + } + + + render () { + return ( + + + + + {this.props.labelName} + {" ("+this.props.exampleCount+" examples)"} + + + + + {this.props.textData[this.props.labelName].map(example => ( + + + + ))} + + + + ); + } +} + +LabelTile.propTypes = { + labelName: PropTypes.string, + onEditLabel: PropTypes.func, + onNewExamples: PropTypes.func, + textData: PropTypes.object, + exampleCount: PropTypes.number +}; + +export default LabelTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/connection-modal/connection-modal.jsx b/packages/scratch-gui/src/components/connection-modal/connection-modal.jsx index a22cce5a1..f9bcf46b9 100644 --- a/packages/scratch-gui/src/components/connection-modal/connection-modal.jsx +++ b/packages/scratch-gui/src/components/connection-modal/connection-modal.jsx @@ -5,21 +5,17 @@ import keyMirror from 'keymirror'; import Box from '../box/box.jsx'; import Modal from '../../containers/modal.jsx'; -import ScanningStep from '../../containers/scanning-step.jsx'; -import AutoScanningStep from '../../containers/auto-scanning-step.jsx'; -import ConnectingStep from './connecting-step.jsx'; -import ConnectedStep from './connected-step.jsx'; -import ErrorStep from './error-step.jsx'; -import UnavailableStep from './unavailable-step.jsx'; +import ModelEditor from './model-editor.jsx'; +import LabelEditor from './label-editor.jsx'; +import ExampleEditor from './example-editor.jsx'; -import styles from './connection-modal.css'; + +import styles from './ml-modal.css'; const PHASES = keyMirror({ - scanning: null, - connecting: null, - connected: null, - error: null, - unavailable: null + modelEditor: null, + labelEditor: null, + exampleEditor: null }); const ConnectionModalComponent = props => ( @@ -33,30 +29,42 @@ const ConnectionModalComponent = props => ( onRequestClose={props.onCancel} > - {props.phase === PHASES.scanning && !props.useAutoScan && } - {props.phase === PHASES.scanning && props.useAutoScan && } - {props.phase === PHASES.connecting && } - {props.phase === PHASES.connected && } - {props.phase === PHASES.error && } - {props.phase === PHASES.unavailable && } + {props.phase === PHASES.modelEditor && } + + {props.phase === PHASES.labelEditor && } + + {props.phase === PHASES.exampleEditor && } + ); ConnectionModalComponent.propTypes = { - connectingMessage: PropTypes.node.isRequired, - connectionSmallIconURL: PropTypes.string, - connectionTipIconURL: PropTypes.string, name: PropTypes.node, onCancel: PropTypes.func.isRequired, onHelp: PropTypes.func.isRequired, phase: PropTypes.oneOf(Object.keys(PHASES)).isRequired, title: PropTypes.string.isRequired, - useAutoScan: PropTypes.bool.isRequired -}; - -ConnectionModalComponent.defaultProps = { - connectingMessage: 'Connecting' }; export { diff --git a/packages/scratch-gui/src/components/connection-modal/example-editor.jsx b/packages/scratch-gui/src/components/connection-modal/example-editor.jsx new file mode 100644 index 000000000..56dd15cae --- /dev/null +++ b/packages/scratch-gui/src/components/connection-modal/example-editor.jsx @@ -0,0 +1,149 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import React from 'react'; +import classNames from 'classnames'; + +import Box from '../box/box.jsx'; +import LabelTile from './label-tile.jsx'; +import Dots from './dots.jsx'; + +import bindAll from 'lodash.bindall'; + +import radarIcon from './icons/searching.png'; +import refreshIcon from './icons/refresh.svg'; + +import styles from './ml-modal.css'; + +import ModalVideoManager from '../../lib/video/modal-video-manager.js'; + +class ExampleEditor extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleGoBack', + 'setCanvas', + 'handleLoaded', + 'handleAccess', + 'handleNewExample', + 'countdown', + 'createNewExamples', + 'takePicture' + ]); + this.state = { + trainInfo: "Press Train when you're ready!", + intervalHandler: null, + loaded: false, + access: false, + training: false, + newExamples: [] + }; + this.loadedText = ""; + this.loadingText = "Loading Camera..."; + } + componentWillUnmount () { + clearInterval(this.state.intervalHandler); + this.videoDevice.disableVideo(); + } + handleGoBack () { //go back to the previous screen (which might be the model editor or the label editor, depending on whether or not this is a new label) + this.videoDevice.disableVideo(); + this.props.activeLabel in this.props.imageData ? + this.props.onEditLabel(this.props.activeLabel) : + this.props.onEditModel(); + } + setCanvas (canvas) { //set up the video on the canvas + this.canvas = canvas; + if (this.canvas) { + this.videoDevice = new ModalVideoManager(this.canvas); + this.videoDevice.enableVideo(this.handleAccess, this.handleLoaded); + } + } + handleLoaded () { + this.setState ({ + loaded: true + }) + } + handleAccess () { + this.setState ({ + access: true + }) + } + handleNewExample () { //take a picture and call props.onNewExample with the new image data + this.setState({trainInfo: 3, training: true, intervalHandler: setInterval(this.countdown, 1000)}); + } + + countdown () { + if (this.state.trainInfo > 1) { + this.setState({trainInfo: this.state.trainInfo - 1}); + } else { + this.setState({trainInfo: "training..."}); + clearInterval(this.state.intervalHandler); + this.createNewExamples(); + } + } + + createNewExamples () { + if (this.canvas) { + this.setState({intervalHandler: setInterval(this.takePicture, 200)}) + } + } + + takePicture () { + const frame = this.videoDevice._videoProvider.getFrame({ + format: 'image-data' + }); + if (frame) { + this.setState({newExamples: this.state.newExamples.concat([frame])}) + } + if (this.state.newExamples.length === 10) { + clearInterval(this.state.intervalHandler); + this.videoDevice.disableVideo(); + this.props.activeLabel in this.props.imageData ? + this.props.onNewExamples(this.state.newExamples, false) : + this.props.onNewExamples(this.state.newExamples, true); + } + } + + render () { + return ( + + + + + {this.state.trainInfo} + + + + {this.state.access ? +
{this.state.loaded ? this.loadedText : this.loadingText}
+ :
We need your permission to use your camera
} +
+
+
+ + {this.state.training ? + + : + + + + } + +
+ ); + } +} + +ExampleEditor.propTypes = { + onEditLabel: PropTypes.func, + onEditModel: PropTypes.func, + onNewExamples: PropTypes.func, + activeLabel: PropTypes.string, + imageData: PropTypes.object +}; + +export default ExampleEditor; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/connection-modal/image-tile.jsx b/packages/scratch-gui/src/components/connection-modal/image-tile.jsx new file mode 100644 index 000000000..6f38169a8 --- /dev/null +++ b/packages/scratch-gui/src/components/connection-modal/image-tile.jsx @@ -0,0 +1,62 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import Box from '../box/box.jsx'; +import CloseButton from '../close-button/close-button.jsx'; + +import styles from './ml-modal.css'; + +class ImageTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'setCanvas', + 'handleDeleteExample', + 'componentDidUpdate' + ]); + } + setCanvas (canvas) { //set up the canvas to display an image on this image tile + this.canvas = canvas; + if (this.canvas) { + const ctx = this.canvas.getContext('2d'); + ctx.putImageData(this.props.image, 0, 0); + } + } + componentDidUpdate () { + this.setCanvas(this.canvas); + } + handleDeleteExample () { + this.props.onDeleteExample(this.props.id); + } + + + render () { + return ( +
+ + {this.props.closeButton ? + + :
} +
+ ); + } +} + +ImageTile.propTypes = { + image: PropTypes.instanceOf(ImageData), + onDeleteExample: PropTypes.func, + closeButton: PropTypes.bool +}; + +export default ImageTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/connection-modal/label-editor.jsx b/packages/scratch-gui/src/components/connection-modal/label-editor.jsx new file mode 100644 index 000000000..62c8e686d --- /dev/null +++ b/packages/scratch-gui/src/components/connection-modal/label-editor.jsx @@ -0,0 +1,85 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import React from 'react'; +import classNames from 'classnames'; +import bindAll from 'lodash.bindall'; + +import Box from '../box/box.jsx'; +import ImageTile from './image-tile.jsx'; +import Dots from './dots.jsx'; +import CloseButton from '../close-button/close-button.jsx'; + +import radarIcon from './icons/searching.png'; +import refreshIcon from './icons/refresh.svg'; + +import styles from './ml-modal.css'; + +class LabelEditor extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleRenameLabel' + ]); + } + handleRenameLabel (input) { //call props.onRenameLabel with the current active label and the value in the input field + if (this.props.activeLabel !== input.target.value) { + this.props.onRenameLabel(this.props.activeLabel, input.target.value); + } + } + + render () { + return ( + + + + + Label {"("+this.props.classifierData[this.props.activeLabel].length+" examples)"} + + + {this.props.classifierData[this.props.activeLabel].length !== this.props.imageData[this.props.activeLabel].length ? + + + {this.props.classifierData[this.props.activeLabel].length-this.props.imageData[this.props.activeLabel].length} examples loaded from file + + :
+ } + {this.props.imageData[this.props.activeLabel].map(example => ( + obj.data === example.data)}> + obj.data === example.data)} + closeButton={true} + onDeleteExample={this.props.onDeleteExample} + /> + + ))} +
+
+
+ + + + + + +
+ ); + } +} + +LabelEditor.propTypes = { + onAddExamples: PropTypes.func, + onDeleteExample: PropTypes.func, + onDeleteLoadedExamples: PropTypes.func, + onEditModel: PropTypes.func, + onRenameLabel: PropTypes.func, + activeLabel: PropTypes.string, + classifierData: PropTypes.object, + imageData: PropTypes.object +}; + +export default LabelEditor; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/connection-modal/label-tile.jsx b/packages/scratch-gui/src/components/connection-modal/label-tile.jsx new file mode 100644 index 000000000..f38d18fe6 --- /dev/null +++ b/packages/scratch-gui/src/components/connection-modal/label-tile.jsx @@ -0,0 +1,62 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import Box from '../box/box.jsx'; +import ImageTile from './image-tile.jsx'; + +import styles from './ml-modal.css'; + +class LabelTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleEditLabel', + 'handleDeleteLabel' + ]); + } + handleEditLabel () { //call props.onEditLabel with this label name + this.props.onEditLabel(this.props.name); + } + handleDeleteLabel () { //call props.onDeleteLabel with this label name + this.props.onDeleteLabel(this.props.name); + } + + render () { + return ( + + + + + {this.props.name+" ("+this.props.exampleCount+" examples)"} + + + + + + {this.props.imageData[this.props.name].map(example => ( + obj.data === example.data)}> + obj.data === example.data)} + closeButton={false} + /> + + ))} + + + + ); + } +} + +LabelTile.propTypes = { + name: PropTypes.string, + onEditLabel: PropTypes.func, + onDeleteLabel: PropTypes.func, + imageData: PropTypes.object, + exampleCount: PropTypes.number +}; + +export default LabelTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/connection-modal/ml-modal.css b/packages/scratch-gui/src/components/connection-modal/ml-modal.css new file mode 100644 index 000000000..62b902803 --- /dev/null +++ b/packages/scratch-gui/src/components/connection-modal/ml-modal.css @@ -0,0 +1,219 @@ +@import "../../css/colors.css"; +@import "../../css/units.css"; + +.modal-content { + width: 600px; +} + +.header { + background-color: $pen-primary; +} + +.body { + background: $ui-white; +} + +.centered-row { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.label-tile-pane { + overflow-y: auto; + width: 100%; + height: 100%; +} + +.label-tile { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + + background-color: $ui-white; + border-radius: 0.25rem; + padding: 10px; + width: 100%; + height: 120px; + margin-bottom: 0.5rem; +} + +.label-tile-header { + display: flex; + align-items: center; + height: 2rem; + margin-left: 0.25rem; +} + +.label-tile-name { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + font-size: 0.875rem; + margin-right: 1rem; +} + +.label-tile button { + padding: 0.3rem 0.5rem; + margin-right: 0.25rem; + border: none; + border-radius: 0.25rem; + font-weight: 600; + font-size: 0.85rem; + background: $motion-primary; + border: $motion-primary; + color: white; + cursor: pointer; +} + +.vertical-layout { + align-items: flex-start; + align-self: flex-start; + flex-direction: column; + height: 100%; + width: 100%; +} + +.example-preview { + overflow-x: auto; + overflow-y: hidden; + align-items: center; + display: flex; + height: calc(100% - 2rem); + width: calc(100% - 1rem); + margin-left: 1rem; +} + +.example-viewer-text { + margin-left: 0.25rem; + height: 1.5rem; + justify-content: flex-start; +} + +.example-viewer-image-container { + display: flex; + overflow-y: auto; + flex-wrap: wrap; + height: calc(100% - 1.5rem); + margin-left: 1rem; +} + +.loaded-examples-box { + height: 50%; + width: 80%; + margin: 0.7rem; + position: relative; + display: flex; + align-items: center; + justify-content: center; + + background-color: $ui-white; + border-radius: 0.25rem; +} + +.example-image { + height: 70%; + margin: 0.8rem; + border-radius: 2px; + position: relative; +} + +.canvas-area { + height: calc(100% - 1.5rem); + margin: 0.25rem; + display: flex; + justify-content: center; +} + +.canvas { + height: 100%; + position: relative; + border-radius: 5%; +} + +.loading-camera-message { + position: absolute; + display: flex; + align-self: center; +} + +.delete-button { + position: absolute; + top: 0.125rem; + right: 0.125rem; + z-index: auto; +} + +.input-field { + height: 1.3rem; + padding: 0 0.75rem; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 0.625rem; + font-weight: bold; + color: hsla(225, 15%, 40%, 1); + border-width: 1px; + border-style: solid; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 2rem; + outline: none; + cursor: text; + transition: 0.25s ease-out; + box-shadow: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; +} + +.activity-area { + height: 300px; + background-color: $motion-light-transparent; + display: flex; + justify-content: center; + align-items: center; + padding: .5rem; +} + +.button-row { + font-weight: bolder; + text-align: center; + display: flex; +} + +.button-row button { + padding: 0.6rem 0.75rem; + border-radius: 0.5rem; + background: $motion-primary; + color: white; + font-weight: 600; + font-size: 0.85rem; + margin: 0.25rem; + border: none; + cursor: pointer; + display: flex; + align-items: center; +} + +.bottom-area { + background-color: $ui-white; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 1rem; + padding-bottom: .75rem; + padding-left: .75rem; + padding-right: .75rem; +} + +.bottom-area .bottom-area-item+.bottom-area-item { + margin-top: 1rem; +} + +.instructions { + text-align: center; + height: 1.5rem; +} \ No newline at end of file diff --git a/packages/scratch-gui/src/components/connection-modal/model-editor.jsx b/packages/scratch-gui/src/components/connection-modal/model-editor.jsx new file mode 100644 index 000000000..024e54929 --- /dev/null +++ b/packages/scratch-gui/src/components/connection-modal/model-editor.jsx @@ -0,0 +1,51 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import React from 'react'; +import classNames from 'classnames'; + +import Box from '../box/box.jsx'; +import LabelTile from './label-tile.jsx'; +import Dots from './dots.jsx'; + +import radarIcon from './icons/searching.png'; +import refreshIcon from './icons/refresh.svg'; + +import styles from './ml-modal.css'; + +const ModelEditor = props => ( + + +
+ {Object.keys(props.imageData).map(label => ( //create column of label tiles + + ))} +
+
+ + + + + + + +
+); + +ModelEditor.propTypes = { + onAddLabel: PropTypes.func, + onCancel: PropTypes.func, + onClearAll: PropTypes.func, + onDeleteLabel: PropTypes.func, + onEditLabel: PropTypes.func, + classifierData: PropTypes.object, + imageData: PropTypes.object +}; + +export default ModelEditor; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/gui/blue-progress-bar.svg b/packages/scratch-gui/src/components/gui/blue-progress-bar.svg new file mode 100644 index 000000000..ebcc2bb82 --- /dev/null +++ b/packages/scratch-gui/src/components/gui/blue-progress-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/gui/circles-loader.svg b/packages/scratch-gui/src/components/gui/circles-loader.svg new file mode 100644 index 000000000..2444714af --- /dev/null +++ b/packages/scratch-gui/src/components/gui/circles-loader.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/scratch-gui/src/components/gui/gui.jsx b/packages/scratch-gui/src/components/gui/gui.jsx index a46c960f0..10d6eb868 100644 --- a/packages/scratch-gui/src/components/gui/gui.jsx +++ b/packages/scratch-gui/src/components/gui/gui.jsx @@ -12,9 +12,9 @@ import Renderer from 'scratch-render'; import Blocks from '../../containers/blocks.jsx'; import CostumeTab from '../../containers/costume-tab.jsx'; -import ModelsTab from '../../containers/models-tab.jsx'; import TargetPane from '../../containers/target-pane.jsx'; import SoundTab from '../../containers/sound-tab.jsx'; +import ProgressTab from '../../containers/progress-tab.jsx'; import StageWrapper from '../../containers/stage-wrapper.jsx'; import Loader from '../loader/loader.jsx'; import Box from '../box/box.jsx'; @@ -31,6 +31,8 @@ import Alerts from '../../containers/alerts.jsx'; import DragLayer from '../../containers/drag-layer.jsx'; import ConnectionModal from '../../containers/connection-modal.jsx'; import TelemetryModal from '../telemetry-modal/telemetry-modal.jsx'; +import TextModelModal from '../../containers/model-modal.jsx'; +import ClassifierModelModal from '../../containers/classifier-model-modal.jsx' import layout, {STAGE_SIZE_MODES} from '../../lib/layout-constants'; import {resolveStageSize} from '../../lib/screen-utils'; @@ -40,7 +42,7 @@ import addExtensionIcon from './icon--extensions.svg'; import codeIcon from './icon--code.svg'; import costumesIcon from './icon--costumes.svg'; import soundsIcon from './icon--sounds.svg'; -import modelsIcon from './icon--sounds.svg'; +import progressIcon from './blue-progress-bar.svg'; const messages = defineMessages({ addExtension: { @@ -90,7 +92,6 @@ const GUIComponent = props => { isShared, loading, logo, - modelsTabVisible, renderLogin, onClickAccountNav, onCloseAccountNav, @@ -99,7 +100,7 @@ const GUIComponent = props => { onToggleLoginOpen, onActivateCostumesTab, onActivateSoundsTab, - onActivateModelsTab, + onActivateProgressTab, onActivateTab, onClickLogo, onExtensionButtonClick, @@ -114,10 +115,13 @@ const GUIComponent = props => { onTelemetryModalOptOut, showComingSoon, soundsTabVisible, + progressTabVisible, stageSizeMode, targetIsStage, telemetryModalVisible, tipsLibraryVisible, + textModelModalVisible, + classifierModelModalVisible, vm, ...componentProps } = omit(props, 'dispatch'); @@ -180,6 +184,16 @@ const GUIComponent = props => { {tipsLibraryVisible ? ( ) : null} + {textModelModalVisible ? ( + + ) : null} + {classifierModelModalVisible ? ( + + ) : null} {cardsVisible ? ( ) : null} @@ -291,6 +305,22 @@ const GUIComponent = props => { id="gui.gui.soundsTab" /> + {/* Commenting out Text Classifier Auxiliary UI per ProjectSTEM's request - Parker, 12/9/22 + + + + + */} {/* { {soundsTabVisible ? : null} + {/* + + {progressTabVisible ? : null} + + */} {/**/} {/* {modelsTabVisible ? : null}*/} {/**/} @@ -408,6 +443,7 @@ GUIComponent.propTypes = { logo: PropTypes.string, onActivateCostumesTab: PropTypes.func, onActivateSoundsTab: PropTypes.func, + onActivateProgressTab: PropTypes.func, onActivateTab: PropTypes.func, onClickAccountNav: PropTypes.func, onClickLogo: PropTypes.func, @@ -428,10 +464,13 @@ GUIComponent.propTypes = { renderLogin: PropTypes.func, showComingSoon: PropTypes.bool, soundsTabVisible: PropTypes.bool, + progressTabVisible: PropTypes.bool, stageSizeMode: PropTypes.oneOf(Object.keys(STAGE_SIZE_MODES)), targetIsStage: PropTypes.bool, telemetryModalVisible: PropTypes.bool, tipsLibraryVisible: PropTypes.bool, + textModelModalVisible: PropTypes.bool, + classifierModelModalVisible: PropTypes.bool, vm: PropTypes.instanceOf(VM).isRequired }; GUIComponent.defaultProps = { @@ -461,5 +500,5 @@ const mapStateToProps = state => ({ }); export default injectIntl(connect( -)(GUIComponent)); mapStateToProps +)(GUIComponent)); diff --git a/packages/scratch-gui/src/components/gui/progress--icon.svg b/packages/scratch-gui/src/components/gui/progress--icon.svg new file mode 100644 index 000000000..dad2cb28a --- /dev/null +++ b/packages/scratch-gui/src/components/gui/progress--icon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx index b10d22482..32b7715e9 100644 --- a/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx +++ b/packages/scratch-gui/src/components/menu-bar/menu-bar.jsx @@ -595,6 +595,24 @@ Then, after clicking 'OK', you'll be prompted to select the folder to save to.`; {newProjectMessage} + + { + this.props.vm.sendLastClipToGfy(); + }} + > + Upload Clip to Gfycat + + { + this.props.vm.loadLastClipOnGfy(); + }} + > + Load Last Uploaded Clip + + {(this.props.canSave || this.props.canCreateCopy || this.props.canRemix) && ( {this.props.canSave && ( @@ -758,6 +776,44 @@ Then, after clicking 'OK', you'll be prompted to select the folder to save to.`;
+ {/** Commenting out Text Classifier Auxiliary UI per ProjectSTEM's request - Parker, 12/9/22 + + + Text Classifier Tutorial + + + + Progress Tab Doc + + {this.props.showTutorials ? ( +
+ +
+ + +
+
) : + null + } + */} ({percentage: prevState.percentage + 20})); + this.setState({ + improvements: this.state.improvements.push('You have two text classifier classes so far. Try to see if you can add more.') + }); + this.handleListUpdate('Two text classifier classes'); + } else if (keys.length > 2) { + this.setState(prevState => ({percentage: prevState.percentage + 30})); + this.handleListUpdate('Three or more text classifier classes'); + } else { + this.setState({ + improvements: this.state.improvements.push('Try adding some text classifier classes with the \'Edit Model\' button to increase your progress.') + }); + } + + if (imageKeys.length == 2) { + this.setState(prevState => ({percentage: prevState.percentage + 10})); + this.setState({ + improvements: this.state.improvements.push('You have two image classifier classes so far. Try to see if you can add more.') + }); + this.handleListUpdate('Two image classifier classes'); + } else if (imageKeys.length > 2) { + this.setState(prevState => ({percentage: prevState.percentage + 20})); + this.handleListUpdate('Three or more image classifier classes'); + // } else { + // this.setState({ + // improvements: this.state.improvements.push('Try adding some classes in Teachable Machine to increase your progress.') + // }); + } + + } + + atLeastFive (keys) { + let minimum = false; + for (const label in keys) { + if (keys[label].length < 5) { + minimum = true; + } + } + + if (minimum === true) { + if (this.state.percentage - 15 <= 0) { + this.setState({percentage: 0}); + } else { + this.setState(prevState => ({percentage: prevState.percentage - 15})); + } + this.setState({ + improvements: this.state.improvements.push('You need at least 5 examples per class to have an accurate classifier.') + }); + } else if (Object.keys(keys).length > 0) { + this.handleListUpdate('At least five examples per text classifier class'); + this.setState(prevState => ({percentage: prevState.percentage + 15})); + } + } + + balancedClasses (keys) { + let classNumbers = []; + let minimum = false; + for (const label in keys) { + let count = 0; + for (const _ in keys[label]) { + count = count + 1; + } + if (keys[label].length < 5) { + minimum = true; + } + classNumbers.push(count); + } + + classNumbers.sort(); + if (classNumbers.length > 1) { + if (classNumbers[classNumbers.length - 1] - classNumbers[0] > 3) { + if (this.state.percentage - 10 <= 0) { + this.setState({percentage: 0}); + } else { + this.setState(prevState => ({percentage: prevState.percentage - 10})); + } + this.setState({ + improvements: this.state.improvements.push('Try making the number of examples per class be the same.') + }); + } else { + if (minimum === false) { + this.setState(prevState => ({ percentage: prevState.percentage + 10 })); + this.handleListUpdate('Text classifier classes are balanced'); + } + // this.setState({ + // compliments: this.state.compliments.push('Your examples in your classes are balanced well. ') + // }); + } + } + } + + analyzeBlocks (blocks) { + let count = 0; + const parents = []; + let sensing = 0; + let answer = 0; + let teachable_machine = 0; + let usedEmbeddedConditionals = false; + + // go through all of the blocks + for (const block in blocks) { + if (blocks[block].opcode.includes('textClassification')) { + count = count + 1; + } + if (blocks[block].opcode.includes('control_if')) { + parents.push(blocks[block].id); + } + + if (blocks[block].opcode.includes('sensing_askandwait')) { + sensing = sensing + 1; + } + + if (blocks[block].opcode.includes('sensing_answer')) { + answer = answer + 1; + } + + if (blocks[block].opcode.includes('teachableMachine')) { + teachable_machine = teachable_machine + 1; + } + } + + // check if sensing and answer matches + if (sensing !== 0 && answer === 0) { + this.setState(prevState => ({percentage: prevState.percentage - 15})); + this.setState({ + improvements: this.state.improvements.push("It seems like you're not using the same type of answer and asking blocks.") + }); + } + + // check if there is an embedded + for (const block in blocks) { + if (blocks[block].opcode.includes('control_if')) { + if (parents.includes(blocks[block].parent)) { + usedEmbeddedConditionals = true; + } + } + } + + // if not an embedded + if (!usedEmbeddedConditionals) { + this.setState({ + improvements: this.state.improvements.push('Try embedding conditionals to make your code more complex.') + }); + } else { + this.handleListUpdate('Using embedded conditionals'); + this.setState(prevState => ({percentage: prevState.percentage + 15})); + } + + // if using teachable machine + if (teachable_machine > 0) { + this.setState(prevState => ({percentage: prevState.percentage + 10 })); + this.handleListUpdate('Good use of image classification blocks'); + } + + // check how many text classification blocks there are + if (count === 2) { + this.setState(prevState => ({percentage: prevState.percentage + 10})); + this.handleListUpdate('Using two text classification blocks'); + this.setState({ + improvements: this.state.improvements.push('Try adding a variety of text classification blocks to increase your progress') + }); + } else if (count === 3) { + this.setState(prevState => ({percentage: prevState.percentage + 20})); + this.handleListUpdate('Using three text classification blocks'); + this.setState({ + improvements: this.state.improvements.push('Try adding a variety of text classification blocks to increase your progress') + }); + } else if (count > 3) { + this.setState(prevState => ({percentage: prevState.percentage + 30})); + this.handleListUpdate('Using at least four text classification blocks'); + } else { + this.setState({ + improvements: this.state.improvements.push('Try adding a variety of text classification blocks to increase your progress') + }); + } + } + + + // ICON: https://www.vexels.com/png-svg/preview/127207/blue-progress-bar-line-icon-svg + + render() { + return ( + + +
+
+

AI Progress bar

+

{this.state.percentage}%

+ +
+
+
+

What You Have Done Well

+ {Object.keys(this.state.compliments).map(key =>
  • {key}
  • )} +
    +
    +

    Improvements You Can Make

    + {this.state.improvements.map((txt, index) =>
  • {txt}
  • )} +
    +
    +
    +
    + ) + } + } + + const ProgressBar = (props) => { + return ( +
    + +
    + ) + } + + const Filler = (props) => { + return
    + } + +export default ProgressBarExample; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/progress-bar/progress-styles.css b/packages/scratch-gui/src/components/progress-bar/progress-styles.css new file mode 100644 index 000000000..00b330bcd --- /dev/null +++ b/packages/scratch-gui/src/components/progress-bar/progress-styles.css @@ -0,0 +1,66 @@ +@import url('https://fonts.googleapis.com/css?family=Montserrat'); + +html, body { + font-family: 'Montserrat', sans-serif; +} + +.progressbar { + position: relative; + height: 40px; + width: 100%; + border-radius: 20px; + border: 2px solid #333; +} + +.filler { + background: #5094fc; + height: 100%; + border-radius: inherit; + transition: width .2s ease-in; +} + +.progresslocation { + display: flex; + flex-direction: column; + margin-left: auto; + margin-right: auto; + width: 70%; + height: 100%; + text-align: center; + padding: 10px; +} + +.progressGoodMessages { + display: flex; + flex-direction: row; + justify-content: space-around; + +} + +.progressCompletedText { + color:black; + font-weight: bold; +} + +.progressNotComplete { + color:black; + opacity: .5; +} + +.progressUnderline { + text-decoration: underline; +} + +.progressBorderBox { + border: 2px dashed black; + background-color: rgba(80, 148, 252, 0.3); + border-radius: 4px; + padding: 15px; + margin: 10px; + box-shadow: 3px 3px 5px 6px rgb(0, 0, 0, .2); + +} + +.progressBarBox { + padding: 20px; +} \ No newline at end of file diff --git a/packages/scratch-gui/src/components/stage/stage.jsx b/packages/scratch-gui/src/components/stage/stage.jsx index 28e65dee9..cf81f4ec2 100644 --- a/packages/scratch-gui/src/components/stage/stage.jsx +++ b/packages/scratch-gui/src/components/stage/stage.jsx @@ -2,7 +2,6 @@ import PropTypes from 'prop-types'; import React from 'react'; import classNames from 'classnames'; -var aframe = require("aframe"); import Box from '../box/box.jsx'; import DOMElementRenderer from '../../containers/dom-element-renderer.jsx'; import Loupe from '../loupe/loupe.jsx'; @@ -15,154 +14,6 @@ import {STAGE_DISPLAY_SIZES} from '../../lib/layout-constants.js'; import {getStageDimensions} from '../../lib/screen-utils.js'; import styles from './stage.css'; -const LoopMode = { - once: THREE.LoopOnce, - repeat: THREE.LoopRepeat, - pingpong: THREE.LoopPingPong -}; - -/** - * animation-mixer - * - * Player for animation clips. Intended to be compatible with any model format that supports - * skeletal or morph animations through THREE.AnimationMixer. - * See: https://threejs.org/docs/?q=animation#Reference/Animation/AnimationMixer - */ -aframe.registerComponent('animation-mixer', { - schema: { - clip: {default: '*'}, - duration: {default: 0}, - clampWhenFinished: {default: false, type: 'boolean'}, - crossFadeDuration: {default: 0}, - loop: {default: 'repeat', oneOf: Object.keys(LoopMode)}, - repetitions: {default: Infinity, min: 0}, - timeScale: {default: 1} - }, - - init: function () { - /** @type {THREE.Mesh} */ - this.model = null; - /** @type {THREE.AnimationMixer} */ - this.mixer = null; - /** @type {Array} */ - this.activeActions = []; - - const model = this.el.getObject3D('mesh'); - - if (model) { - this.load(model); - } else { - this.el.addEventListener('model-loaded', (e) => { - this.load(e.detail.model); - }); - } - }, - - load: function (model) { - const el = this.el; - this.model = model; - this.mixer = new THREE.AnimationMixer(model); - this.mixer.addEventListener('loop', (e) => { - el.emit('animation-loop', {action: e.action, loopDelta: e.loopDelta}); - }); - this.mixer.addEventListener('finished', (e) => { - el.emit('animation-finished', {action: e.action, direction: e.direction}); - }); - if (this.data.clip) this.update({}); - }, - - remove: function () { - if (this.mixer) this.mixer.stopAllAction(); - }, - - update: function (prevData) { - if (!prevData) return; - - const data = this.data; - const changes = AFRAME.utils.diff(data, prevData); - - // If selected clips have changed, restart animation. - if ('clip' in changes) { - this.stopAction(); - if (data.clip) this.playAction(); - return; - } - - // Otherwise, modify running actions. - this.activeActions.forEach((action) => { - if ('duration' in changes && data.duration) { - action.setDuration(data.duration); - } - if ('clampWhenFinished' in changes) { - action.clampWhenFinished = data.clampWhenFinished; - } - if ('loop' in changes || 'repetitions' in changes) { - action.setLoop(LoopMode[data.loop], data.repetitions); - } - if ('timeScale' in changes) { - action.setEffectiveTimeScale(data.timeScale); - } - }); - }, - - stopAction: function () { - const data = this.data; - for (let i = 0; i < this.activeActions.length; i++) { - data.crossFadeDuration - ? this.activeActions[i].fadeOut(data.crossFadeDuration) - : this.activeActions[i].stop(); - } - this.activeActions.length = 0; - }, - - playAction: function () { - if (!this.mixer) return; - - const model = this.model, - data = this.data, - clips = model.animations || (model.geometry || {}).animations || []; - - if (!clips.length) return; - - const re = wildcardToRegExp(data.clip); - - for (let clip, i = 0; (clip = clips[i]); i++) { - if (clip.name.match(re)) { - const action = this.mixer.clipAction(clip, model); - action.enabled = true; - action.clampWhenFinished = data.clampWhenFinished; - if (data.duration) action.setDuration(data.duration); - if (data.timeScale !== 1) action.setEffectiveTimeScale(data.timeScale); - action - .setLoop(LoopMode[data.loop], data.repetitions) - .fadeIn(data.crossFadeDuration) - .play(); - this.activeActions.push(action); - } - } - }, - - tick: function (t, dt) { - if (this.mixer && !isNaN(dt)) this.mixer.update(dt / 1000); - } -}); - -/** - * Creates a RegExp from the given string, converting asterisks to .* expressions, - * and escaping all other characters. - */ -function wildcardToRegExp (s) { - return new RegExp('^' + s.split(/\*+/).map(regExpEscape).join('.*') + '$'); -} - -/** - * RegExp-escapes all characters in the given string. - */ -function regExpEscape (s) { - return s.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); -} - - const StageComponent = props => { const { canvas, @@ -173,7 +24,6 @@ const StageComponent = props => { colorInfo, micIndicator, question, - avatarVisible, stageSize, useEditorDragStyle, onDeactivateColorPicker, @@ -208,76 +58,15 @@ const StageComponent = props => { width: stageDimensions.width }} > -
    - -
    - { - avatarVisible && - - - - - - - - - - - - - - - - - - } + - {/**/} - {/**/} ( + +
    + {Array(props.total).fill(0) + .map((_, i) => { + let type = 'inactive'; + if (props.counter === i) type = 'active'; + if (props.success) type = 'success'; + if (props.error) type = 'error'; + return (); + })} +
    +
    +); + +Dots.propTypes = { + className: PropTypes.string, + counter: PropTypes.number, + error: PropTypes.bool, + success: PropTypes.bool, + total: PropTypes.number +}; + +const Dot = props => ( +
    +); + +Dot.propTypes = { + type: PropTypes.string +}; + +export default Dots; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/example-tile.jsx b/packages/scratch-gui/src/components/text-model-modal/example-tile.jsx new file mode 100644 index 000000000..308500456 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/example-tile.jsx @@ -0,0 +1,49 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import Box from '../box/box.jsx'; +import CloseButton from '../close-button/close-button.jsx'; + +import styles from './model-modal.css'; + +class ExampleTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleDeleteExample' + ]); + } + handleDeleteExample () { + this.props.onDeleteExample(this.props.label, this.props.id); + } + + + render () { + return ( +
    + {this.props.closeButton ? + <> + {this.props.text} + + + : +
    {this.props.text}
    } +
    + ); + } +} + +ExampleTile.propTypes = { + label: PropTypes.string, + text: PropTypes.string, + onDeleteExample: PropTypes.func, + closeButton: PropTypes.bool +}; + +export default ExampleTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/icon--close.svg b/packages/scratch-gui/src/components/text-model-modal/icon--close.svg new file mode 100644 index 000000000..73c7b929f --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/icon--close.svg @@ -0,0 +1,18 @@ + + + + Extensions/Connection/Close + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/icon--enter.svg b/packages/scratch-gui/src/components/text-model-modal/icon--enter.svg new file mode 100644 index 000000000..03b7c0862 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/icon--enter.svg @@ -0,0 +1,18 @@ + + + + General/Check + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/icon--help.svg b/packages/scratch-gui/src/components/text-model-modal/icon--help.svg new file mode 100644 index 000000000..2938e8340 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/icon--help.svg @@ -0,0 +1,10 @@ + + + + help + Created with Sketch. + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/label-editor.jsx b/packages/scratch-gui/src/components/text-model-modal/label-editor.jsx new file mode 100644 index 000000000..3018a91b3 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/label-editor.jsx @@ -0,0 +1,103 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import keyMirror from 'keymirror'; + +import Box from '../box/box.jsx'; +import ExampleTile from './example-tile.jsx'; + +import styles from './model-modal.css'; + +class EditLabelTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleRenameLabel', + 'handleDeleteLabel', + 'handleNewExample', + 'handleInputForNewExample', + 'handleDoneEditLabel' + ]); + this.state = { + inputText: "" + }; + } + handleDoneEditLabel () { + console.log("Text Model Modal: done editing label " + this.props.labelName); + this.props.onDoneEditLabel(this.props.labelName); + } + handleRenameLabel (input) { //call props.onRenameLabel with the current active label and the value in the input field + if (this.props.labelName !== input.target.value) { + this.props.onRenameLabel(this.props.labelName, input.target.value); + } + } + handleDeleteLabel () { //call props.onDeleteLabel with this label name + this.props.onDeleteLabel(this.props.labelName); + } + handleNewExample () { //call props.onAddExample + let newExample = this.state.inputText; + this.setState({ + inputText: "" + }); + if (newExample != undefined && newExample != '') { + this.props.onNewExamples(this.props.labelName, [newExample]); + } + } + handleInputForNewExample (input) { //call props.onAddExample + this.setState({ + inputText: input.target.value + }); + + } + + render () { + return ( + + + + + + {" ("+this.props.exampleCount+" examples)"} + + + + + + {this.props.textData[this.props.labelName].map(example => ( + + + + ))} + + + + + + + + + + ); + } +} + +EditLabelTile.propTypes = { + labelName: PropTypes.string, + onRenameLabel: PropTypes.func, + onDeleteExample: PropTypes.func, + onDeleteLabel: PropTypes.func, + onNewExamples: PropTypes.func, + onDoneEditLabel: PropTypes.func, + textData: PropTypes.object, + exampleCount: PropTypes.number +}; + +export default EditLabelTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/label-tile.jsx b/packages/scratch-gui/src/components/text-model-modal/label-tile.jsx new file mode 100644 index 000000000..b5d9cb3bb --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/label-tile.jsx @@ -0,0 +1,66 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import keyMirror from 'keymirror'; + +import Box from '../box/box.jsx'; +import ExampleTile from './example-tile.jsx'; + +import styles from './model-modal.css'; + +class LabelTile extends React.Component { + constructor (props) { + super(props); + bindAll(this, [ + 'handleEditLabel' + ]); + this.state = { + inputText: "" + }; + } + handleEditLabel () { + console.log("Text Model Modal: edit label " + this.props.labelName); + this.props.onEditLabel(this.props.labelName); + } + + + render () { + return ( + + + + + {this.props.labelName} + {" ("+this.props.exampleCount+" examples)"} + + + + + {this.props.textData[this.props.labelName].map(example => ( + + + + ))} + + + + ); + } +} + +LabelTile.propTypes = { + labelName: PropTypes.string, + onEditLabel: PropTypes.func, + onNewExamples: PropTypes.func, + textData: PropTypes.object, + exampleCount: PropTypes.number +}; + +export default LabelTile; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/model-editor.jsx b/packages/scratch-gui/src/components/text-model-modal/model-editor.jsx new file mode 100644 index 000000000..e1993b042 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/model-editor.jsx @@ -0,0 +1,63 @@ +import {FormattedMessage} from 'react-intl'; +import PropTypes from 'prop-types'; +import React from 'react'; +import classNames from 'classnames'; +import keyMirror from 'keymirror'; + +import Box from '../box/box.jsx'; +import LabelTile from './label-tile.jsx'; +import EditLabelTile from './label-editor.jsx'; +import Dots from './dots.jsx'; + +import styles from './model-modal.css'; + +const ModelEditor = props => ( + + +
    + {Object.keys(props.textData).map(label => ( //create column of label tiles + label === props.activeLabel ? + : + ))} +
    +
    + + + + + + +
    +); + +ModelEditor.propTypes = { + onAddLabel: PropTypes.func, + onCancel: PropTypes.func, + onClearAll: PropTypes.func, + onDeleteLabel: PropTypes.func, + onDeleteExample: PropTypes.func, + onEditLabel: PropTypes.func, + onDoneEditLabel: PropTypes.func, + onRenameLabel: PropTypes.func, + onNewExamples: PropTypes.func, + classifierData: PropTypes.object, + activeLabel: PropTypes.string +}; + +export default ModelEditor; \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/model-modal.css b/packages/scratch-gui/src/components/text-model-modal/model-modal.css new file mode 100644 index 000000000..c38e3c287 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/model-modal.css @@ -0,0 +1,264 @@ +@import "../../css/colors.css"; +@import "../../css/units.css"; + +.modal-content { + width: 600px; +} + +.header { + background-color: $pen-primary; +} + +.body { + background: $ui-white; +} + +.centered-row { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + +.label-tile-pane { + overflow-y: auto; + width: 100%; + height: 100%; +} + +.label-tile { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + + background-color: $ui-white; + border-radius: 0.25rem; + padding: 10px; + width: 100%; + margin-bottom: 0.5rem; +} + +.label-tile-header { + display: flex; + align-items: center; + height: 2rem; + margin-left: 0.25rem; +} + +.label-tile-footer { + display: flex; + align-items: center; + height: 2rem; + margin-top: 0.5rem; +} + +.label-tile-name { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + font-size: 0.875rem; + margin-right: 1rem; +} + +.label-tile button { + margin:0.25rem; + + padding: 0.3rem 0.5rem; + + border: none; + border-radius: 0.25rem; + + font-weight: 600; + font-size: 0.85rem; + line-height:1rem; + + background: $motion-primary; + border: $motion-primary; + color: white; + cursor: pointer; +} + +.vertical-layout { + align-items: flex-start; + align-self: flex-start; + flex-direction: column; + height: 100%; + width: 100%; +} + +.example-box { + align-items: center; + display: flex; + flex-wrap: wrap; + height: calc(100% - 2rem); + width: calc(100% - 1rem); + margin-left:1.5rem; +} + +.example-viewer-text { + margin: 0.5rem 0.25rem; + height: 1.5rem; + justify-content: flex-start; +} + +.add-example-row { + position: relative; + margin:auto; + + border-width: 1px; + border-style: solid; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 0.25rem; +} + +.add-example-row input { + font-size: 0.85rem; + background-color: none; + + border-width: 0px; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 0.25rem; +} +.add-example-row button { + background-color: hsla(0, 0%, 0%, 0.35); + margin:0; +} + +.example-viewer-image-container { + display: flex; + overflow-y: auto; + flex-wrap: wrap; + height: calc(100% - 1.5rem); + margin-left: 1rem; +} + +.loaded-examples-box { + height: 50%; + width: 80%; + margin: 0.7rem; + position: relative; + display: flex; + align-items: center; + justify-content: center; + + background-color: $ui-white; + border-radius: 0.25rem; +} + +.example-text { + height: 70%; + max-width:200px; + margin: 0.2rem 0.8rem; + position: relative; + background-color: $motion-light-transparent; + + display: flex; + align-items: center; + + border-radius: 0.5rem; +} + + +.canvas-area { + height: calc(100% - 1.5rem); + margin: 0.25rem; + display: flex; + justify-content: center; +} + +.canvas { + height: 100%; + position: relative; + display: block; + padding: 0.6rem 0.35rem; +} + +.removable { + padding-right: 1.25rem; +} + +.loading-camera-message { + position: absolute; + display: flex; + align-self: center; +} + +.delete-button { + position: absolute; + top: 0.25rem; + right: 0.25rem; + z-index: auto; +} + +.input-field { + height: 1.3rem; + padding: 0 0.75rem; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 0.875rem; + font-weight: bold; + color: hsla(225, 15%, 40%, 1); + border-width: 1px; + border-style: solid; + border-color: hsla(0, 0%, 0%, 0.15); + border-radius: 0.25rem; + outline: none; + cursor: text; + transition: 0.25s ease-out; + box-shadow: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; +} + +.activity-area { + height: 300px; + background-color: $motion-light-transparent; + display: flex; + justify-content: center; + align-items: center; + padding: .5rem; +} + +.button-row { + font-weight: bolder; + text-align: center; + display: flex; +} + +.button-row button { + padding: 0.6rem 0.75rem; + border-radius: 0.5rem; + background: $motion-primary; + color: white; + font-weight: 600; + font-size: 0.85rem; + margin: 0.25rem; + border: none; + cursor: pointer; + display: flex; + align-items: center; +} + +.bottom-area { + background-color: $ui-white; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 1rem; + padding-bottom: .75rem; + padding-left: .75rem; + padding-right: .75rem; +} + +.bottom-area .bottom-area-item+.bottom-area-item { + margin-top: 1rem; +} + +.instructions { + text-align: center; + height: 1.5rem; +} \ No newline at end of file diff --git a/packages/scratch-gui/src/components/text-model-modal/model-modal.jsx b/packages/scratch-gui/src/components/text-model-modal/model-modal.jsx new file mode 100644 index 000000000..ced7ae4b4 --- /dev/null +++ b/packages/scratch-gui/src/components/text-model-modal/model-modal.jsx @@ -0,0 +1,48 @@ +import PropTypes from 'prop-types'; +import React from 'react'; + +import Box from '../box/box.jsx'; +import Modal from '../../containers/modal.jsx'; + +import ModelEditor from './model-editor.jsx'; + +import styles from './model-modal.css'; + +const TextModelModalComponent = props => ( + + + + + +); + +TextModelModalComponent.propTypes = { + name: PropTypes.node, + onCancel: PropTypes.func.isRequired, + onHelp: PropTypes.func.isRequired +}; + +export { + TextModelModalComponent as default +}; \ No newline at end of file diff --git a/packages/scratch-gui/src/containers/blocks.jsx b/packages/scratch-gui/src/containers/blocks.jsx index ce408c5ed..e5bfc0ecc 100644 --- a/packages/scratch-gui/src/containers/blocks.jsx +++ b/packages/scratch-gui/src/containers/blocks.jsx @@ -22,13 +22,14 @@ import defineDynamicBlock from '../lib/define-dynamic-block'; import {connect} from 'react-redux'; import {updateToolbox} from '../reducers/toolbox'; import {activateColorPicker} from '../reducers/color-picker'; -import {closeExtensionLibrary, openSoundRecorder, openConnectionModal} from '../reducers/modals'; +import {closeExtensionLibrary, openSoundRecorder, openConnectionModal, openTextModelModal,openClassifierModelModal} from '../reducers/modals'; import {activateCustomProcedures, deactivateCustomProcedures} from '../reducers/custom-procedures'; import {setConnectionModalExtensionId} from '../reducers/connection-modal'; import { activateTab, - SOUNDS_TAB_INDEX + SOUNDS_TAB_INDEX, + PROGRESS_TAB_INDEX } from '../reducers/editor-tab'; const addFunctionListener = (object, property, callback) => { @@ -107,18 +108,19 @@ class Blocks extends React.Component { const procButtonCallback = () => { this.ScratchBlocks.Procedures.createProcedureDefCallback_(this.workspace); }; + const textModelEditButtonCallback = () => { + this.props.onOpenTextModelModal(); + }; + const classifierModelEditButtonCallback = () => { + this.props.onOpenClassifierModelModal(); + } toolboxWorkspace.registerButtonCallback('MAKE_A_VARIABLE', varListButtonCallback('')); toolboxWorkspace.registerButtonCallback('MAKE_A_LIST', varListButtonCallback('list')); toolboxWorkspace.registerButtonCallback('MAKE_A_PROCEDURE', procButtonCallback); - toolboxWorkspace.registerButtonCallback('POSE_ENABLE_BODY', () => { - console.log("Enabling body pose tracking!"); - // TODO: store in VM runtime - }); - toolboxWorkspace.registerButtonCallback('POSE_ENABLE_HAND', () => { - console.log("Enabling hand pose tracking!"); - // TODO: store in VM runtime - }); + toolboxWorkspace.registerButtonCallback('EDIT_TEXT_MODEL', textModelEditButtonCallback); + toolboxWorkspace.registerButtonCallback('EDIT_TEXT_CLASSIFIER', classifierModelEditButtonCallback); + // Store the xml of the toolbox that is actually rendered. // This is used in componentDidUpdate instead of prevProps, because @@ -476,7 +478,7 @@ class Blocks extends React.Component { this.setState(p); } handleConnectionModalStart (extensionId) { - let prgCustomExtensions = ['teachableMachine', 'poseHand', 'poseFace', 'poseBody']; + let prgCustomExtensions = ['teachableMachine', 'poseHand', 'poseFace', 'poseBody', 'textClassification']; if (!prgCustomExtensions.includes(extensionId)) { this.props.onOpenConnectionModal(extensionId); } @@ -537,6 +539,8 @@ class Blocks extends React.Component { onActivateCustomProcedures, onRequestCloseExtensionLibrary, onRequestCloseCustomProcedures, + onOpenTextModelModal, + onOpenClassifierModelModal, toolboxXML, ...props } = this.props; @@ -593,6 +597,8 @@ Blocks.propTypes = { onActivateColorPicker: PropTypes.func, onActivateCustomProcedures: PropTypes.func, onOpenConnectionModal: PropTypes.func, + onOpenTextModelModal: PropTypes.func, + onOpenClassifierModelModal: PropTypes.func, onOpenSoundRecorder: PropTypes.func, onRequestCloseCustomProcedures: PropTypes.func, onRequestCloseExtensionLibrary: PropTypes.func, @@ -677,6 +683,12 @@ const mapDispatchToProps = dispatch => ({ dispatch(setConnectionModalExtensionId(id)); dispatch(openConnectionModal()); }, + onOpenTextModelModal: () => { + dispatch(openTextModelModal()); + }, + onOpenClassifierModelModal: () => { + dispatch(openClassifierModelModal()); + }, onOpenSoundRecorder: () => { dispatch(activateTab(SOUNDS_TAB_INDEX)); dispatch(openSoundRecorder()); diff --git a/packages/scratch-gui/src/containers/classifier-model-modal.jsx b/packages/scratch-gui/src/containers/classifier-model-modal.jsx new file mode 100644 index 000000000..89328c307 --- /dev/null +++ b/packages/scratch-gui/src/containers/classifier-model-modal.jsx @@ -0,0 +1,98 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import ClassifierModelModalComponent from '../components/classifier-modal/classifier-model-modal.jsx'; +import VM from 'scratch-vm'; +import {connect} from 'react-redux'; +import {closeClassifierModelModal} from '../reducers/modals'; +import {handleFileUpload} from '../lib/file-uploader.js'; +import {showStandardAlert} from '../reducers/alerts'; + + + +class ClassifierModelModal extends React.Component { + constructor (props) { + console.log("Loading Classifier Model Modal"); + super(props); + bindAll(this, [ + 'handleAddLabel', + 'handleCancel', + 'handleHelp', + 'handleFileUploader', + 'handleFileExport' + ]); + this.state = { + textData: props.vm.runtime.modelData.textData, //when the modal opens, get the model data and the next label number from the vm runtime + nextLabelNumber: props.vm.runtime.modelData.nextLabelNumber, + //classifiedData: props.vm.runtime.this.classifier.getClassifierDataset(), + activeLabel: "" //used by the label and example editors to keep track of the label currently being viewed/edited + }; + } + handleAddLabel () { //when a new label is first created, create a new active label and change to the example editor + console.log("Text Model Modal: add a label"); + // Make a new label + let newLabelName = "Class " + this.state.nextLabelNumber; + this.props.vm.runtime.emit('NEW_LABEL', newLabelName); + this.props.vm.runtime.modelData.nextLabelNumber++; + this.setState({ + nextLabelNumber: this.props.vm.runtime.modelData.nextLabelNumber, + activeLabel: newLabelName + }); + } + handleCancel () { //when modal closed, store the next label number in the runtime for later, then call props.onCancel() to close the modal + console.log("Text Model Modal: handle cancel") + //this.props.vm.runtime.emit('LOAD_CLASSIFIER', classifiedData); + this.setState({ + activeLabel: "" + }); + this.props.vm.runtime.emit('LOAD_CLASSIFIER'); + this.props.onCancel(); + } + handleHelp () { //TODO? + console.log("Text Model Modal: Help requested"); + //window.open(link, '_blank'); + } + handleFileUploader (input) { + console.log("Text Model Modal: Handle File upload"); + } + handleFileExport () { + console.log("Text Model Modal: Handle File export"); + this.props.vm.runtime.emit('EXPORT_CLASSIFIER'); + } + render () { + return ( + + + ); + } +} + +ClassifierModelModal.propTypes = { + onCancel: PropTypes.func.isRequired, + vm: PropTypes.instanceOf(VM).isRequired, +}; + +const mapStateToProps = state => ({ +}); + +const mapDispatchToProps = dispatch => ({ + onCancel: () => { + dispatch(closeClassifierModelModal()); + } +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ClassifierModelModal); \ No newline at end of file diff --git a/packages/scratch-gui/src/containers/connection-modal.jsx b/packages/scratch-gui/src/containers/connection-modal.jsx index aefbb7bb5..d542999bf 100644 --- a/packages/scratch-gui/src/containers/connection-modal.jsx +++ b/packages/scratch-gui/src/containers/connection-modal.jsx @@ -12,89 +12,96 @@ class ConnectionModal extends React.Component { constructor (props) { super(props); bindAll(this, [ - 'handleScanning', + 'handleEditModel', + 'handleAddLabel', + 'handleEditLabel', + 'handleRenameLabel', + 'handleDeleteLabel', + 'handleAddExamples', + 'handleNewExamples', + 'handleDeleteExample', + 'handleDeleteLoadedExamples', + 'handleClearAll', 'handleCancel', - 'handleConnected', - 'handleConnecting', - 'handleDisconnect', - 'handleError', 'handleHelp' ]); this.state = { extension: extensionData.find(ext => ext.extensionId === props.extensionId), - phase: props.vm.getPeripheralIsConnected(props.extensionId) ? - PHASES.connected : PHASES.scanning + phase: Object.keys(props.vm.runtime.modelData.imageData).length === 0 ? PHASES.exampleEditor : PHASES.modelEditor, + imageData: props.vm.runtime.modelData.imageData, //when the modal opens, get the model data and the next label number from the vm runtime + nextLabelNumber: props.vm.runtime.modelData.nextLabelNumber, + activeLabel: "Label " + props.vm.runtime.modelData.nextLabelNumber //used by the label and example editors to keep track of the label currently being viewed/edited + }; } - componentDidMount () { - this.props.vm.on('PERIPHERAL_CONNECTED', this.handleConnected); - this.props.vm.on('PERIPHERAL_REQUEST_ERROR', this.handleError); + handleEditModel () { //change to model editor + this.setState({ + phase: PHASES.modelEditor + }); } - componentWillUnmount () { - this.props.vm.removeListener('PERIPHERAL_CONNECTED', this.handleConnected); - this.props.vm.removeListener('PERIPHERAL_REQUEST_ERROR', this.handleError); + handleAddLabel () { //when a new label is first created, create a new active label and change to the example editor + this.setState({ + activeLabel: "Label " + this.state.nextLabelNumber, + phase: PHASES.exampleEditor + }); } - handleScanning () { + handleEditLabel (labelName) { //change to label editor, set active label based on which label's "edit" button was pressed this.setState({ - phase: PHASES.scanning + phase: PHASES.labelEditor, + activeLabel: labelName }); } - handleConnecting (peripheralId) { - this.props.vm.connectPeripheral(this.props.extensionId, peripheralId); + handleRenameLabel (labelName, newLabelName) { //rename a label: emit an event so the label changes in the vm, change active label accordingly, and reset model data with the new label name + this.props.vm.runtime.emit('RENAME_LABEL', labelName, newLabelName); this.setState({ - phase: PHASES.connecting + imageData: this.props.vm.runtime.modelData.imageData, + classifierData: this.props.vm.runtime.modelData.classifierData, + activeLabel: newLabelName }); - analytics.event({ - category: 'extensions', - action: 'connecting', - label: this.props.extensionId + } + handleDeleteLabel (labelName) { //delete a label: emit an event so the label is deleted in the vm, reset model data without the deleted label + this.props.vm.runtime.emit('DELETE_LABEL', labelName); + this.setState({ + imageData: this.props.vm.runtime.modelData.imageData }); } - handleDisconnect () { - try { - this.props.vm.disconnectPeripheral(this.props.extensionId); - } finally { - this.props.onCancel(); - } + handleAddExamples () { //change to example editor + this.setState({ + phase: PHASES.exampleEditor + }); } - handleCancel () { - try { - // If we're not connected to a peripheral, close the websocket so we stop scanning. - if (!this.props.vm.getPeripheralIsConnected(this.props.extensionId)) { - this.props.vm.disconnectPeripheral(this.props.extensionId); - } - } finally { - // Close the modal. - this.props.onCancel(); + handleNewExamples (examples, incrementLabelNum) { //add new examples: emit an event so the example is added in the vm, switch back to label editor, reset model data with the new example + this.props.vm.runtime.emit('NEW_EXAMPLES', examples, this.state.activeLabel); + if (incrementLabelNum) { + this.props.vm.runtime.modelData.nextLabelNumber++; } + this.setState({ + nextLabelNumber: incrementLabelNum ? ++this.state.nextLabelNumber : this.state.nextLabelNumber, + imageData: this.props.vm.runtime.modelData.imageData, + phase: PHASES.labelEditor + }); } - handleError () { - // Assume errors that come in during scanning phase are the result of not - // having scratch-link installed. - if (this.state.phase === PHASES.scanning || this.state.phase === PHASES.unavailable) { - this.setState({ - phase: PHASES.unavailable - }); - } else { - this.setState({ - phase: PHASES.error - }); - analytics.event({ - category: 'extensions', - action: 'connecting error', - label: this.props.extensionId - }); - } + handleDeleteExample (exampleNum) { + this.props.vm.runtime.emit('DELETE_EXAMPLE', this.state.activeLabel, exampleNum); + this.setState({ + imageData: this.props.vm.runtime.modelData.imageData + }) } - handleConnected () { + handleDeleteLoadedExamples () { + this.props.vm.runtime.emit('DELETE_LOADED_EXAMPLES', this.state.activeLabel); this.setState({ - phase: PHASES.connected - }); - analytics.event({ - category: 'extensions', - action: 'connected', - label: this.props.extensionId - }); + imageData: this.props.vm.runtime.modelData.imageData + }) + } + handleClearAll () { //clear all labels/examples: emit an event so the data is cleared in the vm, reset model data to be empty + this.props.vm.runtime.emit('CLEAR_ALL_LABELS'); + this.setState({ + imageData: this.props.vm.runtime.modelData.imageData + }) + } + handleCancel () { //when modal closed, store the next label number in the runtime for later, then call props.onCancel() to close the modal + this.props.vm.runtime.modelDatanextLabelNumber = this.state.nextLabelNumber; + this.props.onCancel(); } handleHelp () { window.open(this.state.extension.helpLink, '_blank'); @@ -107,22 +114,27 @@ class ConnectionModal extends React.Component { render () { return ( ); } diff --git a/packages/scratch-gui/src/containers/costume-tab.jsx b/packages/scratch-gui/src/containers/costume-tab.jsx index 6be2cf268..75e3e88e9 100644 --- a/packages/scratch-gui/src/containers/costume-tab.jsx +++ b/packages/scratch-gui/src/containers/costume-tab.jsx @@ -24,7 +24,8 @@ import { import { activateTab, - SOUNDS_TAB_INDEX + SOUNDS_TAB_INDEX, + PROGRESS_TAB_INDEX } from '../reducers/editor-tab'; import {setRestore} from '../reducers/restore-deletion'; @@ -241,6 +242,7 @@ class CostumeTab extends React.Component { }); } else if (dropInfo.dragType === DragConstants.BACKPACK_SOUND) { this.props.onActivateSoundsTab(); + this.props.onActivateProgressTab(); this.props.vm.addSound({ md5: dropInfo.payload.body, name: dropInfo.payload.name @@ -363,6 +365,7 @@ CostumeTab.propTypes = { intl: intlShape, isRtl: PropTypes.bool, onActivateSoundsTab: PropTypes.func.isRequired, + onActivateProgressTab: PropTypes.func.isRequired, onCloseImporting: PropTypes.func.isRequired, onNewCostumeFromCameraClick: PropTypes.func.isRequired, onNewLibraryBackdropClick: PropTypes.func.isRequired, @@ -397,6 +400,7 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ onActivateSoundsTab: () => dispatch(activateTab(SOUNDS_TAB_INDEX)), + onActivateProgressTab: () => dispatch(activateTab(PROGRESS_TAB_INDEX)), onNewLibraryBackdropClick: e => { e.preventDefault(); dispatch(openBackdropLibrary()); diff --git a/packages/scratch-gui/src/containers/gui.jsx b/packages/scratch-gui/src/containers/gui.jsx index fcf64920f..9bfa6f22c 100644 --- a/packages/scratch-gui/src/containers/gui.jsx +++ b/packages/scratch-gui/src/containers/gui.jsx @@ -16,7 +16,7 @@ import { BLOCKS_TAB_INDEX, COSTUMES_TAB_INDEX, SOUNDS_TAB_INDEX, - MODELS_TAB_INDEX + PROGRESS_TAB_INDEX } from '../reducers/editor-tab'; import { @@ -112,7 +112,10 @@ GUI.propTypes = { onVmInit: PropTypes.func, projectHost: PropTypes.string, projectId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - telemetryModalVisible: PropTypes.bool, + telemetryModalVisible: PropTypes.bool, + textModelModalVisible: PropTypes.bool, + classifierModelModalVisible: PropTypes.bool, + classifierModelModalVisible: PropTypes.bool, vm: PropTypes.instanceOf(VM).isRequired }; @@ -142,16 +145,20 @@ const mapStateToProps = state => { isRtl: state.locales.isRtl, isShowingProject: getIsShowingProject(loadingState), loadingStateVisible: state.scratchGui.modals.loadingProject, - modelsTabVisible: state.scratchGui.editorTab.activeTabIndex === MODELS_TAB_INDEX, projectId: state.scratchGui.projectState.projectId, soundsTabVisible: state.scratchGui.editorTab.activeTabIndex === SOUNDS_TAB_INDEX, + progressTabVisible: state.scratchGui.editorTab.activeTabIndex === PROGRESS_TAB_INDEX, targetIsStage: ( state.scratchGui.targets.stage && state.scratchGui.targets.stage.id === state.scratchGui.targets.editingTarget ), telemetryModalVisible: state.scratchGui.modals.telemetryModal, tipsLibraryVisible: state.scratchGui.modals.tipsLibrary, - vm: state.scratchGui.vm + textModelModalVisible: state.scratchGui.modals.textModelModal, + classifierModelModalVisible: state.scratchGui.modals.classifierModelModal, + vm: state.scratchGui.vm, + textModelModalVisible: state.scratchGui.modals.textModelModal, + classifierModelModalVisible: state.scratchGui.modals.classifierModelModal, }; }; @@ -160,7 +167,7 @@ const mapDispatchToProps = dispatch => ({ onActivateTab: tab => dispatch(activateTab(tab)), onActivateCostumesTab: () => dispatch(activateTab(COSTUMES_TAB_INDEX)), onActivateSoundsTab: () => dispatch(activateTab(SOUNDS_TAB_INDEX)), - onActivateModelsTab: () => dispatch(activateTab(MODELS_TAB_INDEX)), + onActivateProgressTab: () => dispatch(activateTab(PROGRESS_TAB_INDEX)), onRequestCloseBackdropLibrary: () => dispatch(closeBackdropLibrary()), onRequestCloseCostumeLibrary: () => dispatch(closeCostumeLibrary()), onRequestCloseTelemetryModal: () => dispatch(closeTelemetryModal()) diff --git a/packages/scratch-gui/src/containers/model-modal.jsx b/packages/scratch-gui/src/containers/model-modal.jsx new file mode 100644 index 000000000..168b558b1 --- /dev/null +++ b/packages/scratch-gui/src/containers/model-modal.jsx @@ -0,0 +1,141 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import bindAll from 'lodash.bindall'; +import TextModelModalComponent from '../components/text-model-modal/model-modal.jsx'; +import VM from 'scratch-vm'; +import {connect} from 'react-redux'; +import {closeTextModelModal} from '../reducers/modals'; + +class TextModelModal extends React.Component { + constructor (props) { + console.log("Loading Text Model Modal"); + super(props); + bindAll(this, [ + 'handleAddLabel', + 'handleEditLabel', + 'handleDoneEditLabel', + 'handleRenameLabel', + 'handleDeleteLabel', + 'handleNewExamples', + 'handleDeleteExample', + 'handleDeleteLoadedExamples', + 'handleClearAll', + 'handleCancel', + 'handleHelp', + ]); + this.state = { + textData: props.vm.runtime.modelData.textData, //when the modal opens, get the model data and the next label number from the vm runtime + nextLabelNumber: props.vm.runtime.modelData.nextLabelNumber, + //classifiedData: props.vm.runtime.this.classifier.getClassifierDataset(), + activeLabel: "" //used by the label and example editors to keep track of the label currently being viewed/edited + }; + } + handleAddLabel () { //when a new label is first created, create a new active label and change to the example editor + console.log("Text Model Modal: add a label"); + // Make a new label + let newLabelName = "Class " + this.state.nextLabelNumber; + this.props.vm.runtime.emit('NEW_LABEL', newLabelName); + this.props.vm.runtime.modelData.nextLabelNumber++; + this.setState({ + nextLabelNumber: this.props.vm.runtime.modelData.nextLabelNumber, + activeLabel: newLabelName + }); + } + handleEditLabel (labelName) { //change to label editor, set active label based on which label's "edit" button was pressed + console.log("Text Model Modal: edit label " + labelName); + this.setState({ + activeLabel: labelName + }); + } + handleDoneEditLabel (labelName) { //change to label editor, set active label based on which label's "edit" button was pressed + console.log("Text Model Modal: done editing label " + labelName); + this.setState({ + activeLabel: "" + }); + } + handleRenameLabel (labelName, newLabelName) { //rename a label: emit an event so the label changes in the vm, change active label accordingly, and reset model data with the new label name + console.log("Text Model Modal: rename label " + labelName + " to " + newLabelName); + this.props.vm.runtime.emit('RENAME_LABEL', labelName, newLabelName); + this.setState({ + activeLabel: newLabelName + }); + } + handleDeleteLabel (labelName) { //delete a label: emit an event so the label is deleted in the vm, reset model data without the deleted label + console.log("Text Model Modal: delete label " + labelName); + this.props.vm.runtime.emit('DELETE_LABEL', labelName); + this.setState({}); + } + handleNewExamples (labelNum, examples) { //add new examples: emit an event so the example is added in the vm, switch back to label editor, reset model data with the new example + console.log("Text Model Modal: add examples from a new label") + this.props.vm.runtime.emit('NEW_EXAMPLES', examples, labelNum); + this.setState({ }); + } + handleDeleteExample (labelName, exampleNum) { + console.log("Text Model Modal: delete " + exampleNum + " from label " + labelName); + this.props.vm.runtime.emit('DELETE_EXAMPLE', labelName, exampleNum); + this.setState({ }); + } + handleDeleteLoadedExamples () { + console.log("Text Model Modal: delete examples") + this.props.vm.runtime.emit('DELETE_LOADED_EXAMPLES', labelName); + } + handleClearAll () { //clear all labels/examples: emit an event so the data is cleared in the vm, reset model data to be empty + console.log("Text Model Modal: clear all labels") + this.props.vm.runtime.emit('CLEAR_ALL_LABELS'); + this.setState({ }); + } + handleCancel () { //when modal closed, store the next label number in the runtime for later, then call props.onCancel() to close the modal + console.log("Text Model Modal: handle cancel") + this.props.vm.runtime.modelDatanextLabelNumber = this.state.nextLabelNumber; + this.setState({ + activeLabel: "" + }); + this.props.onCancel(); + } + handleHelp () { //TODO? + console.log("Text Model Modal: Help requested"); + //window.open(link, '_blank'); + } + render () { + return ( + + ); + } +} + +TextModelModal.propTypes = { + onCancel: PropTypes.func.isRequired, + vm: PropTypes.instanceOf(VM).isRequired +}; + +const mapStateToProps = state => ({ +}); + +const mapDispatchToProps = dispatch => ({ + onCancel: () => { + dispatch(closeTextModelModal()); + } +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TextModelModal); \ No newline at end of file diff --git a/packages/scratch-gui/src/containers/models-tab.jsx b/packages/scratch-gui/src/containers/models-tab.jsx deleted file mode 100644 index ae31430ad..000000000 --- a/packages/scratch-gui/src/containers/models-tab.jsx +++ /dev/null @@ -1,411 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import bindAll from 'lodash.bindall'; -import {defineMessages, intlShape, injectIntl} from 'react-intl'; -import VM from 'scratch-vm'; - -import AssetPanel from '../components/asset-panel/asset-panel.jsx'; -import PaintEditorWrapper from './paint-editor-wrapper.jsx'; -import CameraModal from './camera-modal.jsx'; -import {connect} from 'react-redux'; -import {handleFileUpload, costumeUpload} from '../lib/file-uploader.js'; -import errorBoundaryHOC from '../lib/error-boundary-hoc.jsx'; -import DragConstants from '../lib/drag-constants'; -import {emptyCostume} from '../lib/empty-assets'; -import sharedMessages from '../lib/shared-messages'; -import downloadBlob from '../lib/download-blob'; - -import { - closeCameraCapture, - openCameraCapture, - openCostumeLibrary, - openBackdropLibrary -} from '../reducers/modals'; - -import { - activateTab, - SOUNDS_TAB_INDEX -} from '../reducers/editor-tab'; - -import {setRestore} from '../reducers/restore-deletion'; -import {showStandardAlert, closeAlertWithId} from '../reducers/alerts'; - -import addLibraryBackdropIcon from '../components/asset-panel/icon--add-backdrop-lib.svg'; -import addLibraryCostumeIcon from '../components/asset-panel/icon--add-costume-lib.svg'; -import fileUploadIcon from '../components/action-menu/icon--file-upload.svg'; -import paintIcon from '../components/action-menu/icon--paint.svg'; -import cameraIcon from '../components/action-menu/icon--camera.svg'; -import surpriseIcon from '../components/action-menu/icon--surprise.svg'; -import searchIcon from '../components/action-menu/icon--search.svg'; - -import costumeLibraryContent from '../lib/libraries/costumes.json'; -import backdropLibraryContent from '../lib/libraries/backdrops.json'; - -let messages = defineMessages({ - addLibraryBackdropMsg: { - defaultMessage: 'Choose a Backdrop', - description: 'Button to add a backdrop in the editor tab', - id: 'gui.modelsTab.addBackdropFromLibrary' - }, - addLibraryCostumeMsg: { - defaultMessage: 'Choose a Costume', - description: 'Button to add a costume in the editor tab', - id: 'gui.modelsTab.addCostumeFromLibrary' - }, - addBlankCostumeMsg: { - defaultMessage: 'Paint', - description: 'Button to add a blank costume in the editor tab', - id: 'gui.modelsTab.addBlankCostume' - }, - addSurpriseCostumeMsg: { - defaultMessage: 'Surprise', - description: 'Button to add a surprise costume in the editor tab', - id: 'gui.modelsTab.addSurpriseCostume' - }, - addFileBackdropMsg: { - defaultMessage: 'Upload Backdrop', - description: 'Button to add a backdrop by uploading a file in the editor tab', - id: 'gui.modelsTab.addFileBackdrop' - }, - addFileCostumeMsg: { - defaultMessage: 'Upload Costume', - description: 'Button to add a costume by uploading a file in the editor tab', - id: 'gui.modelsTab.addFileCostume' - }, - addCameraCostumeMsg: { - defaultMessage: 'Camera', - description: 'Button to use the camera to create a costume costume in the editor tab', - id: 'gui.modelsTab.addCameraCostume' - } -}); - -messages = {...messages, ...sharedMessages}; - -class ModelsTab extends React.Component { - constructor (props) { - super(props); - bindAll(this, [ - 'handleSelectCostume', - 'handleDeleteCostume', - 'handleDuplicateCostume', - 'handleExportCostume', - 'handleNewCostume', - 'handleNewBlankCostume', - 'handleSurpriseCostume', - 'handleSurpriseBackdrop', - 'handleFileUploadClick', - 'handleCostumeUpload', - 'handleCameraBuffer', - 'handleDrop', - 'setFileInput' - ]); - const { - editingTarget, - sprites, - stage - } = props; - const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage; - if (target && target.currentCostume) { - this.state = {selectedCostumeIndex: target.currentCostume}; - } else { - this.state = {selectedCostumeIndex: 0}; - } - } - componentWillReceiveProps (nextProps) { - const { - editingTarget, - sprites, - stage - } = nextProps; - - const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage; - if (!target || !target.costumes) { - return; - } - - if (this.props.editingTarget === editingTarget) { - // If costumes have been added or removed, change costumes to the editing target's - // current costume. - const oldTarget = this.props.sprites[editingTarget] ? - this.props.sprites[editingTarget] : this.props.stage; - // @todo: Find and switch to the index of the costume that is new. This is blocked by - // https://github.com/LLK/scratch-vm/issues/967 - // Right now, you can land on the wrong costume if a costume changing script is running. - if (oldTarget.costumeCount !== target.costumeCount) { - this.setState({selectedCostumeIndex: target.currentCostume}); - } - } else { - // If switching editing targets, update the costume index - this.setState({selectedCostumeIndex: target.currentCostume}); - } - } - handleSelectCostume (costumeIndex) { - this.props.vm.editingTarget.setCostume(costumeIndex); - this.setState({selectedCostumeIndex: costumeIndex}); - } - handleDeleteCostume(costumeIndex) { - const restoreCostumeFun = this.props.vm.deleteCostume(costumeIndex); - this.props.dispatchUpdateRestore({ - restoreFun: restoreCostumeFun, - deletedItem: 'Costume' - }); - } - handleDuplicateCostume (costumeIndex) { - this.props.vm.duplicateCostume(costumeIndex); - } - handleExportCostume (costumeIndex) { - const item = this.props.vm.editingTarget.sprite.costumes[costumeIndex]; - const blob = new Blob([item.asset.data], {type: item.asset.assetType.contentType}); - downloadBlob(`${item.name}.${item.asset.dataFormat}`, blob); - } - handleNewCostume (costume, fromCostumeLibrary) { - const costumes = Array.isArray(costume) ? costume : [costume]; - - return Promise.all(costumes.map(c => { - if (fromCostumeLibrary) { - return this.props.vm.addCostumeFromLibrary(c.md5, c); - } - return this.props.vm.addCostume(c.md5, c); - })); - } - handleNewBlankCostume () { - const name = this.props.vm.editingTarget.isStage ? - this.props.intl.formatMessage(messages.backdrop, {index: 1}) : - this.props.intl.formatMessage(messages.costume, {index: 1}); - this.handleNewCostume(emptyCostume(name)); - } - handleSurpriseCostume () { - const item = costumeLibraryContent[Math.floor(Math.random() * costumeLibraryContent.length)]; - const split = item.md5.split('.'); - const type = split.length > 1 ? split[1] : null; - const rotationCenterX = type === 'svg' ? item.info[0] : item.info[0] / 2; - const rotationCenterY = type === 'svg' ? item.info[1] : item.info[1] / 2; - const vmCostume = { - name: item.name, - md5: item.md5, - rotationCenterX, - rotationCenterY, - bitmapResolution: item.info.length > 2 ? item.info[2] : 1, - skinId: null - }; - this.handleNewCostume(vmCostume, true /* fromCostumeLibrary */); - } - handleSurpriseBackdrop () { - const item = backdropLibraryContent[Math.floor(Math.random() * backdropLibraryContent.length)]; - const vmCostume = { - name: item.name, - md5: item.md5, - rotationCenterX: item.info[0] && item.info[0] / 2, - rotationCenterY: item.info[1] && item.info[1] / 2, - bitmapResolution: item.info.length > 2 ? item.info[2] : 1, - skinId: null - }; - this.handleNewCostume(vmCostume); - } - handleCostumeUpload (e) { - const storage = this.props.vm.runtime.storage; - this.props.onShowImporting(); - handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => { - costumeUpload(buffer, fileType, storage, vmCostumes => { - vmCostumes.forEach((costume, i) => { - costume.name = `${fileName}${i ? i + 1 : ''}`; - }); - this.handleNewCostume(vmCostumes).then(() => { - if (fileIndex === fileCount - 1) { - this.props.onCloseImporting(); - } - }); - }, this.props.onCloseImporting); - }, this.props.onCloseImporting); - } - handleCameraBuffer (buffer) { - const storage = this.props.vm.runtime.storage; - costumeUpload(buffer, 'image/png', storage, vmCostumes => { - vmCostumes[0].name = this.props.intl.formatMessage(messages.costume, {index: 1}); - this.handleNewCostume(vmCostumes); - }); - } - handleFileUploadClick () { - this.fileInput.click(); - } - handleDrop (dropInfo) { - } - setFileInput (input) { - this.fileInput = input; - } - formatCostumeDetails (size, optResolution) { - // If no resolution is given, assume that the costume is an SVG - const resolution = optResolution ? optResolution : 1; - // Convert size to stage units by dividing by resolution - // Round up width and height for scratch-flash compatibility - // https://github.com/LLK/scratch-flash/blob/9fbac92ef3d09ceca0c0782f8a08deaa79e4df69/src/ui/media/MediaInfo.as#L224-L237 - return `${Math.ceil(size[0] / resolution)} x ${Math.ceil(size[1] / resolution)}`; - } - render () { - const { - dispatchUpdateRestore, // eslint-disable-line no-unused-vars - intl, - isRtl, - onNewCostumeFromCameraClick, - onNewLibraryBackdropClick, - onNewLibraryCostumeClick, - cameraModalVisible, - onRequestCloseCameraModal, - vm - } = this.props; - - if (!vm.editingTarget) { - return null; - } - - const isStage = vm.editingTarget.isStage; - const target = vm.editingTarget.sprite; - - const addLibraryMessage = isStage ? messages.addLibraryBackdropMsg : messages.addLibraryCostumeMsg; - const addFileMessage = isStage ? messages.addFileBackdropMsg : messages.addFileCostumeMsg; - const addSurpriseFunc = isStage ? this.handleSurpriseBackdrop : this.handleSurpriseCostume; - const addLibraryFunc = isStage ? onNewLibraryBackdropClick : onNewLibraryCostumeClick; - const addLibraryIcon = isStage ? addLibraryBackdropIcon : addLibraryCostumeIcon; - - // TODO: Make this a list of models end-to-end! - const costumeData = target.costumes ? target.costumes.map(costume => ({ - name: 'cat detector', - asset: costume.asset, - details: '4 classes', //costume.size ? this.formatCostumeDetails(costume.size, costume.bitmapResolution) : null, - dragPayload: costume - })) : []; - return ( - 1 ? - this.handleDeleteCostume : null} - onDrop={this.handleDrop} - onDuplicateClick={this.handleDuplicateCostume} - onExportClick={this.handleExportCostume} - onItemClick={this.handleSelectCostume} - > - {target.costumes ? -